Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 14 additions & 11 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,17 +53,20 @@ only for diagnostics. Numbering matches the original review.

## Models

- [x] **faster-qwen3-tts (with diagnostic streaming).** TTFA on DGX Spark
567→280 ms (0.6B), 661→400 ms (1.7B) via CUDA graphs. The server retains
raw streaming chunks for diagnostics, but production VoIP uses the stable
whole-WAV endpoint:
`dgx/tts/server.py` adds `/v1/audio/speech/stream` via
`generate_voice_design_streaming` (same `Qwen3-TTS-12Hz-1.7B-VoiceDesign`
weights), alongside `/v1/audio/speech` for greeting and response sentences.
**On-box wire verification still pending** (DGX unreachable from dev box):
confirm streamed chunk sample-rate/dtype and the vLLM SSE `delta.tool_calls`
fragment shape, then replace the ASSUMPTION fixtures in `tests/test_tts.py`
and `tests/test_llm.py`. https://github.com/andimarafioti/faster-qwen3-tts
- [x] **faster-qwen3-tts (stable named clone production path).** Production
uses the private `shared-female-de-v1` profile with the pinned Qwen Base
clone runtime. Each response sentence uses stable `/v1/audio/speech`
whole-WAV synthesis at 24 kHz PCM16; diagnostic
`/v1/audio/speech/stream` remains outside the VoIP response path.
Cooperative cancellation now stops active synthesis between codec steps,
synchronizes CUDA before releasing the exclusive model lock, and lets the
following request proceed without waiting for the cancelled sentence.
GX10 verification on 2026-07-30 covered the image-build patch verifier,
healthy zero-restart deployment, authenticated stable WAV synthesis,
cancellation/recovery, and real GPU activity.
Raw diagnostic-stream wire shape and vLLM streamed `delta.tool_calls`
fragments remain unit-fixture assumptions; verify those paths live before
treating them as production-proven contracts.
- [ ] **Parakeet ASR: do NOT switch yet.** Qwen3-ASR already streams; the code
just uses it offline/batch. Parakeet-TDT v3 is also offline per NVIDIA NIM
docs. If NVIDIA is ever wanted, use Parakeet RNNT Multilingual (streaming) via
Expand Down
12 changes: 11 additions & 1 deletion agent/config.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"""Configuration management for VoIP agent."""

from pydantic import ConfigDict, field_validator, model_validator
from pydantic import ConfigDict, Field, IPvAnyAddress, field_validator, model_validator
from pydantic_settings import BaseSettings

_INSECURE_PASSWORDS = {"", "changeme"}
Expand All @@ -11,6 +11,16 @@ class Settings(BaseSettings):

model_config = ConfigDict(env_file=".env", case_sensitive=False)

# Compose reads this documented key from the same .env file. The agent does
# not consume it, but declaring and validating it preserves strict rejection
# of every other unknown setting.
dgx_host_ip: IPvAnyAddress = Field(
default="192.168.68.41",
exclude=True,
repr=False,
validate_default=True,
)

# Direct FRITZ!Box PJSIP transport
fritzbox_host: str = "fritz.box"
fritzbox_sip_username: str = ""
Expand Down
Loading