The three bundled episode profiles (business_analysis, solo_expert,
tech_discussion) shipped with language=null, which podcast_creator treats as
"unspecified" and defaults to English for outline/transcript generation
regardless of source language. Set language="de" on all three.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
esperanto's OllamaLanguageModel silently caps num_ctx at 8192 unless the
credential sets it explicitly, no matter what OLLAMA_CONTEXT_LENGTH or the
model's real context window is. Any chat context beyond that got truncated,
and because qwen3.5:27b is a thinking model, the truncated prompt usually
produced an empty final answer (swallowed by clean_thinking_content) rather
than a visible error - looked like "chat gives no answer" in the UI. Set
num_ctx=98304 on the Ollama chat credential: the largest value that still
keeps the whole model on GPU 1 (131072 spills onto CPU, 5-6x slower).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
qwen3-embedding (repurposed 8B LLM, ~13GB loaded) didn't fit on GPU 1
alongside the resident 17GB chat model, so Ollama silently ran it 44-56%
on CPU. A single embed call took 39-54s, so any real document's chunk
batches blew past esperanto's 60s embedding timeout and got stuck retrying
forever - looked like "adding the source failed" but extraction was fine.
Also note: credential num_ctx doesn't work for embeddings (esperanto sends
it at the wrong JSON level, Ollama ignores it) - a small dedicated
embedding model is the real fix, not context-window tuning.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
male_thorsten/female_kerstin come from Piper's openly-licensed German voice
models, not scraped real-person audio, to avoid cloning someone's voice
without consent. Speaker profiles now use distinct voices per speaker instead
of everyone defaulting to the owner's own cloned voice.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
tts_server.py now resolves `voice` against services/voices/*.wav (gitignored,
personal recordings) and clones via chatterbox's audio_prompt_path, falling
back to "default" (symlinked to ~/chatterbox-tts-cli/my_voice_deutsch_60s.wav)
for unknown names, or to the old built-in-voice-by-language-code behavior if
`voice` is a recognized language. All podcast speaker profiles now point at
voice_id "default" until distinct per-speaker reference clips are added.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Wraps the locally installed chatterbox-tts and faster-whisper packages in thin
FastAPI servers implementing OpenAI's audio API shape, since neither Ollama nor
OpenRouter support speech. Pinned to GPU 2 to avoid contending with Ollama's
resident models on GPU 1. Requires UFW rules for 8901/8902 (same pattern as
the existing 11434 rule) since UFW defaults to deny-incoming.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>