Reading additional input from stdin...
OpenAI Codex v0.128.0 (research preview)
--------
workdir: J:\CLAUDE\PROJECTS\Wakeword
model: gpt-5.5
provider: openai
approval: never
sandbox: danger-full-access
reasoning effort: xhigh
reasoning summaries: none
session id: 019e0330-19ba-7391-b86b-0f3f8f32fd35
--------
user
READ-ONLY INVESTIGATION. Do NOT modify any files. Do NOT commit. Do NOT push.

Environment: Windows 11, bash shell. Project root: J:\CLAUDE\PROJECTS\Wakeword.

PROBLEM
There are TWO databases in play and they appear out of sync:

1. **Postgres `training_jobs` table** — currently EMPTY (0 rows). Earlier in today's session, when I polled `/api/training/status/{id}`, the API returned status data for jobs (e.g. progress=27.0) — implying it reads from this table. Now empty.

2. **SQLite `/app/data/job_queue.db` `jobs` table** — has 49 rows: 17 completed, 25 failed, 7 cancelled. Job 49 shows status='failed' with a real error about ONNX export.

The /api/training/status/{id} endpoint, when polled today after job 49 was created, returned "queued progress=0.0" for 15 minutes — never showing the failure that's recorded in SQLite. Either:
- The endpoint reads from Postgres (which is empty → 0 rows → falls back to default "queued"?)
- The endpoint reads from SQLite (which has the right answer → why was it returning "queued progress=0.0"?)

Find the truth.

INVESTIGATE THOROUGHLY (read-only)

1. Read `console/backend/app/routes/training.py` (or wherever /api/training/status/{id} is defined). What table does it query?
2. Read `console/backend/app/job_queue.py` — what DB does the worker write progress to?
3. Read `console/backend/alembic/versions/` — list every migration in order. Does any one DROP, RECREATE, TRUNCATE, or otherwise wipe `training_jobs`?
4. Read `console/backend/app/models.py` — is `training_jobs` mapped to Postgres? Is `jobs` table mapped anywhere?
5. Read `console/backend/app/services/training_service.py` — when training_service.run_training_job_sync runs, what does it write back to Postgres? Does it create/update a TrainingJob row?

Then directly query the Postgres DB to triangulate:
6. `docker exec wakeword-postgres-1 psql -U violawake -d violawake -c "SELECT count(*) FROM trained_models"` — Are there any trained models from past successful jobs?
7. `docker exec wakeword-postgres-1 psql -U violawake -d violawake -c "\dt"` — list all tables.
8. `docker exec wakeword-postgres-1 psql -U violawake -d violawake -c "SELECT version_num FROM alembic_version"` — current migration head.
9. Check the SQLite job_queue.db for the schema and how it correlates to Postgres training_jobs (might have a `pg_job_id` field?):
   ```bash
   docker exec wakeword-backend-1 python -c "
   import sqlite3
   c = sqlite3.connect('/app/data/job_queue.db')
   for r in c.execute('PRAGMA table_info(jobs)'):
       print(r)
   "
   ```
10. Look at git history for `training.py` and `job_queue.py` since today's session start (commits since `54f20b4`). Did any of my commits change the routing or DB?

Report:
- Which DB is the source of truth for training job status as far as the API is concerned.
- Why Postgres `training_jobs` is empty (was it wiped, or never populated?).
- Whether /api/training/status returning "queued" while SQLite has "failed" is a known inconsistency or a real bug.
- A concrete one-paragraph "this is the real situation" verdict.

CRITICAL CONSTRAINT: read-only. Do NOT modify files, commit, or restart anything.
codex
I’ll keep this strictly read-only: code inspection, git history, and database queries only. I’m going to use the `code-nav` skill lightly to find definitions without broad guessing, then verify each requested file and DB result.
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command "Get-Content -Raw 'C:\\Users\\jihad\\.codex\\skills\\code-nav\\SKILL.md'" in J:\CLAUDE\PROJECTS\Wakeword
 succeeded in 255ms:
---
name: code-nav
description: Fast symbol lookup with `tools/code_nav.py`. Use before broad `rg` or file reads when you need definitions, references, callers, or file structure.
---

# Code Navigation

Use this skill from the NOVVIOLA repo root.

## Workflow

1. Resolve a definition before broad search:
   `python tools/code_nav.py definition <symbol>`
2. Find references when tracing behavior:
   `python tools/code_nav.py references <symbol>`
3. Inspect a file outline before opening the full file:
   `python tools/code_nav.py structure <path>`
4. Find callers when you need the entry points into a function:
   `python tools/code_nav.py callers <function>`

## Quick Commands

- `python tools/code_nav.py definition create_browser_server`
- `python tools/code_nav.py references payment_gate`
- `python tools/code_nav.py structure intent/agent_executor.py`
- `python tools/code_nav.py callers request_review`

## Notes

- Prefer this before broad `rg` when the question is about Python symbols.
- Do not use this for non-symbol text searches or for reading file bodies line by line.

## Read Next

Read `references/source.md` for the original Claude skill and script path.


codex
The `code-nav` skill is NOVVIOLA-specific, so I won’t use its script here. I’ll do direct read-only inspection with `rg`, `git`, and database queries from the Wakeword root.
  → Locate status endpoint and relevant backend files
  • Trace write paths for SQLite and Postgres job state
  • Audit Alembic migrations and model mappings
  • Query live Postgres and SQLite schema
  • Check git history since 54f20b4
  • Synthesize source-of-truth verdict
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command 'git status --short' in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command "rg -n \"status/\\{.*\\}|training/status|def .*status|TrainingJob|job_queue|run_training_job_sync\" console/backend/app console/backend/alembic -S" in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command 'rg --files console/backend/app console/backend/alembic | Sort-Object' in J:\CLAUDE\PROJECTS\Wakeword
 succeeded in 982ms:
 M console/backend/requirements.txt
?? .codex_inv1.txt
?? .codex_inv2.txt
?? .codex_inv3.txt
?? .codex_log_a.txt
?? .codex_log_alpha.txt
?? .codex_log_b.txt
?? .codex_log_c.txt
?? .codex_log_corpus.txt
?? .codex_log_delta.txt
?? .codex_log_inv1.txt
?? .codex_log_inv2.txt
?? .codex_log_inv3.txt
?? .codex_prompt_a.txt
?? .codex_prompt_alpha.txt
?? .codex_prompt_b.txt
?? .codex_prompt_c.txt
?? .codex_prompt_corpus.txt
?? .codex_prompt_delta.txt

 succeeded in 947ms:
console/backend/alembic\env.py
console/backend/alembic\script.py.mako
console/backend/alembic\versions\20260326_0001_a1b2c3d4e5f6_initial_schema.py
console/backend/alembic\versions\20260328_0001_b2c3d4e5f6a7_add_teams.py
console/backend/alembic\versions\20260405_0001_c3d4e5f6a7b8_add_login_lockout_and_soft_delete.py
console/backend/alembic\versions\20260507_0001_d4e5f6a7b8c9_add_processed_stripe_events_table.py
console/backend/app\__init__.py
console/backend/app\auth.py
console/backend/app\config.py
console/backend/app\database.py
console/backend/app\email_service.py
console/backend/app\health.py
console/backend/app\job_queue.py
console/backend/app\main.py
console/backend/app\middleware.py
console/backend/app\models.py
console/backend/app\monitoring.py
console/backend/app\rate_limit.py
console/backend/app\retention.py
console/backend/app\routes\__init__.py
console/backend/app\routes\auth.py
console/backend/app\routes\billing.py
console/backend/app\routes\files.py
console/backend/app\routes\jobs.py
console/backend/app\routes\models.py
console/backend/app\routes\recordings.py
console/backend/app\routes\teams.py
console/backend/app\routes\training.py
console/backend/app\schemas.py
console/backend/app\services\__init__.py
console/backend/app\services\training_service.py
console/backend/app\storage.py

 succeeded in 997ms:
console/backend/app\health.py:16:from app.job_queue import get_job_queue
console/backend/app\health.py:38:def _combine_statuses(*statuses: str) -> str:
console/backend/app\health.py:91:        queue_snapshot = await get_job_queue().runtime_snapshot()
console/backend/app\job_queue.py:26:from app.services.training_service import TrainingCancelledError, run_training_job_sync
console/backend/app\job_queue.py:151:        self._db_path = db_path or (settings.data_dir / "job_queue.db")
console/backend/app\job_queue.py:720:                run_training_job_sync,
console/backend/app\job_queue.py:866:                source="job_queue",
console/backend/app\job_queue.py:1275:_job_queue: JobQueue | None = None
console/backend/app\job_queue.py:1278:async def init_job_queue() -> JobQueue:
console/backend/app\job_queue.py:1280:    global _job_queue
console/backend/app\job_queue.py:1281:    if _job_queue is None:
console/backend/app\job_queue.py:1282:        _job_queue = JobQueue(max_concurrent=settings.max_concurrent_jobs)
console/backend/app\job_queue.py:1283:        await _job_queue.start()
console/backend/app\job_queue.py:1284:    return _job_queue
console/backend/app\job_queue.py:1287:def get_job_queue() -> JobQueue:
console/backend/app\job_queue.py:1289:    if _job_queue is None:
console/backend/app\job_queue.py:1291:    return _job_queue
console/backend/app\job_queue.py:1294:async def shutdown_job_queue() -> None:
console/backend/app\job_queue.py:1296:    global _job_queue
console/backend/app\job_queue.py:1297:    if _job_queue is None:
console/backend/app\job_queue.py:1299:    await _job_queue.shutdown()
console/backend/app\job_queue.py:1300:    _job_queue = None
console/backend/app\main.py:19:from app.job_queue import init_job_queue, shutdown_job_queue
console/backend/app\main.py:72:        await init_job_queue()
console/backend/app\main.py:101:        await shutdown_job_queue()
console/backend/app\models.py:30:    training_jobs: Mapped[list[TrainingJob]] = relationship(back_populates="user", cascade="all, delete-orphan")
console/backend/app\models.py:82:class TrainingJob(Base):
console/backend/app\retention.py:32:        from app.job_queue import JobStatus, get_job_queue
console/backend/app\retention.py:33:        queue = get_job_queue()
console/backend/app\routes\auth.py:27:from app.job_queue import init_job_queue
console/backend/app\routes\auth.py:28:from app.models import Recording, Subscription, TrainedModel, TrainingJob, UsageRecord, User
console/backend/app\routes\auth.py:254:        job = await (await init_job_queue()).get_job(body.resource_id)
console/backend/app\routes\auth.py:382:    queue = await init_job_queue()
console/backend/app\routes\auth.py:419:    await db.execute(delete(TrainingJob).where(TrainingJob.user_id == current_user.id))
console/backend/app\services\training_service.py:38:def run_training_job_sync(
console/backend/app\routes\jobs.py:11:from app.job_queue import Job, QueueFullError, TooManyPendingJobsError, init_job_queue
console/backend/app\routes\jobs.py:99:    queue = await init_job_queue()
console/backend/app\routes\jobs.py:125:    job = await (await init_job_queue()).get_job(job_id)
console/backend/app\routes\jobs.py:148:    jobs = await (await init_job_queue()).list_jobs(current_user.id)
console/backend/app\routes\jobs.py:157:    await (await init_job_queue()).resume_user(current_user.id)
console/backend/app\routes\jobs.py:166:    breaker = await (await init_job_queue()).get_circuit_breaker(current_user.id)
console/backend/app\routes\jobs.py:193:    cancelled = await (await init_job_queue()).cancel_job(job_id)
console/backend/app\routes\training.py:14:from app.job_queue import TooManySubscribersError, init_job_queue
console/backend/app\routes\training.py:35:def _legacy_status(status_value: str) -> str:
console/backend/app\routes\training.py:55:@router.get("/status/{job_id}", response_model=TrainingStatusResponse)
console/backend/app\routes\training.py:56:async def get_training_status(
console/backend/app\routes\training.py:123:    queue_manager = await init_job_queue()

codex
The status endpoint is in `console/backend/app/routes/training.py`; job queue code imports `run_training_job_sync`. I’m reading the endpoint and the queue persistence code next, then I’ll line that up with the live DB state.
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$i=0; Get-Content '"'console/backend/app/routes/training.py' | ForEach-Object { "'$i++; '"'{0,4}: {1}' -f "'$i, $_ }' in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$i=0; Get-Content '"'console/backend/app/models.py' | ForEach-Object { "'$i++; '"'{0,4}: {1}' -f "'$i, $_ }' in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$i=0; Get-Content '"'console/backend/app/services/training_service.py' | ForEach-Object { "'$i++; '"'{0,4}: {1}' -f "'$i, $_ }' in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command 'rg -n "sqlite|aiosqlite|CREATE TABLE|ALTER TABLE|INSERT INTO jobs|UPDATE jobs|progress|status|pg_|training_jobs|completed|failed|cancelled|run_training_job_sync" console/backend/app/job_queue.py -S' in J:\CLAUDE\PROJECTS\Wakeword
 succeeded in 298ms:
19:import aiosqlite
26:from app.services.training_service import TrainingCancelledError, run_training_job_sync
63:    COMPLETED = "completed"
64:    FAILED = "failed"
65:    CANCELLED = "cancelled"
82:    status: JobStatus
85:    completed_at: datetime | None = None
87:    progress_pct: float = 0.0
230:                    WHERE user_id = ? AND status IN (?, ?)
247:                    INSERT INTO jobs (
250:                        status,
253:                        completed_at,
255:                        progress_pct,
295:                "status": JobStatus.PENDING.value,
296:                "progress": 0.0,
315:        if job.status in {JobStatus.COMPLETED, JobStatus.FAILED, JobStatus.CANCELLED}:
318:        if job.status is JobStatus.RUNNING:
326:        completed_at = _utcnow()
329:            status=JobStatus.CANCELLED,
330:            completed_at=completed_at,
336:                "status": JobStatus.CANCELLED.value,
337:                "progress": job.progress_pct,
342:                "message": "Training cancelled.",
375:            "SELECT id, status FROM jobs WHERE user_id = ?",
393:            if str(row["status"]) == JobStatus.RUNNING.value
470:                "SELECT COUNT(*) AS count FROM jobs WHERE status = ?",
475:                "SELECT COUNT(*) AS count FROM jobs WHERE status = ?",
493:            "worker_status": {
531:                CREATE TABLE IF NOT EXISTS jobs (
535:                    status TEXT NOT NULL,
538:                    completed_at TEXT,
540:                    progress_pct REAL NOT NULL DEFAULT 0,
551:                CREATE TABLE IF NOT EXISTS user_circuit_breakers (
565:                "CREATE INDEX IF NOT EXISTS idx_jobs_status_created ON jobs(status, created_at ASC)"
574:                    "ALTER TABLE jobs ADD COLUMN priority INTEGER NOT NULL DEFAULT 0"
579:                "CREATE INDEX IF NOT EXISTS idx_jobs_priority_created ON jobs(status, priority DESC, created_at ASC)"
588:                "SELECT DISTINCT user_id FROM jobs WHERE status = ?",
596:                UPDATE jobs
597:                SET status = ?, started_at = NULL, error = NULL
598:                WHERE status IN (?, ?)
639:            def _on_done(completed: asyncio.Task[None]) -> None:
641:                self._inflight_tasks.discard(completed)
654:            if job.status is not JobStatus.PENDING:
679:                status=JobStatus.RUNNING,
686:                    "status": JobStatus.RUNNING.value,
687:                    "progress": job.progress_pct,
712:            def _on_progress(event: dict[str, Any]) -> None:
714:                    self._handle_progress_event(job_id, job.epochs, event),
720:                run_training_job_sync,
727:                progress_callback=_on_progress,
728:                is_cancelled=cancel_event.is_set,
755:            completed_at = _utcnow()
758:                status=JobStatus.COMPLETED,
759:                progress_pct=100.0,
760:                completed_at=completed_at,
774:                    "status": JobStatus.COMPLETED.value,
775:                    "progress": 100.0,
787:            logger.info("Training job %s completed for user %s", job_id, job.user_id)
805:                log_exception(logger, email_exc, message="Training-complete email failed", source="email")
809:            completed_at = _utcnow()
810:            progress_pct = current_job.progress_pct if current_job is not None else 0.0
813:                status=JobStatus.CANCELLED,
814:                completed_at=completed_at,
820:                    "status": JobStatus.CANCELLED.value,
821:                    "progress": progress_pct,
826:                    "message": "Training cancelled.",
833:            logger.info("Training job %s cancelled", job_id)
836:            completed_at = _utcnow()
839:                status=JobStatus.FAILED,
840:                completed_at=completed_at,
849:                    "status": JobStatus.FAILED.value,
850:                    "progress": current_job.progress_pct if current_job is not None else 0.0,
855:                    "message": "Training failed.",
865:                message="Training job failed",
879:            "SELECT COUNT(*) AS count FROM jobs WHERE status = ?",
897:                    WHERE status = ?
937:                WHERE status = ?
949:    async def _handle_progress_event(
955:        progress = float(event.get("progress", 0.0))
956:        await self._update_job(job_id, progress_pct=progress)
960:                "status": str(event.get("status", JobStatus.RUNNING.value)),
961:                "progress": progress,
986:        status: JobStatus | None = None,
987:        progress_pct: float | None = None,
989:        completed_at: datetime | None = None,
997:        if status is not None:
998:            assignments.append("status = ?")
999:            values.append(status.value)
1000:        if progress_pct is not None:
1001:            assignments.append("progress_pct = ?")
1002:            values.append(progress_pct)
1006:        if completed_at is not None:
1007:            assignments.append("completed_at = ?")
1008:            values.append(_serialize_datetime(completed_at))
1009:        if error is not None or status in {JobStatus.RUNNING, JobStatus.COMPLETED, JobStatus.CANCELLED}:
1025:                f"UPDATE jobs SET {', '.join(assignments)} WHERE id = ?",
1032:        conn: aiosqlite.Connection,
1241:    def _row_to_job(self, row: aiosqlite.Row) -> Job:
1252:            status=JobStatus(str(row["status"])),
1255:            completed_at=_deserialize_datetime(row["completed_at"]),
1257:            progress_pct=float(row["progress_pct"]),
1266:    async def _connect(self) -> AsyncIterator[aiosqlite.Connection]:
1267:        connection = await aiosqlite.connect(self._db_path, timeout=30)
1268:        connection.row_factory = aiosqlite.Row

 succeeded in 349ms:
   1: """SQLAlchemy ORM models for ViolaWake Console."""
   2: 
   3: from __future__ import annotations
   4: 
   5: from datetime import datetime, timezone
   6: 
   7: from sqlalchemy import Boolean, DateTime, Float, ForeignKey, Integer, String, Text, UniqueConstraint, func
   8: from sqlalchemy.orm import Mapped, mapped_column, relationship
   9: 
  10: from app.database import Base
  11: 
  12: 
  13: def _utcnow() -> datetime:
  14:     return datetime.now(timezone.utc)
  15: 
  16: 
  17: class User(Base):
  18:     __tablename__ = "users"
  19: 
  20:     id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
  21:     email: Mapped[str] = mapped_column(String(255), unique=True, nullable=False, index=True)
  22:     password_hash: Mapped[str] = mapped_column(String(255), nullable=False)
  23:     name: Mapped[str] = mapped_column(String(255), nullable=False)
  24:     email_verified: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False)
  25:     failed_login_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
  26:     locked_until: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
  27:     created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=_utcnow)
  28: 
  29:     recordings: Mapped[list[Recording]] = relationship(back_populates="user", cascade="all, delete-orphan")
  30:     training_jobs: Mapped[list[TrainingJob]] = relationship(back_populates="user", cascade="all, delete-orphan")
  31:     trained_models: Mapped[list[TrainedModel]] = relationship(back_populates="user", cascade="all, delete-orphan")
  32:     owned_teams: Mapped[list[Team]] = relationship(back_populates="owner", cascade="all, delete-orphan")
  33:     team_memberships: Mapped[list[TeamMember]] = relationship(back_populates="user", cascade="all, delete-orphan")
  34: 
  35: 
  36: class Team(Base):
  37:     __tablename__ = "teams"
  38: 
  39:     id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
  40:     name: Mapped[str] = mapped_column(String(255), nullable=False)
  41:     created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=_utcnow)
  42:     owner_id: Mapped[int] = mapped_column(Integer, ForeignKey("users.id"), nullable=False, index=True)
  43: 
  44:     owner: Mapped[User] = relationship(back_populates="owned_teams")
  45:     members: Mapped[list[TeamMember]] = relationship(back_populates="team", cascade="all, delete-orphan")
  46: 
  47: 
  48: class TeamMember(Base):
  49:     __tablename__ = "team_members"
  50:     __table_args__ = (
  51:         UniqueConstraint("team_id", "user_id", name="uq_team_member"),
  52:     )
  53: 
  54:     id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
  55:     team_id: Mapped[int] = mapped_column(Integer, ForeignKey("teams.id"), nullable=False, index=True)
  56:     user_id: Mapped[int] = mapped_column(Integer, ForeignKey("users.id"), nullable=False, index=True)
  57:     role: Mapped[str] = mapped_column(String(20), nullable=False, default="member")  # owner / admin / member
  58:     invited_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=_utcnow)
  59:     joined_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
  60: 
  61:     team: Mapped[Team] = relationship(back_populates="members")
  62:     user: Mapped[User] = relationship(back_populates="team_memberships")
  63: 
  64: 
  65: class Recording(Base):
  66:     __tablename__ = "recordings"
  67: 
  68:     id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
  69:     user_id: Mapped[int] = mapped_column(Integer, ForeignKey("users.id"), nullable=False, index=True)
  70:     team_id: Mapped[int | None] = mapped_column(Integer, ForeignKey("teams.id"), nullable=True, index=True)
  71:     wake_word: Mapped[str] = mapped_column(String(100), nullable=False, index=True)
  72:     filename: Mapped[str] = mapped_column(String(255), nullable=False)
  73:     file_path: Mapped[str] = mapped_column(String(1024), nullable=False)
  74:     duration_s: Mapped[float] = mapped_column(Float, nullable=False)
  75:     sample_rate: Mapped[int] = mapped_column(Integer, nullable=False, default=16000)
  76:     created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=_utcnow)
  77:     deleted_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True, default=None)
  78: 
  79:     user: Mapped[User] = relationship(back_populates="recordings")
  80: 
  81: 
  82: class TrainingJob(Base):
  83:     __tablename__ = "training_jobs"
  84: 
  85:     id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
  86:     user_id: Mapped[int] = mapped_column(Integer, ForeignKey("users.id"), nullable=False, index=True)
  87:     wake_word: Mapped[str] = mapped_column(String(100), nullable=False)
  88:     status: Mapped[str] = mapped_column(String(20), nullable=False, default="queued")
  89:     progress: Mapped[float] = mapped_column(Float, nullable=False, default=0.0)
  90:     epochs: Mapped[int] = mapped_column(Integer, nullable=False, default=80)
  91:     d_prime: Mapped[float | None] = mapped_column(Float, nullable=True)
  92:     model_id: Mapped[int | None] = mapped_column(Integer, ForeignKey("trained_models.id"), nullable=True)
  93:     error: Mapped[str | None] = mapped_column(Text, nullable=True)
  94:     created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=_utcnow)
  95:     completed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
  96: 
  97:     user: Mapped[User] = relationship(back_populates="training_jobs")
  98:     model: Mapped[TrainedModel | None] = relationship()
  99: 
 100: 
 101: class TrainedModel(Base):
 102:     __tablename__ = "trained_models"
 103: 
 104:     id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
 105:     user_id: Mapped[int] = mapped_column(Integer, ForeignKey("users.id"), nullable=False, index=True)
 106:     team_id: Mapped[int | None] = mapped_column(Integer, ForeignKey("teams.id"), nullable=True, index=True)
 107:     wake_word: Mapped[str] = mapped_column(String(100), nullable=False)
 108:     file_path: Mapped[str] = mapped_column(String(1024), nullable=False)
 109:     config_json: Mapped[str | None] = mapped_column(Text, nullable=True)
 110:     d_prime: Mapped[float | None] = mapped_column(Float, nullable=True)
 111:     size_bytes: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
 112:     created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=_utcnow)
 113: 
 114:     user: Mapped[User] = relationship(back_populates="trained_models")
 115: 
 116: 
 117: class Subscription(Base):
 118:     __tablename__ = "subscriptions"
 119: 
 120:     id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
 121:     user_id: Mapped[int] = mapped_column(
 122:         Integer, ForeignKey("users.id", ondelete="CASCADE"), unique=True, nullable=False, index=True,
 123:     )
 124:     stripe_customer_id: Mapped[str | None] = mapped_column(String(255), nullable=True, index=True)
 125:     stripe_subscription_id: Mapped[str | None] = mapped_column(String(255), nullable=True, unique=True)
 126:     tier: Mapped[str] = mapped_column(String(20), nullable=False, default="free")
 127:     status: Mapped[str] = mapped_column(String(20), nullable=False, default="active")
 128:     current_period_end: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
 129:     created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=_utcnow)
 130:     updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=_utcnow, onupdate=_utcnow)
 131: 
 132:     user: Mapped[User] = relationship(backref="subscription")
 133: 
 134: 
 135: class UsageRecord(Base):
 136:     __tablename__ = "usage_records"
 137:     __table_args__ = (
 138:         UniqueConstraint("user_id", "action", "period_start", name="uq_usage_user_action_period"),
 139:     )
 140: 
 141:     id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
 142:     user_id: Mapped[int] = mapped_column(
 143:         Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True,
 144:     )
 145:     action: Mapped[str] = mapped_column(String(50), nullable=False)
 146:     period_start: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False)
 147:     count: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
 148:     created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=_utcnow)
 149: 
 150: 
 151: class ProcessedStripeEvent(Base):
 152:     __tablename__ = "processed_stripe_events"
 153: 
 154:     event_id: Mapped[str] = mapped_column(Text, primary_key=True)
 155:     processed_at: Mapped[datetime] = mapped_column(
 156:         DateTime(timezone=True),
 157:         nullable=False,
 158:         server_default=func.now(),
 159:     )

 succeeded in 360ms:
   1: """Compatibility routes for legacy training endpoints."""
   2: 
   3: import asyncio
   4: import json
   5: from typing import Annotated
   6: 
   7: from fastapi import APIRouter, Depends, HTTPException, Query, Request, status
   8: from sqlalchemy import select
   9: from sqlalchemy.ext.asyncio import AsyncSession
  10: from sse_starlette.sse import EventSourceResponse
  11: 
  12: from app.auth import decode_download_token, decode_token, get_verified_user
  13: from app.database import get_db
  14: from app.job_queue import TooManySubscribersError, init_job_queue
  15: from app.models import User
  16: from app.rate_limit import TRAINING_SUBMIT_LIMIT, key_by_user, limiter, set_rate_limit_user
  17: from app.routes.billing import check_training_quota
  18: from app.routes.jobs import get_owned_job_or_404, submit_training_job
  19: from app.schemas import JobSubmitRequest, TrainingStartResponse, TrainingStatusResponse
  20: 
  21: router = APIRouter(prefix="/api/training", tags=["training"])
  22: MAX_SSE_PER_USER = 10
  23: _active_sse_connections: dict[int, int] = {}
  24: 
  25: 
  26: async def _quota_user_with_rate_key(
  27:     request: Request,
  28:     current_user: Annotated[User, Depends(check_training_quota)],
  29: ) -> User:
  30:     """Resolve the user via training-quota check and stash ID for rate limiting."""
  31:     set_rate_limit_user(request, current_user.id)
  32:     return current_user
  33: 
  34: 
  35: def _legacy_status(status_value: str) -> str:
  36:     """Map queue status names to the legacy training API values."""
  37:     if status_value == "pending":
  38:         return "queued"
  39:     return status_value
  40: 
  41: 
  42: @router.post("/start", response_model=TrainingStartResponse, status_code=status.HTTP_202_ACCEPTED)
  43: @limiter.limit(TRAINING_SUBMIT_LIMIT, key_func=key_by_user)
  44: async def start_training(
  45:     request: Request,
  46:     body: JobSubmitRequest,
  47:     current_user: Annotated[User, Depends(_quota_user_with_rate_key)],
  48:     db: Annotated[AsyncSession, Depends(get_db)],
  49: ) -> TrainingStartResponse:
  50:     """Submit a training job through the persistent queue."""
  51:     job_response = await submit_training_job(body, current_user, db)
  52:     return TrainingStartResponse(job_id=job_response.job_id, status=job_response.status)
  53: 
  54: 
  55: @router.get("/status/{job_id}", response_model=TrainingStatusResponse)
  56: async def get_training_status(
  57:     job_id: int,
  58:     current_user: Annotated[User, Depends(get_verified_user)],
  59: ) -> TrainingStatusResponse:
  60:     """Get the current status of a queued training job."""
  61:     job = await get_owned_job_or_404(job_id, current_user)
  62:     return TrainingStatusResponse(
  63:         job_id=job.id,
  64:         status=_legacy_status(job.status.value),
  65:         progress=job.progress_pct,
  66:         d_prime=job.d_prime,
  67:         model_id=job.model_id,
  68:         error=job.error,
  69:     )
  70: 
  71: 
  72: async def _resolve_sse_user(
  73:     request: Request,
  74:     token: str | None,
  75:     db: AsyncSession,
  76:     *,
  77:     job_id: int,
  78: ) -> User:
  79:     """Resolve the authenticated user for SSE endpoints."""
  80:     user_id: int | None = None
  81:     if token:
  82:         user_id = decode_download_token(
  83:             token,
  84:             expected_action="training_stream",
  85:             expected_resource_id=job_id,
  86:         )
  87:     else:
  88:         auth_header = request.headers.get("authorization", "")
  89:         if auth_header.startswith("Bearer "):
  90:             user_id = decode_token(auth_header.removeprefix("Bearer ").strip())
  91: 
  92:     if user_id is None:
  93:         raise HTTPException(
  94:             status_code=status.HTTP_401_UNAUTHORIZED,
  95:             detail="Missing authentication token",
  96:         )
  97: 
  98:     result = await db.execute(select(User).where(User.id == user_id))
  99:     user = result.scalar_one_or_none()
 100:     if user is None:
 101:         raise HTTPException(
 102:             status_code=status.HTTP_401_UNAUTHORIZED,
 103:             detail="User not found",
 104:         )
 105:     if not user.email_verified:
 106:         raise HTTPException(
 107:             status_code=status.HTTP_403_FORBIDDEN,
 108:             detail="Verify your email address to access recording, training, and billing features.",
 109:         )
 110:     return user
 111: 
 112: 
 113: @router.get("/stream/{job_id}")
 114: async def stream_training(
 115:     job_id: int,
 116:     request: Request,
 117:     db: Annotated[AsyncSession, Depends(get_db)],
 118:     token: str | None = Query(default=None),
 119: ) -> EventSourceResponse:
 120:     """Stream queued training progress via Server-Sent Events."""
 121:     current_user = await _resolve_sse_user(request, token, db, job_id=job_id)
 122:     job = await get_owned_job_or_404(job_id, current_user)
 123:     queue_manager = await init_job_queue()
 124:     active_connection_count = _active_sse_connections.get(current_user.id, 0)
 125:     if active_connection_count >= MAX_SSE_PER_USER:
 126:         raise HTTPException(
 127:             status_code=status.HTTP_429_TOO_MANY_REQUESTS,
 128:             detail="Too many active SSE connections. Close an existing stream and try again.",
 129:         )
 130:     _active_sse_connections[current_user.id] = active_connection_count + 1
 131: 
 132:     def _release_connection() -> None:
 133:         remaining = _active_sse_connections.get(current_user.id, 0) - 1
 134:         if remaining > 0:
 135:             _active_sse_connections[current_user.id] = remaining
 136:         else:
 137:             _active_sse_connections.pop(current_user.id, None)
 138: 
 139:     if job.status.value in {"completed", "failed", "cancelled"}:
 140: 
 141:         async def _final_event():
 142:             try:
 143:                 yield {
 144:                     "event": "training",
 145:                     "data": json.dumps({
 146:                         "status": _legacy_status(job.status.value),
 147:                         "progress": job.progress_pct,
 148:                         "epoch": 0,
 149:                         "total_epochs": job.epochs,
 150:                         "train_loss": 0.0,
 151:                         "val_loss": 0.0,
 152:                         "d_prime": job.d_prime,
 153:                         "model_id": job.model_id,
 154:                         "message": job.error if job.status.value != "completed" else "Training complete.",
 155:                         "error": job.error,
 156:                     }),
 157:                 }
 158:             finally:
 159:                 _release_connection()
 160: 
 161:         return EventSourceResponse(_final_event())
 162: 
 163:     try:
 164:         queue = queue_manager.subscribe(job_id)
 165:     except TooManySubscribersError as exc:
 166:         _release_connection()
 167:         raise HTTPException(
 168:             status_code=status.HTTP_429_TOO_MANY_REQUESTS,
 169:             detail=str(exc),
 170:         ) from exc
 171: 
 172:     async def _event_generator():
 173:         try:
 174:             while True:
 175:                 try:
 176:                     event = await asyncio.wait_for(queue.get(), timeout=30.0)
 177:                     if "status" in event:
 178:                         event = {**event, "status": _legacy_status(str(event["status"]))}
 179:                     yield {
 180:                         "event": "training",
 181:                         "data": json.dumps(event),
 182:                     }
 183:                     if event.get("status") in {"completed", "failed", "cancelled"}:
 184:                         break
 185:                 except asyncio.TimeoutError:
 186:                     yield {"event": "ping", "data": ""}
 187:         finally:
 188:             queue_manager.unsubscribe(job_id, queue)
 189:             _release_connection()
 190: 
 191:     return EventSourceResponse(_event_generator())

 succeeded in 368ms:
   1: """Training pipeline helpers used by the async job queue."""
   2: 
   3: from __future__ import annotations
   4: 
   5: import json
   6: import logging
   7: import random
   8: import shutil
   9: import tempfile
  10: import time
  11: from collections.abc import Callable
  12: from dataclasses import dataclass
  13: from pathlib import Path
  14: from typing import Any
  15: 
  16: from app.config import settings
  17: from app.monitoring import log_exception
  18: from app.storage import get_storage
  19: 
  20: logger = logging.getLogger("violawake.training")
  21: 
  22: 
  23: class TrainingCancelledError(RuntimeError):
  24:     """Raised when a running training job is cancelled."""
  25: 
  26: 
  27: @dataclass(slots=True)
  28: class TrainingArtifact:
  29:     """Artifacts produced by a completed training run."""
  30: 
  31:     local_path: Path
  32:     config_json: str | None
  33:     config_bytes: bytes | None
  34:     d_prime: float | None
  35:     size_bytes: int
  36: 
  37: 
  38: def run_training_job_sync(
  39:     *,
  40:     job_id: int,
  41:     wake_word: str,
  42:     recording_identifiers: list[str],
  43:     output_path: Path,
  44:     epochs: int,
  45:     timeout_seconds: int,
  46:     progress_callback: Callable[[dict[str, Any]], None],
  47:     is_cancelled: Callable[[], bool],
  48:     negatives_dir: Path | None = None,
  49: ) -> TrainingArtifact:
  50:     """Run the ViolaWake SDK training pipeline synchronously."""
  51:     positives_dir: Path | None = None
  52:     neg_temp_dir: Path | None = None
  53:     storage = get_storage()
  54: 
  55:     def _ensure_not_cancelled() -> None:
  56:         if is_cancelled():
  57:             raise TrainingCancelledError("Training cancelled by user")
  58: 
  59:     try:
  60:         _ensure_not_cancelled()
  61:         progress_callback({
  62:             "status": "running",
  63:             "progress": 0.0,
  64:             "epoch": 0,
  65:             "total_epochs": epochs,
  66:             "train_loss": 0.0,
  67:             "val_loss": 0.0,
  68:             "message": "Preparing training data...",
  69:             "error": None,
  70:         })
  71: 
  72:         positives_dir = Path(tempfile.mkdtemp(prefix="violawake_train_", dir=str(settings.tmp_dir)))
  73:         for index, recording_identifier in enumerate(recording_identifiers):
  74:             _ensure_not_cancelled()
  75:             if not storage.exists(recording_identifier):
  76:                 logger.warning("Recording %s was missing for training job %s", recording_identifier, job_id)
  77:                 continue
  78: 
  79:             dst = positives_dir / f"sample_{index:04d}.wav"
  80:             dst.write_bytes(storage.download(recording_identifier))
  81: 
  82:         wav_count = len(list(positives_dir.glob("*.wav")))
  83:         if wav_count < 5:
  84:             raise RuntimeError("Only %s valid WAV files found. Need at least 5." % wav_count)
  85: 
  86:         pos_files = sorted(positives_dir.glob("*.wav"))
  87: 
  88:         progress_callback({
  89:             "status": "running",
  90:             "progress": 2.0,
  91:             "epoch": 0,
  92:             "total_epochs": epochs,
  93:             "train_loss": 0.0,
  94:             "val_loss": 0.0,
  95:             "message": "Loaded %s recordings. Generating TTS corpus..." % wav_count,
  96:             "error": None,
  97:         })
  98: 
  99:         # -- Production pipeline: full auto-corpus (matching CLI train) --
 100:         from violawake_sdk.tools.train import (
 101:             _generate_confusable_negatives,
 102:             _generate_tts_positives,
 103:             _train_temporal_cnn,
 104:         )
 105: 
 106:         neg_temp_dir = Path(tempfile.mkdtemp(prefix="violawake_neg_", dir=str(settings.tmp_dir)))
 107: 
 108:         # Auto-generate TTS positives when user has <100 samples (production behavior)
 109:         # Keep track of user-provided files so augmentation targets only real recordings
 110:         user_pos_files = list(pos_files)
 111:         if len(pos_files) < 100:
 112:             tts_pos_dir = neg_temp_dir / "tts_positives"
 113:             try:
 114:                 tts_pos_files = _generate_tts_positives(
 115:                     wake_word,
 116:                     tts_pos_dir,
 117:                     verbose=False,
 118:                 )
 119:                 if tts_pos_files:
 120:                     pos_files = list(pos_files) + tts_pos_files
 121:                     logger.info(
 122:                         "Generated %s TTS positives for job %s (total: %s)",
 123:                         len(tts_pos_files), job_id, len(pos_files),
 124:                     )
 125:             except Exception as exc:
 126:                 logger.error(
 127:                     "TTS positive generation FAILED for job %s: %s â€” "
 128:                     "model quality will be degraded without TTS diversity",
 129:                     job_id, exc,
 130:                 )
 131: 
 132:             _ensure_not_cancelled()
 133:             progress_callback({
 134:                 "status": "running",
 135:                 "progress": 3.0,
 136:                 "epoch": 0,
 137:                 "total_epochs": epochs,
 138:                 "train_loss": 0.0,
 139:                 "val_loss": 0.0,
 140:                 "message": "Corpus: %s positives. Generating wake-word negatives..." % len(pos_files),
 141:                 "error": None,
 142:             })
 143:         neg_tag_map: dict[str, list[Path]] = {}
 144: 
 145:         # Source 1: User/paid-tier corpus negatives
 146:         if negatives_dir and negatives_dir.exists():
 147:             user_neg = sorted(
 148:                 list(negatives_dir.rglob("*.wav")) + list(negatives_dir.rglob("*.flac"))
 149:             )
 150:             if user_neg:
 151:                 neg_tag_map["neg_user"] = user_neg
 152:                 logger.info("Loaded %s corpus negatives for job %s", len(user_neg), job_id)
 153: 
 154:         _ensure_not_cancelled()
 155: 
 156:         # Source 2: Auto-generated confusable negatives (phonetically similar)
 157:         # Two rounds matching CLI production pipeline:
 158:         #   Round 1: 30 confusables x 10 voices (broad phonetic coverage)
 159:         #   Round 2: 16 confusables x 10 voices (tight variants for hard negatives)
 160:         confusable_dir_r1 = neg_temp_dir / "confusables_r1"
 161:         try:
 162:             confusable_r1 = _generate_confusable_negatives(
 163:                 wake_word,
 164:                 confusable_dir_r1,
 165:                 n_confusables=30,
 166:                 voices_per_word=10,
 167:                 verbose=False,
 168:             )
 169:             if confusable_r1:
 170:                 neg_tag_map["neg_confusable_r1"] = confusable_r1
 171:         except Exception as exc:
 172:             logger.error(
 173:                 "Confusable round 1 FAILED for job %s: %s â€” "
 174:                 "model will have higher false positive rate on similar-sounding words",
 175:                 job_id, exc,
 176:             )
 177: 
 178:         _ensure_not_cancelled()
 179: 
 180:         confusable_dir_r2 = neg_temp_dir / "confusables_r2"
 181:         try:
 182:             confusable_r2 = _generate_confusable_negatives(
 183:                 wake_word,
 184:                 confusable_dir_r2,
 185:                 n_confusables=16,
 186:                 voices_per_word=10,
 187:                 verbose=False,
 188:             )
 189:             if confusable_r2:
 190:                 neg_tag_map["neg_confusable_r2"] = confusable_r2
 191:         except Exception as exc:
 192:             logger.error(
 193:                 "Confusable round 2 FAILED for job %s: %s",
 194:                 job_id, exc,
 195:             )
 196: 
 197:         _ensure_not_cancelled()
 198:         progress_callback({
 199:             "status": "running",
 200:             "progress": 4.0,
 201:             "epoch": 0,
 202:             "total_epochs": epochs,
 203:             "train_loss": 0.0,
 204:             "val_loss": 0.0,
 205:             "message": "Generated confusables. Loading corpus speech negatives...",
 206:             "error": None,
 207:         })
 208: 
 209:         _ensure_not_cancelled()
 210: 
 211:         # Source 4: Universal corpus (LibriSpeech, MUSAN) if available
 212:         service_file = Path(__file__).resolve()
 213:         _CORPUS_SEARCH_PATHS = [
 214:             Path("/app/corpus"),
 215:             *([service_file.parents[4] / "corpus"] if len(service_file.parents) > 4 else []),
 216:             Path.home() / ".violawake" / "corpus",
 217:             Path("corpus"),
 218:         ]
 219:         _CORPUS_SUBDIRS: dict[str, tuple[str, ...]] = {
 220:             "neg_librispeech": ("librispeech",),
 221:             "neg_musan_speech": ("musan/musan/speech", "musan/speech"),
 222:             "neg_musan_music": ("musan/musan/music", "musan/music"),
 223:             "neg_musan_noise": ("musan/musan/noise", "musan/noise"),
 224:         }
 225:         _rng = random.Random(42)
 226:         for tag, subdirs in _CORPUS_SUBDIRS.items():
 227:             for corpus_root in _CORPUS_SEARCH_PATHS:
 228:                 if not corpus_root.exists():
 229:                     continue
 230:                 for subdir in subdirs:
 231:                     candidate = corpus_root / subdir
 232:                     if candidate.exists():
 233:                         corpus_files = sorted(
 234:                             list(candidate.rglob("*.wav")) + list(candidate.rglob("*.flac"))
 235:                         )
 236:                         if corpus_files:
 237:                             if len(corpus_files) > 2000:
 238:                                 corpus_files = sorted(_rng.sample(corpus_files, 2000))
 239:                             neg_tag_map[tag] = corpus_files
 240:                             break
 241:                 if tag in neg_tag_map:
 242:                     break
 243: 
 244:         all_neg_files: list[Path] = []
 245:         for files in neg_tag_map.values():
 246:             all_neg_files.extend(files)
 247: 
 248:         total_neg = len(all_neg_files)
 249:         speech_neg_tags = {
 250:             "neg_user",
 251:             "neg_librispeech",
 252:             "neg_musan_speech",
 253:             "neg_musan_music",
 254:             "neg_musan_noise",
 255:         }
 256:         total_speech_neg = sum(
 257:             len(files) for tag, files in neg_tag_map.items() if tag in speech_neg_tags
 258:         )
 259:         if total_speech_neg < 5 or total_neg < 5:
 260:             raise RuntimeError(
 261:                 "No speech negatives available. Mount LibriSpeech + MUSAN corpus at "
 262:                 "/app/corpus or run `violawake download-corpus`."
 263:             )
 264: 
 265:         progress_callback({
 266:             "status": "running",
 267:             "progress": 8.0,
 268:             "epoch": 0,
 269:             "total_epochs": epochs,
 270:             "train_loss": 0.0,
 271:             "val_loss": 0.0,
 272:             "message": "Corpus ready: %s pos, %s neg. Training TemporalCNN..." % (len(pos_files), total_neg),
 273:             "error": None,
 274:         })
 275: 
 276:         started_at = time.monotonic()
 277: 
 278:         def _on_epoch(info: dict[str, Any]) -> None:
 279:             _ensure_not_cancelled()
 280:             elapsed = time.monotonic() - started_at
 281:             if elapsed > timeout_seconds:
 282:                 raise RuntimeError(
 283:                     "Training job timed out after %ss (%s minutes)"
 284:                     % (timeout_seconds, timeout_seconds // 60)
 285:                 )
 286: 
 287:             epoch = int(info.get("epoch", 0))
 288:             total_epochs = int(info.get("total_epochs", epochs)) or epochs
 289:             train_loss = float(info.get("train_loss", 0.0))
 290:             val_loss = float(info.get("val_loss", 0.0))
 291:             progress = min(10.0 + 85.0 * (epoch / total_epochs), 95.0)
 292: 
 293:             progress_callback({
 294:                 "status": "running",
 295:                 "progress": round(progress, 2),
 296:                 "epoch": epoch,
 297:                 "total_epochs": total_epochs,
 298:                 "train_loss": round(train_loss, 6),
 299:                 "val_loss": round(val_loss, 6),
 300:                 "message": "Epoch %s/%s - loss: %.4f" % (epoch, total_epochs, train_loss),
 301:                 "error": None,
 302:             })
 303: 
 304:         _train_temporal_cnn(
 305:             pos_files=pos_files,
 306:             neg_files=all_neg_files,
 307:             output_path=output_path,
 308:             wake_word=wake_word,
 309:             epochs=epochs,
 310:             augment=True,
 311:             eval_dir=None,
 312:             verbose=True,
 313:             progress_callback=_on_epoch,
 314:             neg_tags=neg_tag_map,
 315:             tmp_dir=settings.tmp_dir,
 316:             augment_source_files=user_pos_files,
 317:         )
 318: 
 319:         _ensure_not_cancelled()
 320:         if not output_path.exists():
 321:             raise RuntimeError("Training completed but no model file was produced")
 322: 
 323:         config_path = output_path.with_suffix(".config.json")
 324:         config_json: str | None = None
 325:         config_bytes: bytes | None = None
 326:         d_prime_value: float | None = None
 327:         if config_path.exists():
 328:             config_bytes = config_path.read_bytes()
 329:             config_data = json.loads(config_bytes.decode("utf-8"))
 330:             config_json = json.dumps(config_data)
 331:             if isinstance(config_data, dict):
 332:                 raw_d_prime = config_data.get("d_prime")
 333:                 if isinstance(raw_d_prime, (int, float)):
 334:                     d_prime_value = float(raw_d_prime)
 335: 
 336:         return TrainingArtifact(
 337:             local_path=output_path,
 338:             config_json=config_json,
 339:             config_bytes=config_bytes,
 340:             d_prime=d_prime_value,
 341:             size_bytes=output_path.stat().st_size,
 342:         )
 343:     except TrainingCancelledError:
 344:         logger.info("Training job %s cancelled", job_id)
 345:         raise
 346:     except Exception as exc:
 347:         log_exception(
 348:             logger,
 349:             exc,
 350:             message="Training job failed",
 351:             source="training",
 352:             extra={"job_id": job_id, "wake_word": wake_word},
 353:         )
 354:         raise
 355:     finally:
 356:         if positives_dir is not None and positives_dir.exists():
 357:             shutil.rmtree(positives_dir, ignore_errors=True)
 358:         if neg_temp_dir is not None and neg_temp_dir.exists():
 359:             shutil.rmtree(neg_temp_dir, ignore_errors=True)

exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$i=0; Get-Content '"'console/backend/app/routes/jobs.py' | ForEach-Object { "'$i++; if ($i -ge 1 -and $i -le 230) { '"'{0,4}: {1}' -f "'$i, $_ } }' in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$i=0; Get-Content '"'console/backend/app/job_queue.py' | ForEach-Object { "'$i++; if (($i -ge 1 -and $i -le 130) -or ($i -ge 140 -and $i -le 350) -or ($i -ge 520 -and $i -le 610) -or ($i -ge 650 -and $i -le 870) -or ($i -ge 940 -and $i -le 1040) -or ($i -ge 1230 -and $i -le 1275)) { '"'{0,4}: {1}' -f "'$i, $_ } }' in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command "rg -n \"TrainingJob|trained_models|TrainedModel|db\\.add|commit\\(|execute\\(|INSERT|UPDATE|training_jobs\" console/backend/app/routes/jobs.py console/backend/app/job_queue.py console/backend/app/services/training_service.py console/backend/app/routes/training.py -S" in J:\CLAUDE\PROJECTS\Wakeword
 succeeded in 327ms:
console/backend/app/routes/training.py:98:    result = await db.execute(select(User).where(User.id == user_id))
console/backend/app/routes/jobs.py:59:    result = await db.execute(
console/backend/app/job_queue.py:24:from app.models import Recording, TrainedModel, User
console/backend/app/job_queue.py:120:        result = await session.execute(
console/backend/app/job_queue.py:226:                async with conn.execute(
console/backend/app/job_queue.py:245:                cursor = await conn.execute(
console/backend/app/job_queue.py:247:                    INSERT INTO jobs (
console/backend/app/job_queue.py:279:                await conn.commit()
console/backend/app/job_queue.py:354:        async with self._connect() as conn, conn.execute(
console/backend/app/job_queue.py:365:        async with self._connect() as conn, conn.execute(
console/backend/app/job_queue.py:374:        async with self._connect() as conn, conn.execute(
console/backend/app/job_queue.py:382:                await conn.execute(
console/backend/app/job_queue.py:386:                await conn.commit()
console/backend/app/job_queue.py:423:            await conn.execute("DELETE FROM jobs WHERE user_id = ?", (user_id,))
console/backend/app/job_queue.py:424:            await conn.execute("DELETE FROM user_circuit_breakers WHERE user_id = ?", (user_id,))
console/backend/app/job_queue.py:425:            await conn.commit()
console/backend/app/job_queue.py:434:            await conn.execute(
console/backend/app/job_queue.py:436:                INSERT INTO user_circuit_breakers (
console/backend/app/job_queue.py:444:                ON CONFLICT(user_id) DO UPDATE SET
console/backend/app/job_queue.py:453:            await conn.commit()
console/backend/app/job_queue.py:469:            async with conn.execute(
console/backend/app/job_queue.py:474:            async with conn.execute(
console/backend/app/job_queue.py:527:            await conn.execute("PRAGMA journal_mode=WAL")
console/backend/app/job_queue.py:528:            await conn.execute("PRAGMA foreign_keys=ON")
console/backend/app/job_queue.py:529:            await conn.execute(
console/backend/app/job_queue.py:549:            await conn.execute(
console/backend/app/job_queue.py:561:            await conn.execute(
console/backend/app/job_queue.py:564:            await conn.execute(
console/backend/app/job_queue.py:570:            async with conn.execute("PRAGMA table_info(jobs)") as cursor:
console/backend/app/job_queue.py:573:                await conn.execute(
console/backend/app/job_queue.py:578:            await conn.execute(
console/backend/app/job_queue.py:582:            await conn.commit()
console/backend/app/job_queue.py:587:            async with conn.execute(
console/backend/app/job_queue.py:594:            await conn.execute(
console/backend/app/job_queue.py:596:                UPDATE jobs
console/backend/app/job_queue.py:606:            await conn.commit()
console/backend/app/job_queue.py:608:            async with conn.execute(
console/backend/app/job_queue.py:878:        async with self._connect() as conn, conn.execute(
console/backend/app/job_queue.py:893:                async with conn.execute(
console/backend/app/job_queue.py:933:            async with conn.execute(
console/backend/app/job_queue.py:1024:            await conn.execute(
console/backend/app/job_queue.py:1025:                f"UPDATE jobs SET {', '.join(assignments)} WHERE id = ?",
console/backend/app/job_queue.py:1028:            await conn.commit()
console/backend/app/job_queue.py:1035:        async with conn.execute(
console/backend/app/job_queue.py:1065:            await conn.execute(
console/backend/app/job_queue.py:1067:                INSERT INTO user_circuit_breakers (
console/backend/app/job_queue.py:1075:                ON CONFLICT(user_id) DO UPDATE SET
console/backend/app/job_queue.py:1084:            await conn.commit()
console/backend/app/job_queue.py:1098:            await conn.execute(
console/backend/app/job_queue.py:1100:                INSERT INTO user_circuit_breakers (
console/backend/app/job_queue.py:1108:                ON CONFLICT(user_id) DO UPDATE SET
console/backend/app/job_queue.py:1124:            await conn.commit()
console/backend/app/job_queue.py:1173:            result = await session.execute(
console/backend/app/job_queue.py:1207:            result = await session.execute(
console/backend/app/job_queue.py:1228:            model = TrainedModel(
console/backend/app/job_queue.py:1238:            await session.commit()

 succeeded in 444ms:
   1: """Async training job queue routes."""
   2: 
   3: from typing import Annotated
   4: 
   5: from fastapi import APIRouter, Depends, HTTPException, Request, status
   6: from sqlalchemy import select
   7: from sqlalchemy.ext.asyncio import AsyncSession
   8: 
   9: from app.auth import get_verified_user
  10: from app.database import get_db
  11: from app.job_queue import Job, QueueFullError, TooManyPendingJobsError, init_job_queue
  12: from app.models import Recording, User
  13: from app.rate_limit import TRAINING_SUBMIT_LIMIT, key_by_user, limiter, set_rate_limit_user
  14: from app.routes.billing import check_training_quota, record_usage
  15: from app.schemas import (
  16:     JobCircuitBreakerResponse,
  17:     JobResponse,
  18:     JobSubmitRequest,
  19:     JobSubmitResponse,
  20:     MessageResponse,
  21: )
  22: 
  23: router = APIRouter(prefix="/api/jobs", tags=["jobs"])
  24: 
  25: 
  26: async def _quota_user_with_rate_key(
  27:     request: Request,
  28:     current_user: Annotated[User, Depends(check_training_quota)],
  29: ) -> User:
  30:     """Resolve the user via training-quota check and stash ID for rate limiting."""
  31:     set_rate_limit_user(request, current_user.id)
  32:     return current_user
  33: 
  34: 
  35: def serialize_job(job: Job) -> JobResponse:
  36:     """Convert a queue job dataclass into an API response."""
  37:     return JobResponse(
  38:         job_id=job.id,
  39:         user_id=job.user_id,
  40:         wake_word=job.wake_word,
  41:         status=job.status.value,
  42:         created_at=job.created_at,
  43:         started_at=job.started_at,
  44:         completed_at=job.completed_at,
  45:         error=job.error,
  46:         progress_pct=job.progress_pct,
  47:         d_prime=job.d_prime,
  48:         model_id=job.model_id,
  49:     )
  50: 
  51: 
  52: async def validate_training_request(
  53:     body: JobSubmitRequest,
  54:     current_user: User,
  55:     db: AsyncSession,
  56: ) -> tuple[str, list[int], int]:
  57:     """Validate the submitted recordings for a new training job."""
  58:     wake_word = body.wake_word.strip().lower()
  59:     result = await db.execute(
  60:         select(Recording).where(
  61:             Recording.id.in_(body.recording_ids),
  62:             Recording.user_id == current_user.id,
  63:             Recording.deleted_at.is_(None),
  64:         )
  65:     )
  66:     recordings = result.scalars().all()
  67: 
  68:     if len(recordings) != len(body.recording_ids):
  69:         found_ids = {recording.id for recording in recordings}
  70:         missing = [recording_id for recording_id in body.recording_ids if recording_id not in found_ids]
  71:         raise HTTPException(
  72:             status_code=status.HTTP_404_NOT_FOUND,
  73:             detail=f"Recordings not found or not owned by you: {missing}",
  74:         )
  75: 
  76:     wrong_word = [recording.id for recording in recordings if recording.wake_word != wake_word]
  77:     if wrong_word:
  78:         raise HTTPException(
  79:             status_code=status.HTTP_400_BAD_REQUEST,
  80:             detail=f"Recordings {wrong_word} do not match wake word '{body.wake_word}'",
  81:         )
  82: 
  83:     if len(recordings) < 5:
  84:         raise HTTPException(
  85:             status_code=status.HTTP_400_BAD_REQUEST,
  86:             detail=f"Need at least 5 recordings. Got {len(recordings)}.",
  87:         )
  88: 
  89:     return wake_word, list(body.recording_ids), body.epochs
  90: 
  91: 
  92: async def submit_training_job(
  93:     body: JobSubmitRequest,
  94:     current_user: User,
  95:     db: AsyncSession,
  96: ) -> JobSubmitResponse:
  97:     """Validate and enqueue a training job."""
  98:     wake_word, recording_ids, epochs = await validate_training_request(body, current_user, db)
  99:     queue = await init_job_queue()
 100: 
 101:     try:
 102:         job_id = await queue.submit_job(
 103:             user_id=current_user.id,
 104:             wake_word=wake_word,
 105:             recording_ids=recording_ids,
 106:             epochs=epochs,
 107:         )
 108:     except TooManyPendingJobsError as exc:
 109:         raise HTTPException(
 110:             status_code=status.HTTP_429_TOO_MANY_REQUESTS,
 111:             detail=str(exc),
 112:         ) from exc
 113:     except QueueFullError as exc:
 114:         raise HTTPException(
 115:             status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
 116:             detail=str(exc),
 117:         ) from exc
 118: 
 119:     await record_usage(db, current_user.id, action="training_job")
 120:     return JobSubmitResponse(job_id=job_id, status="queued")
 121: 
 122: 
 123: async def get_owned_job_or_404(job_id: int, current_user: User) -> Job:
 124:     """Return an owned job or raise 404."""
 125:     job = await (await init_job_queue()).get_job(job_id)
 126:     if job is None or job.user_id != current_user.id:
 127:         raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Training job not found")
 128:     return job
 129: 
 130: 
 131: @router.post("", response_model=JobSubmitResponse, status_code=status.HTTP_202_ACCEPTED)
 132: @limiter.limit(TRAINING_SUBMIT_LIMIT, key_func=key_by_user)
 133: async def create_job(
 134:     request: Request,
 135:     body: JobSubmitRequest,
 136:     current_user: Annotated[User, Depends(_quota_user_with_rate_key)],
 137:     db: Annotated[AsyncSession, Depends(get_db)],
 138: ) -> JobSubmitResponse:
 139:     """Submit a new training job."""
 140:     return await submit_training_job(body, current_user, db)
 141: 
 142: 
 143: @router.get("", response_model=list[JobResponse])
 144: async def list_jobs(
 145:     current_user: Annotated[User, Depends(get_verified_user)],
 146: ) -> list[JobResponse]:
 147:     """List the current user's training jobs."""
 148:     jobs = await (await init_job_queue()).list_jobs(current_user.id)
 149:     return [serialize_job(job) for job in jobs]
 150: 
 151: 
 152: @router.post("/resume", response_model=MessageResponse)
 153: async def resume_jobs(
 154:     current_user: Annotated[User, Depends(get_verified_user)],
 155: ) -> MessageResponse:
 156:     """Manually resume a user's paused queue after circuit breaker activation."""
 157:     await (await init_job_queue()).resume_user(current_user.id)
 158:     return MessageResponse(message="Training queue resumed")
 159: 
 160: 
 161: @router.get("/circuit-breaker/state", response_model=JobCircuitBreakerResponse)
 162: async def get_circuit_breaker_state(
 163:     current_user: Annotated[User, Depends(get_verified_user)],
 164: ) -> JobCircuitBreakerResponse:
 165:     """Return the current user's circuit breaker state."""
 166:     breaker = await (await init_job_queue()).get_circuit_breaker(current_user.id)
 167:     return JobCircuitBreakerResponse(
 168:         consecutive_failures=breaker.consecutive_failures,
 169:         paused=breaker.paused,
 170:         next_attempt_at=breaker.next_attempt_at,
 171:         last_failure_at=breaker.last_failure_at,
 172:         pause_reason=breaker.pause_reason,
 173:     )
 174: 
 175: 
 176: @router.get("/{job_id}", response_model=JobResponse)
 177: async def get_job(
 178:     job_id: int,
 179:     current_user: Annotated[User, Depends(get_verified_user)],
 180: ) -> JobResponse:
 181:     """Return one training job."""
 182:     job = await get_owned_job_or_404(job_id, current_user)
 183:     return serialize_job(job)
 184: 
 185: 
 186: @router.delete("/{job_id}", response_model=MessageResponse)
 187: async def cancel_job(
 188:     job_id: int,
 189:     current_user: Annotated[User, Depends(get_verified_user)],
 190: ) -> MessageResponse:
 191:     """Cancel a pending or running training job."""
 192:     await get_owned_job_or_404(job_id, current_user)
 193:     cancelled = await (await init_job_queue()).cancel_job(job_id)
 194:     if not cancelled:
 195:         raise HTTPException(
 196:             status_code=status.HTTP_409_CONFLICT,
 197:             detail="Training job can no longer be cancelled",
 198:         )
 199:     return MessageResponse(message="Training job cancellation requested")

 succeeded in 616ms:
   1: """Persistent async training job queue with circuit breaker protection."""
   2: 
   3: from __future__ import annotations
   4: 
   5: import asyncio
   6: import json
   7: import logging
   8: import shutil
   9: import tempfile
  10: import threading
  11: from collections.abc import AsyncIterator
  12: from contextlib import asynccontextmanager, suppress
  13: from dataclasses import dataclass, field
  14: from datetime import datetime, timedelta, timezone
  15: from enum import Enum
  16: from pathlib import Path
  17: from typing import Any
  18: 
  19: import aiosqlite
  20: from sqlalchemy import select
  21: 
  22: from app.config import settings
  23: from app.database import async_session_factory
  24: from app.models import Recording, TrainedModel, User
  25: from app.monitoring import log_exception
  26: from app.services.training_service import TrainingCancelledError, run_training_job_sync
  27: from app.storage import build_companion_config_identifier, build_model_key, get_storage
  28: 
  29: logger = logging.getLogger("violawake.jobs")
  30: 
  31: QUEUE_MAX_SIZE = 50
  32: PER_USER_MAX_PENDING = 3
  33: MAX_SUBSCRIBERS_PER_JOB = 5
  34: FAILURE_THRESHOLD = 3
  35: FAILURE_BACKOFF_SECONDS = 300
  36: ACCOUNT_DELETE_CANCEL_TIMEOUT_SECONDS = 30.0
  37: 
  38: 
  39: def _utcnow() -> datetime:
  40:     return datetime.now(timezone.utc)
  41: 
  42: 
  43: def _serialize_datetime(value: datetime | None) -> str | None:
  44:     if value is None:
  45:         return None
  46:     return value.astimezone(timezone.utc).isoformat()
  47: 
  48: 
  49: def _deserialize_datetime(value: str | None) -> datetime | None:
  50:     if not value:
  51:         return None
  52:     parsed = datetime.fromisoformat(value)
  53:     if parsed.tzinfo is None:
  54:         return parsed.replace(tzinfo=timezone.utc)
  55:     return parsed.astimezone(timezone.utc)
  56: 
  57: 
  58: class JobStatus(str, Enum):
  59:     """Persisted job states."""
  60: 
  61:     PENDING = "pending"
  62:     RUNNING = "running"
  63:     COMPLETED = "completed"
  64:     FAILED = "failed"
  65:     CANCELLED = "cancelled"
  66: 
  67: 
  68: # Priority values assigned by subscription tier.
  69: PRIORITY_FREE = 0
  70: PRIORITY_DEVELOPER = 10
  71: PRIORITY_BUSINESS = 20
  72: PRIORITY_ENTERPRISE = 30
  73: 
  74: 
  75: @dataclass(slots=True)
  76: class Job:
  77:     """Persisted training job metadata."""
  78: 
  79:     id: int
  80:     user_id: int
  81:     wake_word: str
  82:     status: JobStatus
  83:     created_at: datetime
  84:     started_at: datetime | None = None
  85:     completed_at: datetime | None = None
  86:     error: str | None = None
  87:     progress_pct: float = 0.0
  88:     recording_ids: list[int] = field(default_factory=list)
  89:     epochs: int = 80
  90:     model_id: int | None = None
  91:     d_prime: float | None = None
  92:     priority: int = PRIORITY_FREE
  93: 
  94: 
  95: @dataclass(slots=True)
  96: class CircuitBreakerState:
  97:     """Per-user failure tracking."""
  98: 
  99:     user_id: int
 100:     consecutive_failures: int = 0
 101:     paused: bool = False
 102:     next_attempt_at: datetime | None = None
 103:     last_failure_at: datetime | None = None
 104:     pause_reason: str | None = None
 105: 
 106: 
 107: _TIER_PRIORITY: dict[str, int] = {
 108:     "free": PRIORITY_FREE,
 109:     "developer": PRIORITY_DEVELOPER,
 110:     "business": PRIORITY_BUSINESS,
 111:     "enterprise": PRIORITY_ENTERPRISE,
 112: }
 113: 
 114: 
 115: async def _resolve_user_priority(user_id: int) -> int:
 116:     """Return the queue priority for a user based on their subscription tier."""
 117:     from app.models import Subscription
 118: 
 119:     async with async_session_factory() as session:
 120:         result = await session.execute(
 121:             select(Subscription.tier).where(Subscription.user_id == user_id)
 122:         )
 123:         row = result.first()
 124:         tier = row[0] if row else "free"
 125: 
 126:     return _TIER_PRIORITY.get(str(tier), PRIORITY_FREE)
 127: 
 128: 
 129: class QueueFullError(RuntimeError):
 130:     """Raised when the persistent queue is at capacity."""
 140: 
 141: class JobQueue:
 142:     """Persistent async training job queue."""
 143: 
 144:     def __init__(
 145:         self,
 146:         *,
 147:         db_path: Path | None = None,
 148:         max_concurrent: int = 2,
 149:         max_pending: int = QUEUE_MAX_SIZE,
 150:     ) -> None:
 151:         self._db_path = db_path or (settings.data_dir / "job_queue.db")
 152:         self._queue: asyncio.Queue[int] = asyncio.Queue(maxsize=max_pending)
 153:         self._semaphore = asyncio.Semaphore(max_concurrent)
 154:         self._subscribers: dict[int, list[asyncio.Queue[dict[str, Any]]]] = {}
 155:         self._queued_job_ids: set[int] = set()
 156:         self._running_job_ids: set[int] = set()
 157:         self._cancel_events: dict[int, threading.Event] = {}
 158:         self._inflight_tasks: set[asyncio.Task[None]] = set()
 159:         self._retry_tasks: dict[int, asyncio.Task[None]] = {}
 160:         self._submission_lock = asyncio.Lock()
 161:         self._state_lock = asyncio.Lock()
 162:         self._refill_lock = asyncio.Lock()
 163:         self._worker_task: asyncio.Task[None] | None = None
 164:         self._closed = False
 165: 
 166:     async def start(self) -> None:
 167:         """Initialize persistence and start the dispatcher loop."""
 168:         await self._initialize_db()
 169:         await self._resume_jobs()
 170:         self._worker_task = asyncio.create_task(self._worker_loop(), name="job-queue-worker")
 171:         await self._fill_queue_from_db()
 172:         logger.info("Job queue started with max_concurrent=%s", settings.max_concurrent_jobs)
 173: 
 174:     async def shutdown(self) -> None:
 175:         """Stop the dispatcher loop and cancel outstanding retry timers."""
 176:         self._closed = True
 177:         if self._worker_task is not None:
 178:             self._worker_task.cancel()
 179:             with suppress(asyncio.CancelledError):
 180:                 await self._worker_task
 181:             self._worker_task = None
 182: 
 183:         for cancel_event in list(self._cancel_events.values()):
 184:             cancel_event.set()
 185: 
 186:         if self._inflight_tasks:
 187:             done, pending = await asyncio.wait(list(self._inflight_tasks), timeout=15)
 188:             for task in pending:
 189:                 task.cancel()
 190:             for task in done:
 191:                 with suppress(asyncio.CancelledError):
 192:                     await task
 193: 
 194:         for task in list(self._retry_tasks.values()):
 195:             task.cancel()
 196:         for task in list(self._retry_tasks.values()):
 197:             with suppress(asyncio.CancelledError):
 198:                 await task
 199:         self._retry_tasks.clear()
 200: 
 201:     async def submit_job(
 202:         self,
 203:         *,
 204:         user_id: int,
 205:         wake_word: str,
 206:         recording_ids: list[int],
 207:         epochs: int,
 208:         priority: int | None = None,
 209:     ) -> int:
 210:         """Persist a new training job and enqueue it when capacity allows.
 211: 
 212:         When *priority* is not supplied it is resolved automatically from the
 213:         user's subscription tier (free=0, developer=5, business=10).
 214:         """
 215:         if await self._pending_count() >= self._queue.maxsize:
 216:             raise QueueFullError("Training queue is full. Please try again later.")
 217: 
 218:         if priority is None:
 219:             priority = await _resolve_user_priority(user_id)
 220: 
 221:         created_at = _utcnow()
 222:         payload = json.dumps(recording_ids)
 223: 
 224:         async with self._submission_lock:
 225:             async with self._connect() as conn:
 226:                 async with conn.execute(
 227:                     """
 228:                     SELECT COUNT(*) AS count
 229:                     FROM jobs
 230:                     WHERE user_id = ? AND status IN (?, ?)
 231:                     """,
 232:                     (
 233:                         user_id,
 234:                         JobStatus.PENDING.value,
 235:                         JobStatus.RUNNING.value,
 236:                     ),
 237:                 ) as cursor:
 238:                     row = await cursor.fetchone()
 239:                 active_job_count = int(row["count"]) if row is not None else 0
 240:                 if active_job_count >= PER_USER_MAX_PENDING:
 241:                     raise TooManyPendingJobsError(
 242:                         "Too many pending jobs. Wait for current jobs to complete."
 243:                     )
 244: 
 245:                 cursor = await conn.execute(
 246:                     """
 247:                     INSERT INTO jobs (
 248:                         user_id,
 249:                         wake_word,
 250:                         status,
 251:                         created_at,
 252:                         started_at,
 253:                         completed_at,
 254:                         error,
 255:                         progress_pct,
 256:                         recording_ids,
 257:                         epochs,
 258:                         model_id,
 259:                         d_prime,
 260:                         priority
 261:                     ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
 262:                     """,
 263:                     (
 264:                         user_id,
 265:                         wake_word,
 266:                         JobStatus.PENDING.value,
 267:                         _serialize_datetime(created_at),
 268:                         None,
 269:                         None,
 270:                         None,
 271:                         0.0,
 272:                         payload,
 273:                         epochs,
 274:                         None,
 275:                         None,
 276:                         priority,
 277:                     ),
 278:                 )
 279:                 await conn.commit()
 280:                 job_id = int(cursor.lastrowid)
 281: 
 282:         logger.info(
 283:             "Queued training job %s for user %s (priority=%s)",
 284:             job_id,
 285:             user_id,
 286:             priority,
 287:         )
 288:         await self._fill_queue_from_db()
 289:         # Publish an initial PENDING event so SSE subscribers immediately see
 290:         # their queue position after submission.
 291:         queue_position = await self._queue_position(job_id)
 292:         await self._publish(
 293:             job_id,
 294:             {
 295:                 "status": JobStatus.PENDING.value,
 296:                 "progress": 0.0,
 297:                 "epoch": 0,
 298:                 "total_epochs": epochs,
 299:                 "train_loss": 0.0,
 300:                 "val_loss": 0.0,
 301:                 "message": "Queued for training.",
 302:                 "error": None,
 303:                 "d_prime": None,
 304:                 "model_id": None,
 305:                 "queue_position": queue_position,
 306:             },
 307:         )
 308:         return job_id
 309: 
 310:     async def cancel_job(self, job_id: int) -> bool:
 311:         """Cancel a pending or running job."""
 312:         job = await self.get_job(job_id)
 313:         if job is None:
 314:             return False
 315:         if job.status in {JobStatus.COMPLETED, JobStatus.FAILED, JobStatus.CANCELLED}:
 316:             return False
 317: 
 318:         if job.status is JobStatus.RUNNING:
 319:             async with self._state_lock:
 320:                 cancel_event = self._cancel_events.get(job_id)
 321:             if cancel_event is not None:
 322:                 cancel_event.set()
 323:             logger.info("Cancellation requested for running job %s", job_id)
 324:             return True
 325: 
 326:         completed_at = _utcnow()
 327:         await self._update_job(
 328:             job_id,
 329:             status=JobStatus.CANCELLED,
 330:             completed_at=completed_at,
 331:             error="Cancelled by user",
 332:         )
 333:         await self._publish(
 334:             job_id,
 335:             {
 336:                 "status": JobStatus.CANCELLED.value,
 337:                 "progress": job.progress_pct,
 338:                 "epoch": 0,
 339:                 "total_epochs": job.epochs,
 340:                 "train_loss": 0.0,
 341:                 "val_loss": 0.0,
 342:                 "message": "Training cancelled.",
 343:                 "error": "Cancelled by user",
 344:                 "d_prime": job.d_prime,
 345:                 "model_id": job.model_id,
 346:                 "queue_position": None,
 347:             },
 348:         )
 349:         await self._fill_queue_from_db()
 350:         return True
 520:             return
 521:         if not listeners:
 522:             self._subscribers.pop(job_id, None)
 523: 
 524:     async def _initialize_db(self) -> None:
 525:         self._db_path.parent.mkdir(parents=True, exist_ok=True)
 526:         async with self._connect() as conn:
 527:             await conn.execute("PRAGMA journal_mode=WAL")
 528:             await conn.execute("PRAGMA foreign_keys=ON")
 529:             await conn.execute(
 530:                 """
 531:                 CREATE TABLE IF NOT EXISTS jobs (
 532:                     id INTEGER PRIMARY KEY AUTOINCREMENT,
 533:                     user_id INTEGER NOT NULL,
 534:                     wake_word TEXT NOT NULL,
 535:                     status TEXT NOT NULL,
 536:                     created_at TEXT NOT NULL,
 537:                     started_at TEXT,
 538:                     completed_at TEXT,
 539:                     error TEXT,
 540:                     progress_pct REAL NOT NULL DEFAULT 0,
 541:                     recording_ids TEXT NOT NULL,
 542:                     epochs INTEGER NOT NULL DEFAULT 80,
 543:                     model_id INTEGER,
 544:                     d_prime REAL,
 545:                     priority INTEGER NOT NULL DEFAULT 0
 546:                 )
 547:                 """
 548:             )
 549:             await conn.execute(
 550:                 """
 551:                 CREATE TABLE IF NOT EXISTS user_circuit_breakers (
 552:                     user_id INTEGER PRIMARY KEY,
 553:                     consecutive_failures INTEGER NOT NULL DEFAULT 0,
 554:                     paused INTEGER NOT NULL DEFAULT 0,
 555:                     next_attempt_at TEXT,
 556:                     last_failure_at TEXT,
 557:                     pause_reason TEXT
 558:                 )
 559:                 """
 560:             )
 561:             await conn.execute(
 562:                 "CREATE INDEX IF NOT EXISTS idx_jobs_user_created ON jobs(user_id, created_at DESC)"
 563:             )
 564:             await conn.execute(
 565:                 "CREATE INDEX IF NOT EXISTS idx_jobs_status_created ON jobs(status, created_at ASC)"
 566:             )
 567: 
 568:             # Migration: add priority column to existing databases that predate
 569:             # this feature.  Must run BEFORE the priority index creation below.
 570:             async with conn.execute("PRAGMA table_info(jobs)") as cursor:
 571:                 columns = {row["name"] async for row in cursor}
 572:             if "priority" not in columns:
 573:                 await conn.execute(
 574:                     "ALTER TABLE jobs ADD COLUMN priority INTEGER NOT NULL DEFAULT 0"
 575:                 )
 576:                 logger.info("Migrated jobs table: added priority column")
 577: 
 578:             await conn.execute(
 579:                 "CREATE INDEX IF NOT EXISTS idx_jobs_priority_created ON jobs(status, priority DESC, created_at ASC)"
 580:             )
 581: 
 582:             await conn.commit()
 583: 
 584:     async def _resume_jobs(self) -> None:
 585:         running_user_ids: set[int] = set()
 586:         async with self._connect() as conn:
 587:             async with conn.execute(
 588:                 "SELECT DISTINCT user_id FROM jobs WHERE status = ?",
 589:                 (JobStatus.RUNNING.value,),
 590:             ) as cursor:
 591:                 rows = await cursor.fetchall()
 592:                 running_user_ids = {int(row["user_id"]) for row in rows}
 593: 
 594:             await conn.execute(
 595:                 """
 596:                 UPDATE jobs
 597:                 SET status = ?, started_at = NULL, error = NULL
 598:                 WHERE status IN (?, ?)
 599:                 """,
 600:                 (
 601:                     JobStatus.PENDING.value,
 602:                     JobStatus.PENDING.value,
 603:                     JobStatus.RUNNING.value,
 604:                 ),
 605:             )
 606:             await conn.commit()
 607: 
 608:             async with conn.execute(
 609:                 """
 610:                 SELECT user_id, next_attempt_at, paused
 650:         try:
 651:             job = await self.get_job(job_id)
 652:             if job is None:
 653:                 return
 654:             if job.status is not JobStatus.PENDING:
 655:                 return
 656: 
 657:             breaker = await self.get_circuit_breaker(job.user_id)
 658:             now = _utcnow()
 659:             if breaker.paused:
 660:                 logger.warning("Skipping job %s because user %s queue is paused", job_id, job.user_id)
 661:                 return
 662:             if breaker.next_attempt_at is not None and breaker.next_attempt_at > now:
 663:                 delay = (breaker.next_attempt_at - now).total_seconds()
 664:                 self._schedule_retry_fill(job.user_id, delay)
 665:                 logger.info(
 666:                     "Delaying job %s for user %s due to failure backoff (%ss)",
 667:                     job_id,
 668:                     job.user_id,
 669:                     round(delay, 2),
 670:                 )
 671:                 return
 672: 
 673:             cancel_event = threading.Event()
 674:             async with self._state_lock:
 675:                 self._cancel_events[job_id] = cancel_event
 676: 
 677:             await self._update_job(
 678:                 job_id,
 679:                 status=JobStatus.RUNNING,
 680:                 started_at=now,
 681:                 error=None,
 682:             )
 683:             await self._publish(
 684:                 job_id,
 685:                 {
 686:                     "status": JobStatus.RUNNING.value,
 687:                     "progress": job.progress_pct,
 688:                     "epoch": 0,
 689:                     "total_epochs": job.epochs,
 690:                     "train_loss": 0.0,
 691:                     "val_loss": 0.0,
 692:                     "message": "Training started.",
 693:                     "error": None,
 694:                     "d_prime": job.d_prime,
 695:                     "model_id": job.model_id,
 696:                     "queue_position": None,
 697:                 },
 698:             )
 699: 
 700:             recording_paths = await self._load_recording_paths(job.user_id, job.recording_ids)
 701:             if len(recording_paths) < 5:
 702:                 raise RuntimeError(f"No valid recordings found for training job {job_id}")
 703: 
 704:             # Resolve negatives corpus for paid tiers
 705:             negatives_dir = await self._resolve_negatives_dir(job.user_id)
 706: 
 707:             output_dir = Path(tempfile.mkdtemp(prefix=f"violawake_job_{job.id}_", dir=str(settings.tmp_dir)))
 708:             output_path = output_dir / f"{job.wake_word}_{job.id}_{int(now.timestamp())}.onnx"
 709: 
 710:             loop = asyncio.get_running_loop()
 711: 
 712:             def _on_progress(event: dict[str, Any]) -> None:
 713:                 future = asyncio.run_coroutine_threadsafe(
 714:                     self._handle_progress_event(job_id, job.epochs, event),
 715:                     loop,
 716:                 )
 717:                 future.result(timeout=10)
 718: 
 719:             artifact = await asyncio.to_thread(
 720:                 run_training_job_sync,
 721:                 job_id=job.id,
 722:                 wake_word=job.wake_word,
 723:                 recording_identifiers=recording_paths,
 724:                 output_path=output_path,
 725:                 epochs=job.epochs,
 726:                 timeout_seconds=settings.training_timeout,
 727:                 progress_callback=_on_progress,
 728:                 is_cancelled=cancel_event.is_set,
 729:                 negatives_dir=negatives_dir,
 730:             )
 731: 
 732:             storage = get_storage()
 733:             model_key = build_model_key(job.user_id, artifact.local_path.name)
 734:             storage.upload(
 735:                 model_key,
 736:                 artifact.local_path.read_bytes(),
 737:                 "application/octet-stream",
 738:             )
 739:             if artifact.config_bytes is not None:
 740:                 storage.upload(
 741:                     build_companion_config_identifier(model_key),
 742:                     artifact.config_bytes,
 743:                     "application/json",
 744:                 )
 745: 
 746:             model_id = await self._create_model_record(
 747:                 user_id=job.user_id,
 748:                 wake_word=job.wake_word,
 749:                 file_path=model_key,
 750:                 config_json=artifact.config_json,
 751:                 d_prime=artifact.d_prime,
 752:                 size_bytes=artifact.size_bytes,
 753:             )
 754: 
 755:             completed_at = _utcnow()
 756:             await self._update_job(
 757:                 job_id,
 758:                 status=JobStatus.COMPLETED,
 759:                 progress_pct=100.0,
 760:                 completed_at=completed_at,
 761:                 error=None,
 762:                 model_id=model_id,
 763:                 d_prime=artifact.d_prime,
 764:             )
 765:             await self._record_success(job.user_id)
 766: 
 767:             # Schedule post-training recording deletion (privacy: recordings
 768:             # are deleted after training per the privacy FAQ).
 769:             await self._schedule_recording_cleanup(job.recording_ids)
 770: 
 771:             await self._publish(
 772:                 job_id,
 773:                 {
 774:                     "status": JobStatus.COMPLETED.value,
 775:                     "progress": 100.0,
 776:                     "epoch": job.epochs,
 777:                     "total_epochs": job.epochs,
 778:                     "train_loss": 0.0,
 779:                     "val_loss": 0.0,
 780:                     "message": "Training complete.",
 781:                     "error": None,
 782:                     "d_prime": artifact.d_prime,
 783:                     "model_id": model_id,
 784:                     "queue_position": None,
 785:                 },
 786:             )
 787:             logger.info("Training job %s completed for user %s", job_id, job.user_id)
 788: 
 789:             # Best-effort training-complete email notification.
 790:             try:
 791:                 from app.email_service import get_email_service
 792: 
 793:                 email_svc = get_email_service()
 794:                 if email_svc.enabled:
 795:                     async with async_session_factory() as session:
 796:                         user = await session.get(User, job.user_id)
 797:                     if user is not None:
 798:                         download_url = f"/models/{model_id}/download"
 799:                         await email_svc.send_training_complete(
 800:                             to=user.email,
 801:                             model_name=job.wake_word,
 802:                             download_url=download_url,
 803:                         )
 804:             except Exception as email_exc:
 805:                 log_exception(logger, email_exc, message="Training-complete email failed", source="email")
 806: 
 807:         except TrainingCancelledError as exc:
 808:             current_job = await self.get_job(job_id)
 809:             completed_at = _utcnow()
 810:             progress_pct = current_job.progress_pct if current_job is not None else 0.0
 811:             await self._update_job(
 812:                 job_id,
 813:                 status=JobStatus.CANCELLED,
 814:                 completed_at=completed_at,
 815:                 error=str(exc),
 816:             )
 817:             await self._publish(
 818:                 job_id,
 819:                 {
 820:                     "status": JobStatus.CANCELLED.value,
 821:                     "progress": progress_pct,
 822:                     "epoch": 0,
 823:                     "total_epochs": current_job.epochs if current_job is not None else 0,
 824:                     "train_loss": 0.0,
 825:                     "val_loss": 0.0,
 826:                     "message": "Training cancelled.",
 827:                     "error": str(exc),
 828:                     "d_prime": current_job.d_prime if current_job is not None else None,
 829:                     "model_id": current_job.model_id if current_job is not None else None,
 830:                     "queue_position": None,
 831:                 },
 832:             )
 833:             logger.info("Training job %s cancelled", job_id)
 834:         except Exception as exc:
 835:             current_job = await self.get_job(job_id)
 836:             completed_at = _utcnow()
 837:             await self._update_job(
 838:                 job_id,
 839:                 status=JobStatus.FAILED,
 840:                 completed_at=completed_at,
 841:                 error=str(exc),
 842:             )
 843:             user_id = current_job.user_id if current_job is not None else None
 844:             if user_id is not None:
 845:                 await self._record_failure(user_id, str(exc))
 846:             await self._publish(
 847:                 job_id,
 848:                 {
 849:                     "status": JobStatus.FAILED.value,
 850:                     "progress": current_job.progress_pct if current_job is not None else 0.0,
 851:                     "epoch": 0,
 852:                     "total_epochs": current_job.epochs if current_job is not None else 0,
 853:                     "train_loss": 0.0,
 854:                     "val_loss": 0.0,
 855:                     "message": "Training failed.",
 856:                     "error": str(exc),
 857:                     "d_prime": current_job.d_prime if current_job is not None else None,
 858:                     "model_id": current_job.model_id if current_job is not None else None,
 859:                     "queue_position": None,
 860:                 },
 861:             )
 862:             log_exception(
 863:                 logger,
 864:                 exc,
 865:                 message="Training job failed",
 866:                 source="job_queue",
 867:                 extra={"job_id": job_id},
 868:             )
 869:         finally:
 870:             async with self._state_lock:
 940:                 (JobStatus.PENDING.value,),
 941:             ) as cursor:
 942:                 rows = await cursor.fetchall()
 943: 
 944:         for position, row in enumerate(rows, start=1):
 945:             if int(row["id"]) == job_id:
 946:                 return position
 947:         return None
 948: 
 949:     async def _handle_progress_event(
 950:         self,
 951:         job_id: int,
 952:         epochs: int,
 953:         event: dict[str, Any],
 954:     ) -> None:
 955:         progress = float(event.get("progress", 0.0))
 956:         await self._update_job(job_id, progress_pct=progress)
 957:         await self._publish(
 958:             job_id,
 959:             {
 960:                 "status": str(event.get("status", JobStatus.RUNNING.value)),
 961:                 "progress": progress,
 962:                 "epoch": int(event.get("epoch", 0)),
 963:                 "total_epochs": int(event.get("total_epochs", epochs)),
 964:                 "train_loss": float(event.get("train_loss", 0.0)),
 965:                 "val_loss": float(event.get("val_loss", 0.0)),
 966:                 "message": str(event.get("message", "")),
 967:                 "error": event.get("error"),
 968:                 "d_prime": event.get("d_prime"),
 969:                 "model_id": event.get("model_id"),
 970:                 "queue_position": None,  # running jobs have no queue position
 971:             },
 972:         )
 973: 
 974:     async def _publish(self, job_id: int, event: dict[str, Any]) -> None:
 975:         queues = list(self._subscribers.get(job_id, []))
 976:         for queue in queues:
 977:             try:
 978:                 queue.put_nowait(event)
 979:             except asyncio.QueueFull:
 980:                 logger.warning("Dropping event for job %s because subscriber queue is full", job_id)
 981: 
 982:     async def _update_job(
 983:         self,
 984:         job_id: int,
 985:         *,
 986:         status: JobStatus | None = None,
 987:         progress_pct: float | None = None,
 988:         started_at: datetime | None = None,
 989:         completed_at: datetime | None = None,
 990:         error: str | None = None,
 991:         model_id: int | None = None,
 992:         d_prime: float | None = None,
 993:     ) -> None:
 994:         assignments: list[str] = []
 995:         values: list[Any] = []
 996: 
 997:         if status is not None:
 998:             assignments.append("status = ?")
 999:             values.append(status.value)
1000:         if progress_pct is not None:
1001:             assignments.append("progress_pct = ?")
1002:             values.append(progress_pct)
1003:         if started_at is not None:
1004:             assignments.append("started_at = ?")
1005:             values.append(_serialize_datetime(started_at))
1006:         if completed_at is not None:
1007:             assignments.append("completed_at = ?")
1008:             values.append(_serialize_datetime(completed_at))
1009:         if error is not None or status in {JobStatus.RUNNING, JobStatus.COMPLETED, JobStatus.CANCELLED}:
1010:             assignments.append("error = ?")
1011:             values.append(error)
1012:         if model_id is not None:
1013:             assignments.append("model_id = ?")
1014:             values.append(model_id)
1015:         if d_prime is not None:
1016:             assignments.append("d_prime = ?")
1017:             values.append(d_prime)
1018: 
1019:         if not assignments:
1020:             return
1021: 
1022:         values.append(job_id)
1023:         async with self._connect() as conn:
1024:             await conn.execute(
1025:                 f"UPDATE jobs SET {', '.join(assignments)} WHERE id = ?",
1026:                 values,
1027:             )
1028:             await conn.commit()
1029: 
1030:     async def _get_circuit_breaker_with_conn(
1031:         self,
1032:         conn: aiosqlite.Connection,
1033:         user_id: int,
1034:     ) -> CircuitBreakerState:
1035:         async with conn.execute(
1036:             """
1037:             SELECT
1038:                 user_id,
1039:                 consecutive_failures,
1040:                 paused,
1230:                 wake_word=wake_word,
1231:                 file_path=str(file_path),
1232:                 config_json=config_json,
1233:                 d_prime=d_prime,
1234:                 size_bytes=size_bytes,
1235:             )
1236:             session.add(model)
1237:             await session.flush()
1238:             await session.commit()
1239:             return int(model.id)
1240: 
1241:     def _row_to_job(self, row: aiosqlite.Row) -> Job:
1242:         # priority column was added via migration; guard against missing column
1243:         # in case _row_to_job is called from a test that does not run _initialize_db.
1244:         try:
1245:             priority = int(row["priority"])
1246:         except (IndexError, KeyError):
1247:             priority = PRIORITY_FREE
1248:         return Job(
1249:             id=int(row["id"]),
1250:             user_id=int(row["user_id"]),
1251:             wake_word=str(row["wake_word"]),
1252:             status=JobStatus(str(row["status"])),
1253:             created_at=_deserialize_datetime(row["created_at"]) or _utcnow(),
1254:             started_at=_deserialize_datetime(row["started_at"]),
1255:             completed_at=_deserialize_datetime(row["completed_at"]),
1256:             error=row["error"],
1257:             progress_pct=float(row["progress_pct"]),
1258:             recording_ids=[int(value) for value in json.loads(row["recording_ids"])],
1259:             epochs=int(row["epochs"]),
1260:             model_id=int(row["model_id"]) if row["model_id"] is not None else None,
1261:             d_prime=float(row["d_prime"]) if row["d_prime"] is not None else None,
1262:             priority=priority,
1263:         )
1264: 
1265:     @asynccontextmanager
1266:     async def _connect(self) -> AsyncIterator[aiosqlite.Connection]:
1267:         connection = await aiosqlite.connect(self._db_path, timeout=30)
1268:         connection.row_factory = aiosqlite.Row
1269:         try:
1270:             yield connection
1271:         finally:
1272:             await connection.close()
1273: 
1274: 
1275: _job_queue: JobQueue | None = None

codex
The legacy `/api/training/status/{id}` endpoint delegates to `get_owned_job_or_404`, and that in turn delegates to `JobQueue.get_job()`. That points toward SQLite as the API source, not `training_jobs`; I’m checking the exact DB accessors and Postgres writebacks now.
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$i=0; Get-Content '"'console/backend/app/job_queue.py' | ForEach-Object { "'$i++; if (($i -ge 350 -and $i -le 430) -or ($i -ge 870 -and $i -le 940) -or ($i -ge 1150 -and $i -le 1240)) { '"'{0,4}: {1}' -f "'$i, $_ } }' in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command "rg -n \"TrainingJob|training_jobs|CREATE TABLE.*training_jobs|op\\.create_table\\('training_jobs'|drop_table|truncate|DROP|DELETE FROM training_jobs|op\\.execute|op\\.drop_table|op\\.rename_table|op\\.alter_column\" console/backend/alembic/versions console/backend/app -S" in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command "Get-ChildItem 'console/backend/alembic/versions' -File | Sort-Object Name | Select-Object -ExpandProperty Name" in J:\CLAUDE\PROJECTS\Wakeword
 succeeded in 616ms:
console/backend/alembic/versions\20260328_0001_b2c3d4e5f6a7_add_teams.py:59:    op.drop_table("team_members")
console/backend/alembic/versions\20260328_0001_b2c3d4e5f6a7_add_teams.py:60:    op.drop_table("teams")
console/backend/alembic/versions\20260507_0001_d4e5f6a7b8c9_add_processed_stripe_events_table.py:35:    op.drop_table("processed_stripe_events")
console/backend/app\routes\auth.py:28:from app.models import Recording, Subscription, TrainedModel, TrainingJob, UsageRecord, User
console/backend/app\routes\auth.py:419:    await db.execute(delete(TrainingJob).where(TrainingJob.user_id == current_user.id))
console/backend/alembic/versions\20260326_0001_a1b2c3d4e5f6_initial_schema.py:47:    # Created before training_jobs because training_jobs has a FK to trained_models.
console/backend/alembic/versions\20260326_0001_a1b2c3d4e5f6_initial_schema.py:60:    # --- training_jobs ---
console/backend/alembic/versions\20260326_0001_a1b2c3d4e5f6_initial_schema.py:62:        "training_jobs",
console/backend/alembic/versions\20260326_0001_a1b2c3d4e5f6_initial_schema.py:117:    op.drop_table("usage_records")
console/backend/alembic/versions\20260326_0001_a1b2c3d4e5f6_initial_schema.py:118:    op.drop_table("subscriptions")
console/backend/alembic/versions\20260326_0001_a1b2c3d4e5f6_initial_schema.py:119:    op.drop_table("training_jobs")
console/backend/alembic/versions\20260326_0001_a1b2c3d4e5f6_initial_schema.py:120:    op.drop_table("trained_models")
console/backend/alembic/versions\20260326_0001_a1b2c3d4e5f6_initial_schema.py:121:    op.drop_table("recordings")
console/backend/alembic/versions\20260326_0001_a1b2c3d4e5f6_initial_schema.py:122:    op.drop_table("users")
console/backend/app\models.py:30:    training_jobs: Mapped[list[TrainingJob]] = relationship(back_populates="user", cascade="all, delete-orphan")
console/backend/app\models.py:82:class TrainingJob(Base):
console/backend/app\models.py:83:    __tablename__ = "training_jobs"
console/backend/app\models.py:97:    user: Mapped[User] = relationship(back_populates="training_jobs")

 succeeded in 799ms:
20260326_0001_a1b2c3d4e5f6_initial_schema.py
20260328_0001_b2c3d4e5f6a7_add_teams.py
20260405_0001_c3d4e5f6a7b8_add_login_lockout_and_soft_delete.py
20260507_0001_d4e5f6a7b8c9_add_processed_stripe_events_table.py

 succeeded in 832ms:
 350:         return True
 351: 
 352:     async def get_job(self, job_id: int) -> Job | None:
 353:         """Return a persisted job by ID."""
 354:         async with self._connect() as conn, conn.execute(
 355:             "SELECT * FROM jobs WHERE id = ?",
 356:             (job_id,),
 357:         ) as cursor:
 358:             row = await cursor.fetchone()
 359:         if row is None:
 360:             return None
 361:         return self._row_to_job(row)
 362: 
 363:     async def list_jobs(self, user_id: int) -> list[Job]:
 364:         """List persisted jobs for a user, newest first."""
 365:         async with self._connect() as conn, conn.execute(
 366:             "SELECT * FROM jobs WHERE user_id = ? ORDER BY created_at DESC, id DESC",
 367:             (user_id,),
 368:         ) as cursor:
 369:             rows = await cursor.fetchall()
 370:         return [self._row_to_job(row) for row in rows]
 371: 
 372:     async def delete_jobs_for_user(self, user_id: int) -> int:
 373:         """Cancel and delete all persisted jobs for a user."""
 374:         async with self._connect() as conn, conn.execute(
 375:             "SELECT id, status FROM jobs WHERE user_id = ?",
 376:             (user_id,),
 377:         ) as cursor:
 378:             rows = await cursor.fetchall()
 379: 
 380:         if not rows:
 381:             async with self._connect() as conn:
 382:                 await conn.execute(
 383:                     "DELETE FROM user_circuit_breakers WHERE user_id = ?",
 384:                     (user_id,),
 385:                 )
 386:                 await conn.commit()
 387:             return 0
 388: 
 389:         job_ids = [int(row["id"]) for row in rows]
 390:         running_job_ids = [
 391:             int(row["id"])
 392:             for row in rows
 393:             if str(row["status"]) == JobStatus.RUNNING.value
 394:         ]
 395: 
 396:         async with self._state_lock:
 397:             for job_id in running_job_ids:
 398:                 cancel_event = self._cancel_events.get(job_id)
 399:                 if cancel_event is not None:
 400:                     cancel_event.set()
 401:             self._queued_job_ids.difference_update(job_ids)
 402:             for job_id in job_ids:
 403:                 self._subscribers.pop(job_id, None)
 404: 
 405:         deadline = asyncio.get_running_loop().time() + ACCOUNT_DELETE_CANCEL_TIMEOUT_SECONDS
 406:         while running_job_ids:
 407:             async with self._state_lock:
 408:                 running_job_ids = [
 409:                     job_id for job_id in running_job_ids if job_id in self._running_job_ids
 410:                 ]
 411:             if not running_job_ids:
 412:                 break
 413:             if asyncio.get_running_loop().time() >= deadline:
 414:                 logger.warning(
 415:                     "Timed out waiting for user %s jobs to stop during account deletion: %s",
 416:                     user_id,
 417:                     running_job_ids,
 418:                 )
 419:                 break
 420:             await asyncio.sleep(0.1)
 421: 
 422:         async with self._connect() as conn:
 423:             await conn.execute("DELETE FROM jobs WHERE user_id = ?", (user_id,))
 424:             await conn.execute("DELETE FROM user_circuit_breakers WHERE user_id = ?", (user_id,))
 425:             await conn.commit()
 426: 
 427:         logger.info("Deleted %s queued jobs for user %s", len(job_ids), user_id)
 428:         await self._fill_queue_from_db()
 429:         return len(job_ids)
 430: 
 870:             async with self._state_lock:
 871:                 self._running_job_ids.discard(job_id)
 872:                 self._cancel_events.pop(job_id, None)
 873:             if output_dir is not None and output_dir.exists():
 874:                 shutil.rmtree(output_dir, ignore_errors=True)
 875:             await self._fill_queue_from_db()
 876: 
 877:     async def _pending_count(self) -> int:
 878:         async with self._connect() as conn, conn.execute(
 879:             "SELECT COUNT(*) AS count FROM jobs WHERE status = ?",
 880:             (JobStatus.PENDING.value,),
 881:         ) as cursor:
 882:             row = await cursor.fetchone()
 883:         return int(row["count"]) if row is not None else 0
 884: 
 885:     async def _fill_queue_from_db(self) -> None:
 886:         async with self._refill_lock:
 887:             free_slots = self._queue.maxsize - self._queue.qsize()
 888:             if free_slots <= 0:
 889:                 return
 890: 
 891:             now = _utcnow()
 892:             async with self._connect() as conn:
 893:                 async with conn.execute(
 894:                     """
 895:                     SELECT id, user_id
 896:                     FROM jobs
 897:                     WHERE status = ?
 898:                     ORDER BY priority DESC, created_at ASC, id ASC
 899:                     """,
 900:                     (JobStatus.PENDING.value,),
 901:                 ) as cursor:
 902:                     rows = await cursor.fetchall()
 903: 
 904:                 for row in rows:
 905:                     if free_slots <= 0:
 906:                         break
 907:                     job_id = int(row["id"])
 908:                     user_id = int(row["user_id"])
 909:                     async with self._state_lock:
 910:                         if job_id in self._queued_job_ids or job_id in self._running_job_ids:
 911:                             continue
 912: 
 913:                     breaker = await self._get_circuit_breaker_with_conn(conn, user_id)
 914:                     if breaker.paused:
 915:                         continue
 916:                     if breaker.next_attempt_at is not None and breaker.next_attempt_at > now:
 917:                         delay = (breaker.next_attempt_at - now).total_seconds()
 918:                         self._schedule_retry_fill(user_id, delay)
 919:                         continue
 920: 
 921:                     try:
 922:                         self._queue.put_nowait(job_id)
 923:                     except asyncio.QueueFull:
 924:                         break
 925: 
 926:                     async with self._state_lock:
 927:                         self._queued_job_ids.add(job_id)
 928:                     free_slots -= 1
 929: 
 930:     async def _queue_position(self, job_id: int) -> int | None:
 931:         """Return the 1-based queue position for a pending job, or None if not pending."""
 932:         async with self._connect() as conn:
 933:             async with conn.execute(
 934:                 """
 935:                 SELECT id
 936:                 FROM jobs
 937:                 WHERE status = ?
 938:                 ORDER BY priority DESC, created_at ASC, id ASC
 939:                 """,
 940:                 (JobStatus.PENDING.value,),
1150:             finally:
1151:                 self._retry_tasks.pop(user_id, None)
1152: 
1153:         self._retry_tasks[user_id] = asyncio.create_task(
1154:             _delayed_fill(),
1155:             name=f"user-{user_id}-queue-retry",
1156:         )
1157: 
1158:     async def _resolve_negatives_dir(self, user_id: int) -> Path | None:
1159:         """Return curated negatives corpus path for paid-tier users, None for free."""
1160:         corpus_path = settings.negatives_corpus_dir
1161:         if not corpus_path:
1162:             return None
1163: 
1164:         corpus = Path(corpus_path)
1165:         if not corpus.is_dir():
1166:             logger.warning("Negatives corpus dir configured but missing: %s", corpus_path)
1167:             return None
1168: 
1169:         # Check user's subscription tier
1170:         from app.models import Subscription
1171: 
1172:         async with async_session_factory() as session:
1173:             result = await session.execute(
1174:                 select(Subscription.tier).where(Subscription.user_id == user_id)
1175:             )
1176:             row = result.first()
1177:             tier = row[0] if row else "free"
1178: 
1179:         if tier == "free":
1180:             return None
1181: 
1182:         logger.info("Using curated negatives corpus for user %s (tier=%s)", user_id, tier)
1183:         return corpus
1184: 
1185:     async def _schedule_recording_cleanup(self, recording_ids: list[int]) -> None:
1186:         """Soft-delete recordings after training completes.
1187: 
1188:         The actual storage file purge happens later via the periodic
1189:         retention cleanup loop (``cleanup_soft_deleted_recordings``).
1190:         """
1191:         if settings.post_training_retention_hours <= 0:
1192:             return
1193: 
1194:         try:
1195:             from app.retention import mark_recordings_for_deletion
1196:             await mark_recordings_for_deletion(recording_ids)
1197:         except Exception as exc:
1198:             # Non-fatal: recordings will still be cleaned up by the
1199:             # age-based retention policy even if this fails.
1200:             logger.warning(
1201:                 "Failed to mark recordings for post-training deletion: %s",
1202:                 exc,
1203:             )
1204: 
1205:     async def _load_recording_paths(self, user_id: int, recording_ids: list[int]) -> list[str]:
1206:         async with async_session_factory() as session:
1207:             result = await session.execute(
1208:                 select(Recording.file_path)
1209:                 .where(
1210:                     Recording.id.in_(recording_ids),
1211:                     Recording.user_id == user_id,
1212:                     Recording.deleted_at.is_(None),
1213:                 )
1214:             )
1215:             return [str(row[0]) for row in result.all()]
1216: 
1217:     async def _create_model_record(
1218:         self,
1219:         *,
1220:         user_id: int,
1221:         wake_word: str,
1222:         file_path: str,
1223:         config_json: str | None,
1224:         d_prime: float | None,
1225:         size_bytes: int,
1226:     ) -> int:
1227:         async with async_session_factory() as session:
1228:             model = TrainedModel(
1229:                 user_id=user_id,
1230:                 wake_word=wake_word,
1231:                 file_path=str(file_path),
1232:                 config_json=config_json,
1233:                 d_prime=d_prime,
1234:                 size_bytes=size_bytes,
1235:             )
1236:             session.add(model)
1237:             await session.flush()
1238:             await session.commit()
1239:             return int(model.id)
1240: 

exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$i=0; Get-Content '"'console/backend/alembic/versions/20260326_0001_a1b2c3d4e5f6_initial_schema.py' | ForEach-Object { "'$i++; '"'{0,4}: {1}' -f "'$i, $_ }' in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$i=0; Get-Content '"'console/backend/alembic/versions/20260328_0001_b2c3d4e5f6a7_add_teams.py' | ForEach-Object { "'$i++; '"'{0,4}: {1}' -f "'$i, $_ }' in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$i=0; Get-Content '"'console/backend/alembic/versions/20260405_0001_c3d4e5f6a7b8_add_login_lockout_and_soft_delete.py' | ForEach-Object { "'$i++; '"'{0,4}: {1}' -f "'$i, $_ }' in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$i=0; Get-Content '"'console/backend/alembic/versions/20260507_0001_d4e5f6a7b8c9_add_processed_stripe_events_table.py' | ForEach-Object { "'$i++; '"'{0,4}: {1}' -f "'$i, $_ }' in J:\CLAUDE\PROJECTS\Wakeword
 succeeded in 400ms:
   1: """Add failed_login_count and locked_until to users, deleted_at to recordings.
   2: 
   3: These columns were previously applied at runtime by _ensure_schema_updates()
   4: in database.py but were missing from the Alembic migration chain, causing
   5: Alembic-only deployments (e.g. PostgreSQL on Railway) to lack them.
   6: 
   7: Revision ID: c3d4e5f6a7b8
   8: Revises: b2c3d4e5f6a7
   9: Create Date: 2026-04-05
  10: """
  11: from __future__ import annotations
  12: 
  13: from typing import Sequence, Union
  14: 
  15: from alembic import op
  16: import sqlalchemy as sa
  17: 
  18: # revision identifiers, used by Alembic.
  19: revision: str = "c3d4e5f6a7b8"
  20: down_revision: Union[str, None] = "b2c3d4e5f6a7"
  21: branch_labels: Union[str, Sequence[str], None] = None
  22: depends_on: Union[str, Sequence[str], None] = None
  23: 
  24: 
  25: def upgrade() -> None:
  26:     # Account-lockout columns on users
  27:     op.add_column(
  28:         "users",
  29:         sa.Column("failed_login_count", sa.Integer, nullable=False, server_default=sa.text("0")),
  30:     )
  31:     op.add_column(
  32:         "users",
  33:         sa.Column("locked_until", sa.DateTime(timezone=True), nullable=True),
  34:     )
  35: 
  36:     # Soft-delete support on recordings
  37:     op.add_column(
  38:         "recordings",
  39:         sa.Column("deleted_at", sa.DateTime(timezone=True), nullable=True),
  40:     )
  41: 
  42: 
  43: def downgrade() -> None:
  44:     op.drop_column("recordings", "deleted_at")
  45:     op.drop_column("users", "locked_until")
  46:     op.drop_column("users", "failed_login_count")

 succeeded in 450ms:
   1: """Add teams and team_members tables, team_id FK on recordings and trained_models.
   2: 
   3: Revision ID: b2c3d4e5f6a7
   4: Revises: a1b2c3d4e5f6
   5: Create Date: 2026-03-28
   6: """
   7: from __future__ import annotations
   8: 
   9: from typing import Sequence, Union
  10: 
  11: from alembic import op
  12: import sqlalchemy as sa
  13: 
  14: # revision identifiers, used by Alembic.
  15: revision: str = "b2c3d4e5f6a7"
  16: down_revision: Union[str, None] = "a1b2c3d4e5f6"
  17: branch_labels: Union[str, Sequence[str], None] = None
  18: depends_on: Union[str, Sequence[str], None] = None
  19: 
  20: 
  21: def upgrade() -> None:
  22:     # --- teams ---
  23:     op.create_table(
  24:         "teams",
  25:         sa.Column("id", sa.Integer, primary_key=True, autoincrement=True),
  26:         sa.Column("name", sa.String(255), nullable=False),
  27:         sa.Column("created_at", sa.DateTime(timezone=True), nullable=True),
  28:         sa.Column("owner_id", sa.Integer, sa.ForeignKey("users.id"), nullable=False, index=True),
  29:     )
  30: 
  31:     # --- team_members ---
  32:     op.create_table(
  33:         "team_members",
  34:         sa.Column("id", sa.Integer, primary_key=True, autoincrement=True),
  35:         sa.Column("team_id", sa.Integer, sa.ForeignKey("teams.id"), nullable=False, index=True),
  36:         sa.Column("user_id", sa.Integer, sa.ForeignKey("users.id"), nullable=False, index=True),
  37:         sa.Column("role", sa.String(20), nullable=False, server_default=sa.text("'member'")),
  38:         sa.Column("invited_at", sa.DateTime(timezone=True), nullable=True),
  39:         sa.Column("joined_at", sa.DateTime(timezone=True), nullable=True),
  40:         sa.UniqueConstraint("team_id", "user_id", name="uq_team_member"),
  41:     )
  42: 
  43:     # --- Add nullable team_id FK to recordings ---
  44:     op.add_column(
  45:         "recordings",
  46:         sa.Column("team_id", sa.Integer, sa.ForeignKey("teams.id"), nullable=True, index=True),
  47:     )
  48: 
  49:     # --- Add nullable team_id FK to trained_models ---
  50:     op.add_column(
  51:         "trained_models",
  52:         sa.Column("team_id", sa.Integer, sa.ForeignKey("teams.id"), nullable=True, index=True),
  53:     )
  54: 
  55: 
  56: def downgrade() -> None:
  57:     op.drop_column("trained_models", "team_id")
  58:     op.drop_column("recordings", "team_id")
  59:     op.drop_table("team_members")
  60:     op.drop_table("teams")

 succeeded in 402ms:
   1: """Add processed_stripe_events table.
   2: 
   3: Revision ID: d4e5f6a7b8c9
   4: Revises: c3d4e5f6a7b8
   5: Create Date: 2026-05-07
   6: """
   7: from __future__ import annotations
   8: 
   9: from typing import Sequence, Union
  10: 
  11: from alembic import op
  12: import sqlalchemy as sa
  13: 
  14: # revision identifiers, used by Alembic.
  15: revision: str = "d4e5f6a7b8c9"
  16: down_revision: Union[str, None] = "c3d4e5f6a7b8"
  17: branch_labels: Union[str, Sequence[str], None] = None
  18: depends_on: Union[str, Sequence[str], None] = None
  19: 
  20: 
  21: def upgrade() -> None:
  22:     op.create_table(
  23:         "processed_stripe_events",
  24:         sa.Column("event_id", sa.Text, primary_key=True),
  25:         sa.Column(
  26:             "processed_at",
  27:             sa.DateTime(timezone=True),
  28:             nullable=False,
  29:             server_default=sa.func.now(),
  30:         ),
  31:     )
  32: 
  33: 
  34: def downgrade() -> None:
  35:     op.drop_table("processed_stripe_events")

 succeeded in 453ms:
   1: """Initial schema â€” all tables matching current ORM models.
   2: 
   3: Revision ID: a1b2c3d4e5f6
   4: Revises:
   5: Create Date: 2026-03-26
   6: """
   7: from __future__ import annotations
   8: 
   9: from typing import Sequence, Union
  10: 
  11: from alembic import op
  12: import sqlalchemy as sa
  13: 
  14: # revision identifiers, used by Alembic.
  15: revision: str = "a1b2c3d4e5f6"
  16: down_revision: Union[str, None] = None
  17: branch_labels: Union[str, Sequence[str], None] = None
  18: depends_on: Union[str, Sequence[str], None] = None
  19: 
  20: 
  21: def upgrade() -> None:
  22:     # --- users ---
  23:     op.create_table(
  24:         "users",
  25:         sa.Column("id", sa.Integer, primary_key=True, autoincrement=True),
  26:         sa.Column("email", sa.String(255), unique=True, nullable=False, index=True),
  27:         sa.Column("password_hash", sa.String(255), nullable=False),
  28:         sa.Column("name", sa.String(255), nullable=False),
  29:         sa.Column("email_verified", sa.Boolean, nullable=False, server_default=sa.text("0")),
  30:         sa.Column("created_at", sa.DateTime(timezone=True), nullable=True),
  31:     )
  32: 
  33:     # --- recordings ---
  34:     op.create_table(
  35:         "recordings",
  36:         sa.Column("id", sa.Integer, primary_key=True, autoincrement=True),
  37:         sa.Column("user_id", sa.Integer, sa.ForeignKey("users.id"), nullable=False, index=True),
  38:         sa.Column("wake_word", sa.String(100), nullable=False, index=True),
  39:         sa.Column("filename", sa.String(255), nullable=False),
  40:         sa.Column("file_path", sa.String(1024), nullable=False),
  41:         sa.Column("duration_s", sa.Float, nullable=False),
  42:         sa.Column("sample_rate", sa.Integer, nullable=False, server_default=sa.text("16000")),
  43:         sa.Column("created_at", sa.DateTime(timezone=True), nullable=True),
  44:     )
  45: 
  46:     # --- trained_models ---
  47:     # Created before training_jobs because training_jobs has a FK to trained_models.
  48:     op.create_table(
  49:         "trained_models",
  50:         sa.Column("id", sa.Integer, primary_key=True, autoincrement=True),
  51:         sa.Column("user_id", sa.Integer, sa.ForeignKey("users.id"), nullable=False, index=True),
  52:         sa.Column("wake_word", sa.String(100), nullable=False),
  53:         sa.Column("file_path", sa.String(1024), nullable=False),
  54:         sa.Column("config_json", sa.Text, nullable=True),
  55:         sa.Column("d_prime", sa.Float, nullable=True),
  56:         sa.Column("size_bytes", sa.Integer, nullable=False, server_default=sa.text("0")),
  57:         sa.Column("created_at", sa.DateTime(timezone=True), nullable=True),
  58:     )
  59: 
  60:     # --- training_jobs ---
  61:     op.create_table(
  62:         "training_jobs",
  63:         sa.Column("id", sa.Integer, primary_key=True, autoincrement=True),
  64:         sa.Column("user_id", sa.Integer, sa.ForeignKey("users.id"), nullable=False, index=True),
  65:         sa.Column("wake_word", sa.String(100), nullable=False),
  66:         sa.Column("status", sa.String(20), nullable=False, server_default=sa.text("'queued'")),
  67:         sa.Column("progress", sa.Float, nullable=False, server_default=sa.text("0.0")),
  68:         sa.Column("epochs", sa.Integer, nullable=False, server_default=sa.text("50")),
  69:         sa.Column("d_prime", sa.Float, nullable=True),
  70:         sa.Column("model_id", sa.Integer, sa.ForeignKey("trained_models.id"), nullable=True),
  71:         sa.Column("error", sa.Text, nullable=True),
  72:         sa.Column("created_at", sa.DateTime(timezone=True), nullable=True),
  73:         sa.Column("completed_at", sa.DateTime(timezone=True), nullable=True),
  74:     )
  75: 
  76:     # --- subscriptions ---
  77:     op.create_table(
  78:         "subscriptions",
  79:         sa.Column("id", sa.Integer, primary_key=True, autoincrement=True),
  80:         sa.Column(
  81:             "user_id",
  82:             sa.Integer,
  83:             sa.ForeignKey("users.id", ondelete="CASCADE"),
  84:             unique=True,
  85:             nullable=False,
  86:             index=True,
  87:         ),
  88:         sa.Column("stripe_customer_id", sa.String(255), nullable=True, index=True),
  89:         sa.Column("stripe_subscription_id", sa.String(255), nullable=True, unique=True),
  90:         sa.Column("tier", sa.String(20), nullable=False, server_default=sa.text("'free'")),
  91:         sa.Column("status", sa.String(20), nullable=False, server_default=sa.text("'active'")),
  92:         sa.Column("current_period_end", sa.DateTime(timezone=True), nullable=True),
  93:         sa.Column("created_at", sa.DateTime(timezone=True), nullable=True),
  94:         sa.Column("updated_at", sa.DateTime(timezone=True), nullable=True),
  95:     )
  96: 
  97:     # --- usage_records ---
  98:     op.create_table(
  99:         "usage_records",
 100:         sa.Column("id", sa.Integer, primary_key=True, autoincrement=True),
 101:         sa.Column(
 102:             "user_id",
 103:             sa.Integer,
 104:             sa.ForeignKey("users.id", ondelete="CASCADE"),
 105:             nullable=False,
 106:             index=True,
 107:         ),
 108:         sa.Column("action", sa.String(50), nullable=False),
 109:         sa.Column("period_start", sa.DateTime(timezone=True), nullable=False),
 110:         sa.Column("count", sa.Integer, nullable=False, server_default=sa.text("0")),
 111:         sa.Column("created_at", sa.DateTime(timezone=True), nullable=True),
 112:         sa.UniqueConstraint("user_id", "action", "period_start", name="uq_usage_user_action_period"),
 113:     )
 114: 
 115: 
 116: def downgrade() -> None:
 117:     op.drop_table("usage_records")
 118:     op.drop_table("subscriptions")
 119:     op.drop_table("training_jobs")
 120:     op.drop_table("trained_models")
 121:     op.drop_table("recordings")
 122:     op.drop_table("users")

codex
No migration upgrade path wipes `training_jobs`; the only drops are in downgrade functions. I’m querying the running containers now to see whether live state matches the code path.
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command 'docker exec wakeword-postgres-1 psql -U violawake -d violawake -c "SELECT count(*) FROM trained_models;"' in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command "docker exec wakeword-postgres-1 psql -U violawake -d violawake -c \"\\dt\"" in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command 'docker exec wakeword-postgres-1 psql -U violawake -d violawake -c "SELECT version_num FROM alembic_version;"' in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command 'docker exec wakeword-postgres-1 psql -U violawake -d violawake -c "SELECT count(*) FROM training_jobs; SELECT max(id) FROM training_jobs;"' in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command "docker exec wakeword-backend-1 python -c \"import sqlite3; c=sqlite3.connect('/app/data/job_queue.db'); [print(r) for r in c.execute('PRAGMA table_info(jobs)')]\"" in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command "docker exec wakeword-backend-1 python -c \"import sqlite3; c=sqlite3.connect('/app/data/job_queue.db'); print('counts', list(c.execute('SELECT status, count(*) FROM jobs GROUP BY status ORDER BY status'))); print('job49', c.execute('SELECT id,user_id,wake_word,status,progress_pct,error,model_id,d_prime,created_at,started_at,completed_at,recording_ids,epochs,priority FROM jobs WHERE id=49').fetchone())\"" in J:\CLAUDE\PROJECTS\Wakeword
 succeeded in 897ms:
 version_num  
--------------
 d4e5f6a7b8c9
(1 row)


 succeeded in 931ms:
 count 
-------
     0
(1 row)


 succeeded in 942ms:
                  List of relations
 Schema |          Name           | Type  |   Owner   
--------+-------------------------+-------+-----------
 public | alembic_version         | table | violawake
 public | processed_stripe_events | table | violawake
 public | recordings              | table | violawake
 public | subscriptions           | table | violawake
 public | team_members            | table | violawake
 public | teams                   | table | violawake
 public | trained_models          | table | violawake
 public | training_jobs           | table | violawake
 public | usage_records           | table | violawake
 public | users                   | table | violawake
(10 rows)


 succeeded in 950ms:
 count 
-------
     0
(1 row)

 max 
-----
    
(1 row)


 succeeded in 953ms:
counts [('cancelled', 7), ('completed', 17), ('failed', 25)]
job49 (49, 36, 'viola_e2e_1778163936', 'failed', 67.38, "Failed to convert the exported program to an ONNX model. \x1b[96mThis is step 3/3\x1b[0m of exporting the model to ONNX. Next steps:\n- If there is a missing ONNX function, implement it and register it to the registry.\n- If there is an internal error during ONNX conversion, debug the error and submit a PR to PyTorch.\n- Create an error report with `torch.onnx.export(..., report=True)`, and save the ExportedProgram as a pt2 file. Create an issue in the PyTorch GitHub repository against the \x1b[96m*onnx*\x1b[0m component. Attach the error report and the pt2 model.\n\n## Exception summary\n\n<class 'torch.onnx._internal.exporter._errors.DispatchError'>: No ONNX function found for <OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the real-valued input\n⬆️\n<class 'torch.onnx._internal.exporter._errors.ConversionError'>: Error when translating node %adaptive_max_pool2d : [num_users=1] = call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = (%unsqueeze, [1, 1]), kwargs = {}). See the stack trace for more information.\n\n(Refer to the full stack trace above for more information.)", None, None, '2026-05-07T14:25:40.207868+00:00', '2026-05-07T14:46:41.807761+00:00', '2026-05-07T15:14:50.022310+00:00', '[249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270]', 80, 0)

 succeeded in 973ms:
(0, 'id', 'INTEGER', 0, None, 1)
(1, 'user_id', 'INTEGER', 1, None, 0)
(2, 'wake_word', 'TEXT', 1, None, 0)
(3, 'status', 'TEXT', 1, None, 0)
(4, 'created_at', 'TEXT', 1, None, 0)
(5, 'started_at', 'TEXT', 0, None, 0)
(6, 'completed_at', 'TEXT', 0, None, 0)
(7, 'error', 'TEXT', 0, None, 0)
(8, 'progress_pct', 'REAL', 1, '0', 0)
(9, 'recording_ids', 'TEXT', 1, None, 0)
(10, 'epochs', 'INTEGER', 1, '50', 0)
(11, 'model_id', 'INTEGER', 0, None, 0)
(12, 'd_prime', 'REAL', 0, None, 0)
(13, 'priority', 'INTEGER', 1, '0', 0)

codex
Live DB confirms the split: Postgres has the tables and current Alembic head, but `training_jobs` and `trained_models` are both empty; SQLite has the 49 queue rows and job 49 failed at 67.38%. I’m checking commits since `54f20b4` to see whether the source-of-truth changed today.
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command 'git log --oneline --decorate 54f20b4.. -- console/backend/app/routes/training.py console/backend/app/job_queue.py console/backend/app/routes/jobs.py console/backend/app/services/training_service.py console/backend/app/models.py console/backend/alembic/versions' in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command 'git diff --stat 54f20b4..HEAD -- console/backend/app/routes/training.py console/backend/app/job_queue.py console/backend/app/routes/jobs.py console/backend/app/services/training_service.py console/backend/app/models.py console/backend/alembic/versions' in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command 'git diff --unified=80 54f20b4..HEAD -- console/backend/app/routes/training.py console/backend/app/job_queue.py console/backend/app/routes/jobs.py' in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command 'git diff --unified=80 54f20b4..HEAD -- console/backend/app/services/training_service.py console/backend/app/models.py console/backend/alembic/versions' in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command 'git log --oneline --decorate 54f20b4..' in J:\CLAUDE\PROJECTS\Wakeword
 succeeded in 480ms:
b45e03c Require corpus speech negatives in backend training
3ed32ec Persist Stripe webhook idempotency
cb1ffca feat(security): post-launch hardening sprint
ed6070a feat(backend): add login_lockout migration + entrypoint

 succeeded in 499ms:
diff --git a/console/backend/alembic/versions/20260405_0001_c3d4e5f6a7b8_add_login_lockout_and_soft_delete.py b/console/backend/alembic/versions/20260405_0001_c3d4e5f6a7b8_add_login_lockout_and_soft_delete.py
new file mode 100644
index 0000000..545f88c
--- /dev/null
+++ b/console/backend/alembic/versions/20260405_0001_c3d4e5f6a7b8_add_login_lockout_and_soft_delete.py
@@ -0,0 +1,46 @@
+"""Add failed_login_count and locked_until to users, deleted_at to recordings.
+
+These columns were previously applied at runtime by _ensure_schema_updates()
+in database.py but were missing from the Alembic migration chain, causing
+Alembic-only deployments (e.g. PostgreSQL on Railway) to lack them.
+
+Revision ID: c3d4e5f6a7b8
+Revises: b2c3d4e5f6a7
+Create Date: 2026-04-05
+"""
+from __future__ import annotations
+
+from typing import Sequence, Union
+
+from alembic import op
+import sqlalchemy as sa
+
+# revision identifiers, used by Alembic.
+revision: str = "c3d4e5f6a7b8"
+down_revision: Union[str, None] = "b2c3d4e5f6a7"
+branch_labels: Union[str, Sequence[str], None] = None
+depends_on: Union[str, Sequence[str], None] = None
+
+
+def upgrade() -> None:
+    # Account-lockout columns on users
+    op.add_column(
+        "users",
+        sa.Column("failed_login_count", sa.Integer, nullable=False, server_default=sa.text("0")),
+    )
+    op.add_column(
+        "users",
+        sa.Column("locked_until", sa.DateTime(timezone=True), nullable=True),
+    )
+
+    # Soft-delete support on recordings
+    op.add_column(
+        "recordings",
+        sa.Column("deleted_at", sa.DateTime(timezone=True), nullable=True),
+    )
+
+
+def downgrade() -> None:
+    op.drop_column("recordings", "deleted_at")
+    op.drop_column("users", "locked_until")
+    op.drop_column("users", "failed_login_count")
diff --git a/console/backend/alembic/versions/20260507_0001_d4e5f6a7b8c9_add_processed_stripe_events_table.py b/console/backend/alembic/versions/20260507_0001_d4e5f6a7b8c9_add_processed_stripe_events_table.py
new file mode 100644
index 0000000..d6b5952
--- /dev/null
+++ b/console/backend/alembic/versions/20260507_0001_d4e5f6a7b8c9_add_processed_stripe_events_table.py
@@ -0,0 +1,35 @@
+"""Add processed_stripe_events table.
+
+Revision ID: d4e5f6a7b8c9
+Revises: c3d4e5f6a7b8
+Create Date: 2026-05-07
+"""
+from __future__ import annotations
+
+from typing import Sequence, Union
+
+from alembic import op
+import sqlalchemy as sa
+
+# revision identifiers, used by Alembic.
+revision: str = "d4e5f6a7b8c9"
+down_revision: Union[str, None] = "c3d4e5f6a7b8"
+branch_labels: Union[str, Sequence[str], None] = None
+depends_on: Union[str, Sequence[str], None] = None
+
+
+def upgrade() -> None:
+    op.create_table(
+        "processed_stripe_events",
+        sa.Column("event_id", sa.Text, primary_key=True),
+        sa.Column(
+            "processed_at",
+            sa.DateTime(timezone=True),
+            nullable=False,
+            server_default=sa.func.now(),
+        ),
+    )
+
+
+def downgrade() -> None:
+    op.drop_table("processed_stripe_events")
diff --git a/console/backend/app/models.py b/console/backend/app/models.py
index d547f10..44f22f6 100644
--- a/console/backend/app/models.py
+++ b/console/backend/app/models.py
@@ -1,146 +1,159 @@
 """SQLAlchemy ORM models for ViolaWake Console."""
 
 from __future__ import annotations
 
 from datetime import datetime, timezone
 
-from sqlalchemy import Boolean, DateTime, Float, ForeignKey, Integer, String, Text, UniqueConstraint
+from sqlalchemy import Boolean, DateTime, Float, ForeignKey, Integer, String, Text, UniqueConstraint, func
 from sqlalchemy.orm import Mapped, mapped_column, relationship
 
 from app.database import Base
 
 
 def _utcnow() -> datetime:
     return datetime.now(timezone.utc)
 
 
 class User(Base):
     __tablename__ = "users"
 
     id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
     email: Mapped[str] = mapped_column(String(255), unique=True, nullable=False, index=True)
     password_hash: Mapped[str] = mapped_column(String(255), nullable=False)
     name: Mapped[str] = mapped_column(String(255), nullable=False)
     email_verified: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False)
+    failed_login_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
+    locked_until: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
     created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=_utcnow)
 
     recordings: Mapped[list[Recording]] = relationship(back_populates="user", cascade="all, delete-orphan")
     training_jobs: Mapped[list[TrainingJob]] = relationship(back_populates="user", cascade="all, delete-orphan")
     trained_models: Mapped[list[TrainedModel]] = relationship(back_populates="user", cascade="all, delete-orphan")
     owned_teams: Mapped[list[Team]] = relationship(back_populates="owner", cascade="all, delete-orphan")
     team_memberships: Mapped[list[TeamMember]] = relationship(back_populates="user", cascade="all, delete-orphan")
 
 
 class Team(Base):
     __tablename__ = "teams"
 
     id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
     name: Mapped[str] = mapped_column(String(255), nullable=False)
     created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=_utcnow)
     owner_id: Mapped[int] = mapped_column(Integer, ForeignKey("users.id"), nullable=False, index=True)
 
     owner: Mapped[User] = relationship(back_populates="owned_teams")
     members: Mapped[list[TeamMember]] = relationship(back_populates="team", cascade="all, delete-orphan")
 
 
 class TeamMember(Base):
     __tablename__ = "team_members"
     __table_args__ = (
         UniqueConstraint("team_id", "user_id", name="uq_team_member"),
     )
 
     id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
     team_id: Mapped[int] = mapped_column(Integer, ForeignKey("teams.id"), nullable=False, index=True)
     user_id: Mapped[int] = mapped_column(Integer, ForeignKey("users.id"), nullable=False, index=True)
     role: Mapped[str] = mapped_column(String(20), nullable=False, default="member")  # owner / admin / member
     invited_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=_utcnow)
     joined_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
 
     team: Mapped[Team] = relationship(back_populates="members")
     user: Mapped[User] = relationship(back_populates="team_memberships")
 
 
 class Recording(Base):
     __tablename__ = "recordings"
 
     id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
     user_id: Mapped[int] = mapped_column(Integer, ForeignKey("users.id"), nullable=False, index=True)
     team_id: Mapped[int | None] = mapped_column(Integer, ForeignKey("teams.id"), nullable=True, index=True)
     wake_word: Mapped[str] = mapped_column(String(100), nullable=False, index=True)
     filename: Mapped[str] = mapped_column(String(255), nullable=False)
     file_path: Mapped[str] = mapped_column(String(1024), nullable=False)
     duration_s: Mapped[float] = mapped_column(Float, nullable=False)
     sample_rate: Mapped[int] = mapped_column(Integer, nullable=False, default=16000)
     created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=_utcnow)
     deleted_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True, default=None)
 
     user: Mapped[User] = relationship(back_populates="recordings")
 
 
 class TrainingJob(Base):
     __tablename__ = "training_jobs"
 
     id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
     user_id: Mapped[int] = mapped_column(Integer, ForeignKey("users.id"), nullable=False, index=True)
     wake_word: Mapped[str] = mapped_column(String(100), nullable=False)
     status: Mapped[str] = mapped_column(String(20), nullable=False, default="queued")
     progress: Mapped[float] = mapped_column(Float, nullable=False, default=0.0)
     epochs: Mapped[int] = mapped_column(Integer, nullable=False, default=80)
     d_prime: Mapped[float | None] = mapped_column(Float, nullable=True)
     model_id: Mapped[int | None] = mapped_column(Integer, ForeignKey("trained_models.id"), nullable=True)
     error: Mapped[str | None] = mapped_column(Text, nullable=True)
     created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=_utcnow)
     completed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
 
     user: Mapped[User] = relationship(back_populates="training_jobs")
     model: Mapped[TrainedModel | None] = relationship()
 
 
 class TrainedModel(Base):
     __tablename__ = "trained_models"
 
     id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
     user_id: Mapped[int] = mapped_column(Integer, ForeignKey("users.id"), nullable=False, index=True)
     team_id: Mapped[int | None] = mapped_column(Integer, ForeignKey("teams.id"), nullable=True, index=True)
     wake_word: Mapped[str] = mapped_column(String(100), nullable=False)
     file_path: Mapped[str] = mapped_column(String(1024), nullable=False)
     config_json: Mapped[str | None] = mapped_column(Text, nullable=True)
     d_prime: Mapped[float | None] = mapped_column(Float, nullable=True)
     size_bytes: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
     created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=_utcnow)
 
     user: Mapped[User] = relationship(back_populates="trained_models")
 
 
 class Subscription(Base):
     __tablename__ = "subscriptions"
 
     id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
     user_id: Mapped[int] = mapped_column(
         Integer, ForeignKey("users.id", ondelete="CASCADE"), unique=True, nullable=False, index=True,
     )
     stripe_customer_id: Mapped[str | None] = mapped_column(String(255), nullable=True, index=True)
     stripe_subscription_id: Mapped[str | None] = mapped_column(String(255), nullable=True, unique=True)
     tier: Mapped[str] = mapped_column(String(20), nullable=False, default="free")
     status: Mapped[str] = mapped_column(String(20), nullable=False, default="active")
     current_period_end: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
     created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=_utcnow)
     updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=_utcnow, onupdate=_utcnow)
 
     user: Mapped[User] = relationship(backref="subscription")
 
 
 class UsageRecord(Base):
     __tablename__ = "usage_records"
     __table_args__ = (
         UniqueConstraint("user_id", "action", "period_start", name="uq_usage_user_action_period"),
     )
 
     id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
     user_id: Mapped[int] = mapped_column(
         Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True,
     )
     action: Mapped[str] = mapped_column(String(50), nullable=False)
     period_start: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False)
     count: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
     created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=_utcnow)
+
+
+class ProcessedStripeEvent(Base):
+    __tablename__ = "processed_stripe_events"
+
+    event_id: Mapped[str] = mapped_column(Text, primary_key=True)
+    processed_at: Mapped[datetime] = mapped_column(
+        DateTime(timezone=True),
+        nullable=False,
+        server_default=func.now(),
+    )
diff --git a/console/backend/app/services/training_service.py b/console/backend/app/services/training_service.py
index 75d740c..af849b1 100644
--- a/console/backend/app/services/training_service.py
+++ b/console/backend/app/services/training_service.py
@@ -22,328 +22,321 @@ logger = logging.getLogger("violawake.training")
 
 class TrainingCancelledError(RuntimeError):
     """Raised when a running training job is cancelled."""
 
 
 @dataclass(slots=True)
 class TrainingArtifact:
     """Artifacts produced by a completed training run."""
 
     local_path: Path
     config_json: str | None
     config_bytes: bytes | None
     d_prime: float | None
     size_bytes: int
 
 
 def run_training_job_sync(
     *,
     job_id: int,
     wake_word: str,
     recording_identifiers: list[str],
     output_path: Path,
     epochs: int,
     timeout_seconds: int,
     progress_callback: Callable[[dict[str, Any]], None],
     is_cancelled: Callable[[], bool],
     negatives_dir: Path | None = None,
 ) -> TrainingArtifact:
     """Run the ViolaWake SDK training pipeline synchronously."""
     positives_dir: Path | None = None
     neg_temp_dir: Path | None = None
     storage = get_storage()
 
     def _ensure_not_cancelled() -> None:
         if is_cancelled():
             raise TrainingCancelledError("Training cancelled by user")
 
     try:
         _ensure_not_cancelled()
         progress_callback({
             "status": "running",
             "progress": 0.0,
             "epoch": 0,
             "total_epochs": epochs,
             "train_loss": 0.0,
             "val_loss": 0.0,
             "message": "Preparing training data...",
             "error": None,
         })
 
         positives_dir = Path(tempfile.mkdtemp(prefix="violawake_train_", dir=str(settings.tmp_dir)))
         for index, recording_identifier in enumerate(recording_identifiers):
             _ensure_not_cancelled()
             if not storage.exists(recording_identifier):
                 logger.warning("Recording %s was missing for training job %s", recording_identifier, job_id)
                 continue
 
             dst = positives_dir / f"sample_{index:04d}.wav"
             dst.write_bytes(storage.download(recording_identifier))
 
         wav_count = len(list(positives_dir.glob("*.wav")))
         if wav_count < 5:
             raise RuntimeError("Only %s valid WAV files found. Need at least 5." % wav_count)
 
         pos_files = sorted(positives_dir.glob("*.wav"))
 
         progress_callback({
             "status": "running",
             "progress": 2.0,
             "epoch": 0,
             "total_epochs": epochs,
             "train_loss": 0.0,
             "val_loss": 0.0,
             "message": "Loaded %s recordings. Generating TTS corpus..." % wav_count,
             "error": None,
         })
 
         # -- Production pipeline: full auto-corpus (matching CLI train) --
         from violawake_sdk.tools.train import (
             _generate_confusable_negatives,
-            _generate_speech_negatives,
             _generate_tts_positives,
             _train_temporal_cnn,
         )
 
         neg_temp_dir = Path(tempfile.mkdtemp(prefix="violawake_neg_", dir=str(settings.tmp_dir)))
 
         # Auto-generate TTS positives when user has <100 samples (production behavior)
         # Keep track of user-provided files so augmentation targets only real recordings
         user_pos_files = list(pos_files)
         if len(pos_files) < 100:
             tts_pos_dir = neg_temp_dir / "tts_positives"
             try:
                 tts_pos_files = _generate_tts_positives(
                     wake_word,
                     tts_pos_dir,
                     verbose=False,
                 )
                 if tts_pos_files:
                     pos_files = list(pos_files) + tts_pos_files
                     logger.info(
                         "Generated %s TTS positives for job %s (total: %s)",
                         len(tts_pos_files), job_id, len(pos_files),
                     )
             except Exception as exc:
                 logger.error(
                     "TTS positive generation FAILED for job %s: %s — "
                     "model quality will be degraded without TTS diversity",
                     job_id, exc,
                 )
 
             _ensure_not_cancelled()
             progress_callback({
                 "status": "running",
                 "progress": 3.0,
                 "epoch": 0,
                 "total_epochs": epochs,
                 "train_loss": 0.0,
                 "val_loss": 0.0,
-                "message": "Corpus: %s positives. Generating negatives..." % len(pos_files),
+                "message": "Corpus: %s positives. Generating wake-word negatives..." % len(pos_files),
                 "error": None,
             })
         neg_tag_map: dict[str, list[Path]] = {}
 
         # Source 1: User/paid-tier corpus negatives
         if negatives_dir and negatives_dir.exists():
             user_neg = sorted(
                 list(negatives_dir.rglob("*.wav")) + list(negatives_dir.rglob("*.flac"))
             )
             if user_neg:
                 neg_tag_map["neg_user"] = user_neg
                 logger.info("Loaded %s corpus negatives for job %s", len(user_neg), job_id)
 
         _ensure_not_cancelled()
 
         # Source 2: Auto-generated confusable negatives (phonetically similar)
         # Two rounds matching CLI production pipeline:
         #   Round 1: 30 confusables x 10 voices (broad phonetic coverage)
         #   Round 2: 16 confusables x 10 voices (tight variants for hard negatives)
         confusable_dir_r1 = neg_temp_dir / "confusables_r1"
         try:
             confusable_r1 = _generate_confusable_negatives(
                 wake_word,
                 confusable_dir_r1,
                 n_confusables=30,
                 voices_per_word=10,
                 verbose=False,
             )
             if confusable_r1:
                 neg_tag_map["neg_confusable_r1"] = confusable_r1
         except Exception as exc:
             logger.error(
                 "Confusable round 1 FAILED for job %s: %s — "
                 "model will have higher false positive rate on similar-sounding words",
                 job_id, exc,
             )
 
         _ensure_not_cancelled()
 
         confusable_dir_r2 = neg_temp_dir / "confusables_r2"
         try:
             confusable_r2 = _generate_confusable_negatives(
                 wake_word,
                 confusable_dir_r2,
                 n_confusables=16,
                 voices_per_word=10,
                 verbose=False,
             )
             if confusable_r2:
                 neg_tag_map["neg_confusable_r2"] = confusable_r2
         except Exception as exc:
             logger.error(
                 "Confusable round 2 FAILED for job %s: %s",
                 job_id, exc,
             )
 
         _ensure_not_cancelled()
         progress_callback({
             "status": "running",
             "progress": 4.0,
             "epoch": 0,
             "total_epochs": epochs,
             "train_loss": 0.0,
             "val_loss": 0.0,
-            "message": "Generated confusables. Generating speech negatives...",
+            "message": "Generated confusables. Loading corpus speech negatives...",
             "error": None,
         })
 
-        # Source 3: Auto-generated speech negatives (common phrases)
-        # 5 voices matching CLI production pipeline (was 3)
-        speech_dir = neg_temp_dir / "speech"
-        try:
-            speech_files = _generate_speech_negatives(
-                speech_dir,
-                n_voices=5,
-                verbose=False,
-            )
-            if speech_files:
-                neg_tag_map["neg_speech"] = speech_files
-        except Exception as exc:
-            logger.error(
-                "Speech neg generation FAILED for job %s: %s — "
-                "model will have higher false positive rate on general speech",
-                job_id, exc,
-            )
-
         _ensure_not_cancelled()
 
         # Source 4: Universal corpus (LibriSpeech, MUSAN) if available
+        service_file = Path(__file__).resolve()
         _CORPUS_SEARCH_PATHS = [
-            Path(__file__).resolve().parent.parent.parent.parent / "corpus",  # repo root
+            Path("/app/corpus"),
+            *([service_file.parents[4] / "corpus"] if len(service_file.parents) > 4 else []),
             Path.home() / ".violawake" / "corpus",
             Path("corpus"),
         ]
         _CORPUS_SUBDIRS: dict[str, tuple[str, ...]] = {
             "neg_librispeech": ("librispeech",),
             "neg_musan_speech": ("musan/musan/speech", "musan/speech"),
             "neg_musan_music": ("musan/musan/music", "musan/music"),
             "neg_musan_noise": ("musan/musan/noise", "musan/noise"),
         }
         _rng = random.Random(42)
         for tag, subdirs in _CORPUS_SUBDIRS.items():
             for corpus_root in _CORPUS_SEARCH_PATHS:
                 if not corpus_root.exists():
                     continue
                 for subdir in subdirs:
                     candidate = corpus_root / subdir
                     if candidate.exists():
                         corpus_files = sorted(
                             list(candidate.rglob("*.wav")) + list(candidate.rglob("*.flac"))
                         )
                         if corpus_files:
                             if len(corpus_files) > 2000:
                                 corpus_files = sorted(_rng.sample(corpus_files, 2000))
                             neg_tag_map[tag] = corpus_files
                             break
                 if tag in neg_tag_map:
                     break
 
         all_neg_files: list[Path] = []
         for files in neg_tag_map.values():
             all_neg_files.extend(files)
 
         total_neg = len(all_neg_files)
-        if total_neg < 5:
+        speech_neg_tags = {
+            "neg_user",
+            "neg_librispeech",
+            "neg_musan_speech",
+            "neg_musan_music",
+            "neg_musan_noise",
+        }
+        total_speech_neg = sum(
+            len(files) for tag, files in neg_tag_map.items() if tag in speech_neg_tags
+        )
+        if total_speech_neg < 5 or total_neg < 5:
             raise RuntimeError(
-                "Only %s negative files generated. "
-                "edge-tts may not be installed or network unavailable." % total_neg
+                "No speech negatives available. Mount LibriSpeech + MUSAN corpus at "
+                "/app/corpus or run `violawake download-corpus`."
             )
 
         progress_callback({
             "status": "running",
             "progress": 8.0,
             "epoch": 0,
             "total_epochs": epochs,
             "train_loss": 0.0,
             "val_loss": 0.0,
             "message": "Corpus ready: %s pos, %s neg. Training TemporalCNN..." % (len(pos_files), total_neg),
             "error": None,
         })
 
         started_at = time.monotonic()
 
         def _on_epoch(info: dict[str, Any]) -> None:
             _ensure_not_cancelled()
             elapsed = time.monotonic() - started_at
             if elapsed > timeout_seconds:
                 raise RuntimeError(
                     "Training job timed out after %ss (%s minutes)"
                     % (timeout_seconds, timeout_seconds // 60)
                 )
 
             epoch = int(info.get("epoch", 0))
             total_epochs = int(info.get("total_epochs", epochs)) or epochs
             train_loss = float(info.get("train_loss", 0.0))
             val_loss = float(info.get("val_loss", 0.0))
             progress = min(10.0 + 85.0 * (epoch / total_epochs), 95.0)
 
             progress_callback({
                 "status": "running",
                 "progress": round(progress, 2),
                 "epoch": epoch,
                 "total_epochs": total_epochs,
                 "train_loss": round(train_loss, 6),
                 "val_loss": round(val_loss, 6),
                 "message": "Epoch %s/%s - loss: %.4f" % (epoch, total_epochs, train_loss),
                 "error": None,
             })
 
         _train_temporal_cnn(
             pos_files=pos_files,
             neg_files=all_neg_files,
             output_path=output_path,
             wake_word=wake_word,
             epochs=epochs,
             augment=True,
             eval_dir=None,
             verbose=True,
             progress_callback=_on_epoch,
             neg_tags=neg_tag_map,
             tmp_dir=settings.tmp_dir,
             augment_source_files=user_pos_files,
         )
 
         _ensure_not_cancelled()
         if not output_path.exists():
             raise RuntimeError("Training completed but no model file was produced")
 
         config_path = output_path.with_suffix(".config.json")
         config_json: str | None = None
         config_bytes: bytes | None = None
         d_prime_value: float | None = None
         if config_path.exists():
             config_bytes = config_path.read_bytes()
             config_data = json.loads(config_bytes.decode("utf-8"))
             config_json = json.dumps(config_data)
             if isinstance(config_data, dict):
                 raw_d_prime = config_data.get("d_prime")
                 if isinstance(raw_d_prime, (int, float)):
                     d_prime_value = float(raw_d_prime)
 
         return TrainingArtifact(
             local_path=output_path,
             config_json=config_json,
             config_bytes=config_bytes,
             d_prime=d_prime_value,
             size_bytes=output_path.stat().st_size,
         )

 succeeded in 550ms:
 ...d4e5f6a7b8_add_login_lockout_and_soft_delete.py |  46 ++++++++
 ...e5f6a7b8c9_add_processed_stripe_events_table.py |  35 ++++++
 console/backend/app/job_queue.py                   | 128 +++++++++++++++------
 console/backend/app/models.py                      |  15 ++-
 console/backend/app/routes/jobs.py                 |   7 +-
 console/backend/app/routes/training.py             |  61 +++++++---
 console/backend/app/services/training_service.py   |  43 +++----
 7 files changed, 253 insertions(+), 82 deletions(-)

 succeeded in 560ms:
diff --git a/console/backend/app/job_queue.py b/console/backend/app/job_queue.py
index f782cbe..1b5db12 100644
--- a/console/backend/app/job_queue.py
+++ b/console/backend/app/job_queue.py
@@ -1,329 +1,360 @@
 """Persistent async training job queue with circuit breaker protection."""
 
 from __future__ import annotations
 
 import asyncio
 import json
 import logging
 import shutil
 import tempfile
 import threading
 from collections.abc import AsyncIterator
 from contextlib import asynccontextmanager, suppress
 from dataclasses import dataclass, field
 from datetime import datetime, timedelta, timezone
 from enum import Enum
 from pathlib import Path
 from typing import Any
 
 import aiosqlite
 from sqlalchemy import select
 
 from app.config import settings
 from app.database import async_session_factory
-from app.models import Recording, TrainedModel
+from app.models import Recording, TrainedModel, User
 from app.monitoring import log_exception
 from app.services.training_service import TrainingCancelledError, run_training_job_sync
 from app.storage import build_companion_config_identifier, build_model_key, get_storage
 
 logger = logging.getLogger("violawake.jobs")
 
 QUEUE_MAX_SIZE = 50
+PER_USER_MAX_PENDING = 3
+MAX_SUBSCRIBERS_PER_JOB = 5
 FAILURE_THRESHOLD = 3
 FAILURE_BACKOFF_SECONDS = 300
 ACCOUNT_DELETE_CANCEL_TIMEOUT_SECONDS = 30.0
 
 
 def _utcnow() -> datetime:
     return datetime.now(timezone.utc)
 
 
 def _serialize_datetime(value: datetime | None) -> str | None:
     if value is None:
         return None
     return value.astimezone(timezone.utc).isoformat()
 
 
 def _deserialize_datetime(value: str | None) -> datetime | None:
     if not value:
         return None
     parsed = datetime.fromisoformat(value)
     if parsed.tzinfo is None:
         return parsed.replace(tzinfo=timezone.utc)
     return parsed.astimezone(timezone.utc)
 
 
 class JobStatus(str, Enum):
     """Persisted job states."""
 
     PENDING = "pending"
     RUNNING = "running"
     COMPLETED = "completed"
     FAILED = "failed"
     CANCELLED = "cancelled"
 
 
 # Priority values assigned by subscription tier.
 PRIORITY_FREE = 0
 PRIORITY_DEVELOPER = 10
 PRIORITY_BUSINESS = 20
 PRIORITY_ENTERPRISE = 30
 
 
 @dataclass(slots=True)
 class Job:
     """Persisted training job metadata."""
 
     id: int
     user_id: int
     wake_word: str
     status: JobStatus
     created_at: datetime
     started_at: datetime | None = None
     completed_at: datetime | None = None
     error: str | None = None
     progress_pct: float = 0.0
     recording_ids: list[int] = field(default_factory=list)
     epochs: int = 80
     model_id: int | None = None
     d_prime: float | None = None
     priority: int = PRIORITY_FREE
 
 
 @dataclass(slots=True)
 class CircuitBreakerState:
     """Per-user failure tracking."""
 
     user_id: int
     consecutive_failures: int = 0
     paused: bool = False
     next_attempt_at: datetime | None = None
     last_failure_at: datetime | None = None
     pause_reason: str | None = None
 
 
 _TIER_PRIORITY: dict[str, int] = {
     "free": PRIORITY_FREE,
     "developer": PRIORITY_DEVELOPER,
     "business": PRIORITY_BUSINESS,
     "enterprise": PRIORITY_ENTERPRISE,
 }
 
 
 async def _resolve_user_priority(user_id: int) -> int:
     """Return the queue priority for a user based on their subscription tier."""
     from app.models import Subscription
 
     async with async_session_factory() as session:
         result = await session.execute(
             select(Subscription.tier).where(Subscription.user_id == user_id)
         )
         row = result.first()
         tier = row[0] if row else "free"
 
     return _TIER_PRIORITY.get(str(tier), PRIORITY_FREE)
 
 
 class QueueFullError(RuntimeError):
     """Raised when the persistent queue is at capacity."""
 
 
+class TooManyPendingJobsError(RuntimeError):
+    """Raised when a user already has too many active jobs."""
+
+
+class TooManySubscribersError(RuntimeError):
+    """Raised when a job already has too many SSE subscribers."""
+
+
 class JobQueue:
     """Persistent async training job queue."""
 
     def __init__(
         self,
         *,
         db_path: Path | None = None,
         max_concurrent: int = 2,
         max_pending: int = QUEUE_MAX_SIZE,
     ) -> None:
         self._db_path = db_path or (settings.data_dir / "job_queue.db")
         self._queue: asyncio.Queue[int] = asyncio.Queue(maxsize=max_pending)
         self._semaphore = asyncio.Semaphore(max_concurrent)
         self._subscribers: dict[int, list[asyncio.Queue[dict[str, Any]]]] = {}
         self._queued_job_ids: set[int] = set()
         self._running_job_ids: set[int] = set()
         self._cancel_events: dict[int, threading.Event] = {}
         self._inflight_tasks: set[asyncio.Task[None]] = set()
         self._retry_tasks: dict[int, asyncio.Task[None]] = {}
+        self._submission_lock = asyncio.Lock()
         self._state_lock = asyncio.Lock()
         self._refill_lock = asyncio.Lock()
         self._worker_task: asyncio.Task[None] | None = None
         self._closed = False
 
     async def start(self) -> None:
         """Initialize persistence and start the dispatcher loop."""
         await self._initialize_db()
         await self._resume_jobs()
         self._worker_task = asyncio.create_task(self._worker_loop(), name="job-queue-worker")
         await self._fill_queue_from_db()
         logger.info("Job queue started with max_concurrent=%s", settings.max_concurrent_jobs)
 
     async def shutdown(self) -> None:
         """Stop the dispatcher loop and cancel outstanding retry timers."""
         self._closed = True
         if self._worker_task is not None:
             self._worker_task.cancel()
             with suppress(asyncio.CancelledError):
                 await self._worker_task
             self._worker_task = None
 
         for cancel_event in list(self._cancel_events.values()):
             cancel_event.set()
 
         if self._inflight_tasks:
             done, pending = await asyncio.wait(list(self._inflight_tasks), timeout=15)
             for task in pending:
                 task.cancel()
             for task in done:
                 with suppress(asyncio.CancelledError):
                     await task
 
         for task in list(self._retry_tasks.values()):
             task.cancel()
         for task in list(self._retry_tasks.values()):
             with suppress(asyncio.CancelledError):
                 await task
         self._retry_tasks.clear()
 
     async def submit_job(
         self,
         *,
         user_id: int,
         wake_word: str,
         recording_ids: list[int],
         epochs: int,
         priority: int | None = None,
     ) -> int:
         """Persist a new training job and enqueue it when capacity allows.
 
         When *priority* is not supplied it is resolved automatically from the
         user's subscription tier (free=0, developer=5, business=10).
         """
         if await self._pending_count() >= self._queue.maxsize:
             raise QueueFullError("Training queue is full. Please try again later.")
 
         if priority is None:
             priority = await _resolve_user_priority(user_id)
 
         created_at = _utcnow()
         payload = json.dumps(recording_ids)
 
-        async with self._connect() as conn:
-            cursor = await conn.execute(
-                """
-                INSERT INTO jobs (
-                    user_id,
-                    wake_word,
-                    status,
-                    created_at,
-                    started_at,
-                    completed_at,
-                    error,
-                    progress_pct,
-                    recording_ids,
-                    epochs,
-                    model_id,
-                    d_prime,
-                    priority
-                ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
-                """,
-                (
-                    user_id,
-                    wake_word,
-                    JobStatus.PENDING.value,
-                    _serialize_datetime(created_at),
-                    None,
-                    None,
-                    None,
-                    0.0,
-                    payload,
-                    epochs,
-                    None,
-                    None,
-                    priority,
-                ),
-            )
-            await conn.commit()
-            job_id = int(cursor.lastrowid)
+        async with self._submission_lock:
+            async with self._connect() as conn:
+                async with conn.execute(
+                    """
+                    SELECT COUNT(*) AS count
+                    FROM jobs
+                    WHERE user_id = ? AND status IN (?, ?)
+                    """,
+                    (
+                        user_id,
+                        JobStatus.PENDING.value,
+                        JobStatus.RUNNING.value,
+                    ),
+                ) as cursor:
+                    row = await cursor.fetchone()
+                active_job_count = int(row["count"]) if row is not None else 0
+                if active_job_count >= PER_USER_MAX_PENDING:
+                    raise TooManyPendingJobsError(
+                        "Too many pending jobs. Wait for current jobs to complete."
+                    )
+
+                cursor = await conn.execute(
+                    """
+                    INSERT INTO jobs (
+                        user_id,
+                        wake_word,
+                        status,
+                        created_at,
+                        started_at,
+                        completed_at,
+                        error,
+                        progress_pct,
+                        recording_ids,
+                        epochs,
+                        model_id,
+                        d_prime,
+                        priority
+                    ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+                    """,
+                    (
+                        user_id,
+                        wake_word,
+                        JobStatus.PENDING.value,
+                        _serialize_datetime(created_at),
+                        None,
+                        None,
+                        None,
+                        0.0,
+                        payload,
+                        epochs,
+                        None,
+                        None,
+                        priority,
+                    ),
+                )
+                await conn.commit()
+                job_id = int(cursor.lastrowid)
 
         logger.info(
             "Queued training job %s for user %s (priority=%s)",
             job_id,
             user_id,
             priority,
         )
         await self._fill_queue_from_db()
         # Publish an initial PENDING event so SSE subscribers immediately see
         # their queue position after submission.
         queue_position = await self._queue_position(job_id)
         await self._publish(
             job_id,
             {
                 "status": JobStatus.PENDING.value,
                 "progress": 0.0,
                 "epoch": 0,
                 "total_epochs": epochs,
                 "train_loss": 0.0,
                 "val_loss": 0.0,
                 "message": "Queued for training.",
                 "error": None,
                 "d_prime": None,
                 "model_id": None,
                 "queue_position": queue_position,
             },
         )
         return job_id
 
     async def cancel_job(self, job_id: int) -> bool:
         """Cancel a pending or running job."""
         job = await self.get_job(job_id)
         if job is None:
             return False
         if job.status in {JobStatus.COMPLETED, JobStatus.FAILED, JobStatus.CANCELLED}:
             return False
 
         if job.status is JobStatus.RUNNING:
             async with self._state_lock:
                 cancel_event = self._cancel_events.get(job_id)
             if cancel_event is not None:
                 cancel_event.set()
             logger.info("Cancellation requested for running job %s", job_id)
             return True
 
         completed_at = _utcnow()
         await self._update_job(
             job_id,
             status=JobStatus.CANCELLED,
             completed_at=completed_at,
             error="Cancelled by user",
         )
         await self._publish(
             job_id,
             {
                 "status": JobStatus.CANCELLED.value,
                 "progress": job.progress_pct,
                 "epoch": 0,
                 "total_epochs": job.epochs,
                 "train_loss": 0.0,
                 "val_loss": 0.0,
                 "message": "Training cancelled.",
                 "error": "Cancelled by user",
                 "d_prime": job.d_prime,
                 "model_id": job.model_id,
                 "queue_position": None,
             },
         )
         await self._fill_queue_from_db()
         return True
 
     async def get_job(self, job_id: int) -> Job | None:
         """Return a persisted job by ID."""
         async with self._connect() as conn, conn.execute(
             "SELECT * FROM jobs WHERE id = ?",
             (job_id,),
         ) as cursor:
             row = await cursor.fetchone()
         if row is None:
             return None
@@ -396,160 +427,162 @@ class JobQueue:
         logger.info("Deleted %s queued jobs for user %s", len(job_ids), user_id)
         await self._fill_queue_from_db()
         return len(job_ids)
 
     async def resume_user(self, user_id: int) -> None:
         """Clear the circuit breaker pause for a user and resume queued work."""
         async with self._connect() as conn:
             await conn.execute(
                 """
                 INSERT INTO user_circuit_breakers (
                     user_id,
                     consecutive_failures,
                     paused,
                     next_attempt_at,
                     last_failure_at,
                     pause_reason
                 ) VALUES (?, 0, 0, NULL, NULL, NULL)
                 ON CONFLICT(user_id) DO UPDATE SET
                     consecutive_failures = 0,
                     paused = 0,
                     next_attempt_at = NULL,
                     last_failure_at = NULL,
                     pause_reason = NULL
                 """,
                 (user_id,),
             )
             await conn.commit()
 
         retry_task = self._retry_tasks.pop(user_id, None)
         if retry_task is not None:
             retry_task.cancel()
         logger.info("Resumed job queue for user %s", user_id)
         await self._fill_queue_from_db()
 
     async def get_circuit_breaker(self, user_id: int) -> CircuitBreakerState:
         """Return the circuit breaker state for a user."""
         async with self._connect() as conn:
             return await self._get_circuit_breaker_with_conn(conn, user_id)
 
     async def runtime_snapshot(self) -> dict[str, Any]:
         """Return queue depth and worker state for health checks."""
         async with self._connect() as conn:
             async with conn.execute(
                 "SELECT COUNT(*) AS count FROM jobs WHERE status = ?",
                 (JobStatus.PENDING.value,),
             ) as cursor:
                 pending_row = await cursor.fetchone()
             async with conn.execute(
                 "SELECT COUNT(*) AS count FROM jobs WHERE status = ?",
                 (JobStatus.RUNNING.value,),
             ) as cursor:
                 running_row = await cursor.fetchone()
 
         pending_count = int(pending_row["count"]) if pending_row is not None else 0
         persisted_running_count = int(running_row["count"]) if running_row is not None else 0
         async with self._state_lock:
             queued_job_ids = sorted(self._queued_job_ids)
             running_job_ids = sorted(self._running_job_ids)
 
         worker_task_running = self._worker_task is not None and not self._worker_task.done()
         active_workers = len(running_job_ids)
         max_workers = settings.max_concurrent_jobs
         return {
             "queue_depth": pending_count,
             "in_memory_queue_depth": self._queue.qsize(),
             "persisted_running_jobs": persisted_running_count,
             "worker_status": {
                 "active_workers": active_workers,
                 "max_workers": max_workers,
                 "available_slots": max(max_workers - active_workers, 0),
                 "worker_task_running": worker_task_running,
                 "queued_job_ids": queued_job_ids,
                 "running_job_ids": running_job_ids,
             },
         }
 
     def subscribe(self, job_id: int) -> asyncio.Queue[dict[str, Any]]:
         """Subscribe to SSE-style job updates."""
         queue: asyncio.Queue[dict[str, Any]] = asyncio.Queue()
         listeners = self._subscribers.setdefault(job_id, [])
+        if len(listeners) >= MAX_SUBSCRIBERS_PER_JOB:
+            raise TooManySubscribersError("Too many subscribers for this job.")
         listeners.append(queue)
         return queue
 
     def unsubscribe(self, job_id: int, queue: asyncio.Queue[dict[str, Any]]) -> None:
         """Unsubscribe from SSE-style job updates."""
         listeners = self._subscribers.get(job_id)
         if listeners is None:
             return
         try:
             listeners.remove(queue)
         except ValueError:
             return
         if not listeners:
             self._subscribers.pop(job_id, None)
 
     async def _initialize_db(self) -> None:
         self._db_path.parent.mkdir(parents=True, exist_ok=True)
         async with self._connect() as conn:
             await conn.execute("PRAGMA journal_mode=WAL")
             await conn.execute("PRAGMA foreign_keys=ON")
             await conn.execute(
                 """
                 CREATE TABLE IF NOT EXISTS jobs (
                     id INTEGER PRIMARY KEY AUTOINCREMENT,
                     user_id INTEGER NOT NULL,
                     wake_word TEXT NOT NULL,
                     status TEXT NOT NULL,
                     created_at TEXT NOT NULL,
                     started_at TEXT,
                     completed_at TEXT,
                     error TEXT,
                     progress_pct REAL NOT NULL DEFAULT 0,
                     recording_ids TEXT NOT NULL,
                     epochs INTEGER NOT NULL DEFAULT 80,
                     model_id INTEGER,
                     d_prime REAL,
                     priority INTEGER NOT NULL DEFAULT 0
                 )
                 """
             )
             await conn.execute(
                 """
                 CREATE TABLE IF NOT EXISTS user_circuit_breakers (
                     user_id INTEGER PRIMARY KEY,
                     consecutive_failures INTEGER NOT NULL DEFAULT 0,
                     paused INTEGER NOT NULL DEFAULT 0,
                     next_attempt_at TEXT,
                     last_failure_at TEXT,
                     pause_reason TEXT
                 )
                 """
             )
             await conn.execute(
                 "CREATE INDEX IF NOT EXISTS idx_jobs_user_created ON jobs(user_id, created_at DESC)"
             )
             await conn.execute(
                 "CREATE INDEX IF NOT EXISTS idx_jobs_status_created ON jobs(status, created_at ASC)"
             )
 
             # Migration: add priority column to existing databases that predate
             # this feature.  Must run BEFORE the priority index creation below.
             async with conn.execute("PRAGMA table_info(jobs)") as cursor:
                 columns = {row["name"] async for row in cursor}
             if "priority" not in columns:
                 await conn.execute(
                     "ALTER TABLE jobs ADD COLUMN priority INTEGER NOT NULL DEFAULT 0"
                 )
                 logger.info("Migrated jobs table: added priority column")
 
             await conn.execute(
                 "CREATE INDEX IF NOT EXISTS idx_jobs_priority_created ON jobs(status, priority DESC, created_at ASC)"
             )
 
             await conn.commit()
 
     async def _resume_jobs(self) -> None:
         running_user_ids: set[int] = set()
         async with self._connect() as conn:
             async with conn.execute(
                 "SELECT DISTINCT user_id FROM jobs WHERE status = ?",
@@ -675,160 +708,179 @@ class JobQueue:
             output_path = output_dir / f"{job.wake_word}_{job.id}_{int(now.timestamp())}.onnx"
 
             loop = asyncio.get_running_loop()
 
             def _on_progress(event: dict[str, Any]) -> None:
                 future = asyncio.run_coroutine_threadsafe(
                     self._handle_progress_event(job_id, job.epochs, event),
                     loop,
                 )
                 future.result(timeout=10)
 
             artifact = await asyncio.to_thread(
                 run_training_job_sync,
                 job_id=job.id,
                 wake_word=job.wake_word,
                 recording_identifiers=recording_paths,
                 output_path=output_path,
                 epochs=job.epochs,
                 timeout_seconds=settings.training_timeout,
                 progress_callback=_on_progress,
                 is_cancelled=cancel_event.is_set,
                 negatives_dir=negatives_dir,
             )
 
             storage = get_storage()
             model_key = build_model_key(job.user_id, artifact.local_path.name)
             storage.upload(
                 model_key,
                 artifact.local_path.read_bytes(),
                 "application/octet-stream",
             )
             if artifact.config_bytes is not None:
                 storage.upload(
                     build_companion_config_identifier(model_key),
                     artifact.config_bytes,
                     "application/json",
                 )
 
             model_id = await self._create_model_record(
                 user_id=job.user_id,
                 wake_word=job.wake_word,
                 file_path=model_key,
                 config_json=artifact.config_json,
                 d_prime=artifact.d_prime,
                 size_bytes=artifact.size_bytes,
             )
 
             completed_at = _utcnow()
             await self._update_job(
                 job_id,
                 status=JobStatus.COMPLETED,
                 progress_pct=100.0,
                 completed_at=completed_at,
                 error=None,
                 model_id=model_id,
                 d_prime=artifact.d_prime,
             )
             await self._record_success(job.user_id)
 
             # Schedule post-training recording deletion (privacy: recordings
             # are deleted after training per the privacy FAQ).
             await self._schedule_recording_cleanup(job.recording_ids)
 
             await self._publish(
                 job_id,
                 {
                     "status": JobStatus.COMPLETED.value,
                     "progress": 100.0,
                     "epoch": job.epochs,
                     "total_epochs": job.epochs,
                     "train_loss": 0.0,
                     "val_loss": 0.0,
                     "message": "Training complete.",
                     "error": None,
                     "d_prime": artifact.d_prime,
                     "model_id": model_id,
                     "queue_position": None,
                 },
             )
             logger.info("Training job %s completed for user %s", job_id, job.user_id)
+
+            # Best-effort training-complete email notification.
+            try:
+                from app.email_service import get_email_service
+
+                email_svc = get_email_service()
+                if email_svc.enabled:
+                    async with async_session_factory() as session:
+                        user = await session.get(User, job.user_id)
+                    if user is not None:
+                        download_url = f"/models/{model_id}/download"
+                        await email_svc.send_training_complete(
+                            to=user.email,
+                            model_name=job.wake_word,
+                            download_url=download_url,
+                        )
+            except Exception as email_exc:
+                log_exception(logger, email_exc, message="Training-complete email failed", source="email")
+
         except TrainingCancelledError as exc:
             current_job = await self.get_job(job_id)
             completed_at = _utcnow()
             progress_pct = current_job.progress_pct if current_job is not None else 0.0
             await self._update_job(
                 job_id,
                 status=JobStatus.CANCELLED,
                 completed_at=completed_at,
                 error=str(exc),
             )
             await self._publish(
                 job_id,
                 {
                     "status": JobStatus.CANCELLED.value,
                     "progress": progress_pct,
                     "epoch": 0,
                     "total_epochs": current_job.epochs if current_job is not None else 0,
                     "train_loss": 0.0,
                     "val_loss": 0.0,
                     "message": "Training cancelled.",
                     "error": str(exc),
                     "d_prime": current_job.d_prime if current_job is not None else None,
                     "model_id": current_job.model_id if current_job is not None else None,
                     "queue_position": None,
                 },
             )
             logger.info("Training job %s cancelled", job_id)
         except Exception as exc:
             current_job = await self.get_job(job_id)
             completed_at = _utcnow()
             await self._update_job(
                 job_id,
                 status=JobStatus.FAILED,
                 completed_at=completed_at,
                 error=str(exc),
             )
             user_id = current_job.user_id if current_job is not None else None
             if user_id is not None:
                 await self._record_failure(user_id, str(exc))
             await self._publish(
                 job_id,
                 {
                     "status": JobStatus.FAILED.value,
                     "progress": current_job.progress_pct if current_job is not None else 0.0,
                     "epoch": 0,
                     "total_epochs": current_job.epochs if current_job is not None else 0,
                     "train_loss": 0.0,
                     "val_loss": 0.0,
                     "message": "Training failed.",
                     "error": str(exc),
                     "d_prime": current_job.d_prime if current_job is not None else None,
                     "model_id": current_job.model_id if current_job is not None else None,
                     "queue_position": None,
                 },
             )
             log_exception(
                 logger,
                 exc,
                 message="Training job failed",
                 source="job_queue",
                 extra={"job_id": job_id},
             )
         finally:
             async with self._state_lock:
                 self._running_job_ids.discard(job_id)
                 self._cancel_events.pop(job_id, None)
             if output_dir is not None and output_dir.exists():
                 shutil.rmtree(output_dir, ignore_errors=True)
             await self._fill_queue_from_db()
 
     async def _pending_count(self) -> int:
         async with self._connect() as conn, conn.execute(
             "SELECT COUNT(*) AS count FROM jobs WHERE status = ?",
             (JobStatus.PENDING.value,),
         ) as cursor:
             row = await cursor.fetchone()
         return int(row["count"]) if row is not None else 0
 
     async def _fill_queue_from_db(self) -> None:
         async with self._refill_lock:
diff --git a/console/backend/app/routes/jobs.py b/console/backend/app/routes/jobs.py
index 1e00943..3d0c1e7 100644
--- a/console/backend/app/routes/jobs.py
+++ b/console/backend/app/routes/jobs.py
@@ -1,187 +1,192 @@
 """Async training job queue routes."""
 
 from typing import Annotated
 
 from fastapi import APIRouter, Depends, HTTPException, Request, status
 from sqlalchemy import select
 from sqlalchemy.ext.asyncio import AsyncSession
 
 from app.auth import get_verified_user
 from app.database import get_db
-from app.job_queue import Job, QueueFullError, init_job_queue
+from app.job_queue import Job, QueueFullError, TooManyPendingJobsError, init_job_queue
 from app.models import Recording, User
 from app.rate_limit import TRAINING_SUBMIT_LIMIT, key_by_user, limiter, set_rate_limit_user
 from app.routes.billing import check_training_quota, record_usage
 from app.schemas import (
     JobCircuitBreakerResponse,
     JobResponse,
     JobSubmitRequest,
     JobSubmitResponse,
     MessageResponse,
 )
 
 router = APIRouter(prefix="/api/jobs", tags=["jobs"])
 
 
 async def _quota_user_with_rate_key(
     request: Request,
     current_user: Annotated[User, Depends(check_training_quota)],
 ) -> User:
     """Resolve the user via training-quota check and stash ID for rate limiting."""
     set_rate_limit_user(request, current_user.id)
     return current_user
 
 
 def serialize_job(job: Job) -> JobResponse:
     """Convert a queue job dataclass into an API response."""
     return JobResponse(
         job_id=job.id,
         user_id=job.user_id,
         wake_word=job.wake_word,
         status=job.status.value,
         created_at=job.created_at,
         started_at=job.started_at,
         completed_at=job.completed_at,
         error=job.error,
         progress_pct=job.progress_pct,
         d_prime=job.d_prime,
         model_id=job.model_id,
     )
 
 
 async def validate_training_request(
     body: JobSubmitRequest,
     current_user: User,
     db: AsyncSession,
 ) -> tuple[str, list[int], int]:
     """Validate the submitted recordings for a new training job."""
     wake_word = body.wake_word.strip().lower()
     result = await db.execute(
         select(Recording).where(
             Recording.id.in_(body.recording_ids),
             Recording.user_id == current_user.id,
             Recording.deleted_at.is_(None),
         )
     )
     recordings = result.scalars().all()
 
     if len(recordings) != len(body.recording_ids):
         found_ids = {recording.id for recording in recordings}
         missing = [recording_id for recording_id in body.recording_ids if recording_id not in found_ids]
         raise HTTPException(
             status_code=status.HTTP_404_NOT_FOUND,
             detail=f"Recordings not found or not owned by you: {missing}",
         )
 
     wrong_word = [recording.id for recording in recordings if recording.wake_word != wake_word]
     if wrong_word:
         raise HTTPException(
             status_code=status.HTTP_400_BAD_REQUEST,
             detail=f"Recordings {wrong_word} do not match wake word '{body.wake_word}'",
         )
 
     if len(recordings) < 5:
         raise HTTPException(
             status_code=status.HTTP_400_BAD_REQUEST,
             detail=f"Need at least 5 recordings. Got {len(recordings)}.",
         )
 
     return wake_word, list(body.recording_ids), body.epochs
 
 
 async def submit_training_job(
     body: JobSubmitRequest,
     current_user: User,
     db: AsyncSession,
 ) -> JobSubmitResponse:
     """Validate and enqueue a training job."""
     wake_word, recording_ids, epochs = await validate_training_request(body, current_user, db)
     queue = await init_job_queue()
 
     try:
         job_id = await queue.submit_job(
             user_id=current_user.id,
             wake_word=wake_word,
             recording_ids=recording_ids,
             epochs=epochs,
         )
+    except TooManyPendingJobsError as exc:
+        raise HTTPException(
+            status_code=status.HTTP_429_TOO_MANY_REQUESTS,
+            detail=str(exc),
+        ) from exc
     except QueueFullError as exc:
         raise HTTPException(
             status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
             detail=str(exc),
         ) from exc
 
     await record_usage(db, current_user.id, action="training_job")
     return JobSubmitResponse(job_id=job_id, status="queued")
 
 
 async def get_owned_job_or_404(job_id: int, current_user: User) -> Job:
     """Return an owned job or raise 404."""
     job = await (await init_job_queue()).get_job(job_id)
     if job is None or job.user_id != current_user.id:
         raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Training job not found")
     return job
 
 
 @router.post("", response_model=JobSubmitResponse, status_code=status.HTTP_202_ACCEPTED)
 @limiter.limit(TRAINING_SUBMIT_LIMIT, key_func=key_by_user)
 async def create_job(
     request: Request,
     body: JobSubmitRequest,
     current_user: Annotated[User, Depends(_quota_user_with_rate_key)],
     db: Annotated[AsyncSession, Depends(get_db)],
 ) -> JobSubmitResponse:
     """Submit a new training job."""
     return await submit_training_job(body, current_user, db)
 
 
 @router.get("", response_model=list[JobResponse])
 async def list_jobs(
     current_user: Annotated[User, Depends(get_verified_user)],
 ) -> list[JobResponse]:
     """List the current user's training jobs."""
     jobs = await (await init_job_queue()).list_jobs(current_user.id)
     return [serialize_job(job) for job in jobs]
 
 
 @router.post("/resume", response_model=MessageResponse)
 async def resume_jobs(
     current_user: Annotated[User, Depends(get_verified_user)],
 ) -> MessageResponse:
     """Manually resume a user's paused queue after circuit breaker activation."""
     await (await init_job_queue()).resume_user(current_user.id)
     return MessageResponse(message="Training queue resumed")
 
 
 @router.get("/circuit-breaker/state", response_model=JobCircuitBreakerResponse)
 async def get_circuit_breaker_state(
     current_user: Annotated[User, Depends(get_verified_user)],
 ) -> JobCircuitBreakerResponse:
     """Return the current user's circuit breaker state."""
     breaker = await (await init_job_queue()).get_circuit_breaker(current_user.id)
     return JobCircuitBreakerResponse(
         consecutive_failures=breaker.consecutive_failures,
         paused=breaker.paused,
         next_attempt_at=breaker.next_attempt_at,
         last_failure_at=breaker.last_failure_at,
         pause_reason=breaker.pause_reason,
     )
 
 
 @router.get("/{job_id}", response_model=JobResponse)
 async def get_job(
     job_id: int,
     current_user: Annotated[User, Depends(get_verified_user)],
 ) -> JobResponse:
     """Return one training job."""
     job = await get_owned_job_or_404(job_id, current_user)
     return serialize_job(job)
 
 
 @router.delete("/{job_id}", response_model=MessageResponse)
 async def cancel_job(
     job_id: int,
     current_user: Annotated[User, Depends(get_verified_user)],
 ) -> MessageResponse:
     """Cancel a pending or running training job."""
     await get_owned_job_or_404(job_id, current_user)
diff --git a/console/backend/app/routes/training.py b/console/backend/app/routes/training.py
index e5fc911..c37fe5e 100644
--- a/console/backend/app/routes/training.py
+++ b/console/backend/app/routes/training.py
@@ -1,164 +1,191 @@
 """Compatibility routes for legacy training endpoints."""
 
 import asyncio
 import json
 from typing import Annotated
 
 from fastapi import APIRouter, Depends, HTTPException, Query, Request, status
 from sqlalchemy import select
 from sqlalchemy.ext.asyncio import AsyncSession
 from sse_starlette.sse import EventSourceResponse
 
 from app.auth import decode_download_token, decode_token, get_verified_user
 from app.database import get_db
-from app.job_queue import init_job_queue
+from app.job_queue import TooManySubscribersError, init_job_queue
 from app.models import User
 from app.rate_limit import TRAINING_SUBMIT_LIMIT, key_by_user, limiter, set_rate_limit_user
 from app.routes.billing import check_training_quota
 from app.routes.jobs import get_owned_job_or_404, submit_training_job
 from app.schemas import JobSubmitRequest, TrainingStartResponse, TrainingStatusResponse
 
 router = APIRouter(prefix="/api/training", tags=["training"])
+MAX_SSE_PER_USER = 10
+_active_sse_connections: dict[int, int] = {}
 
 
 async def _quota_user_with_rate_key(
     request: Request,
     current_user: Annotated[User, Depends(check_training_quota)],
 ) -> User:
     """Resolve the user via training-quota check and stash ID for rate limiting."""
     set_rate_limit_user(request, current_user.id)
     return current_user
 
 
 def _legacy_status(status_value: str) -> str:
     """Map queue status names to the legacy training API values."""
     if status_value == "pending":
         return "queued"
     return status_value
 
 
 @router.post("/start", response_model=TrainingStartResponse, status_code=status.HTTP_202_ACCEPTED)
 @limiter.limit(TRAINING_SUBMIT_LIMIT, key_func=key_by_user)
 async def start_training(
     request: Request,
     body: JobSubmitRequest,
     current_user: Annotated[User, Depends(_quota_user_with_rate_key)],
     db: Annotated[AsyncSession, Depends(get_db)],
 ) -> TrainingStartResponse:
     """Submit a training job through the persistent queue."""
     job_response = await submit_training_job(body, current_user, db)
     return TrainingStartResponse(job_id=job_response.job_id, status=job_response.status)
 
 
 @router.get("/status/{job_id}", response_model=TrainingStatusResponse)
 async def get_training_status(
     job_id: int,
     current_user: Annotated[User, Depends(get_verified_user)],
 ) -> TrainingStatusResponse:
     """Get the current status of a queued training job."""
     job = await get_owned_job_or_404(job_id, current_user)
     return TrainingStatusResponse(
         job_id=job.id,
         status=_legacy_status(job.status.value),
         progress=job.progress_pct,
         d_prime=job.d_prime,
         model_id=job.model_id,
         error=job.error,
     )
 
 
 async def _resolve_sse_user(
     request: Request,
     token: str | None,
     db: AsyncSession,
     *,
     job_id: int,
 ) -> User:
     """Resolve the authenticated user for SSE endpoints."""
     user_id: int | None = None
     if token:
         user_id = decode_download_token(
             token,
             expected_action="training_stream",
             expected_resource_id=job_id,
         )
     else:
         auth_header = request.headers.get("authorization", "")
         if auth_header.startswith("Bearer "):
             user_id = decode_token(auth_header.removeprefix("Bearer ").strip())
 
     if user_id is None:
         raise HTTPException(
             status_code=status.HTTP_401_UNAUTHORIZED,
             detail="Missing authentication token",
         )
 
     result = await db.execute(select(User).where(User.id == user_id))
     user = result.scalar_one_or_none()
     if user is None:
         raise HTTPException(
             status_code=status.HTTP_401_UNAUTHORIZED,
             detail="User not found",
         )
     if not user.email_verified:
         raise HTTPException(
             status_code=status.HTTP_403_FORBIDDEN,
             detail="Verify your email address to access recording, training, and billing features.",
         )
     return user
 
 
 @router.get("/stream/{job_id}")
 async def stream_training(
     job_id: int,
     request: Request,
     db: Annotated[AsyncSession, Depends(get_db)],
     token: str | None = Query(default=None),
 ) -> EventSourceResponse:
     """Stream queued training progress via Server-Sent Events."""
     current_user = await _resolve_sse_user(request, token, db, job_id=job_id)
     job = await get_owned_job_or_404(job_id, current_user)
     queue_manager = await init_job_queue()
+    active_connection_count = _active_sse_connections.get(current_user.id, 0)
+    if active_connection_count >= MAX_SSE_PER_USER:
+        raise HTTPException(
+            status_code=status.HTTP_429_TOO_MANY_REQUESTS,
+            detail="Too many active SSE connections. Close an existing stream and try again.",
+        )
+    _active_sse_connections[current_user.id] = active_connection_count + 1
+
+    def _release_connection() -> None:
+        remaining = _active_sse_connections.get(current_user.id, 0) - 1
+        if remaining > 0:
+            _active_sse_connections[current_user.id] = remaining
+        else:
+            _active_sse_connections.pop(current_user.id, None)
 
     if job.status.value in {"completed", "failed", "cancelled"}:
 
         async def _final_event():
-            yield {
-                "event": "training",
-                "data": json.dumps({
-                    "status": _legacy_status(job.status.value),
-                    "progress": job.progress_pct,
-                    "epoch": 0,
-                    "total_epochs": job.epochs,
-                    "train_loss": 0.0,
-                    "val_loss": 0.0,
-                    "d_prime": job.d_prime,
-                    "model_id": job.model_id,
-                    "message": job.error if job.status.value != "completed" else "Training complete.",
-                    "error": job.error,
-                }),
-            }
+            try:
+                yield {
+                    "event": "training",
+                    "data": json.dumps({
+                        "status": _legacy_status(job.status.value),
+                        "progress": job.progress_pct,
+                        "epoch": 0,
+                        "total_epochs": job.epochs,
+                        "train_loss": 0.0,
+                        "val_loss": 0.0,
+                        "d_prime": job.d_prime,
+                        "model_id": job.model_id,
+                        "message": job.error if job.status.value != "completed" else "Training complete.",
+                        "error": job.error,
+                    }),
+                }
+            finally:
+                _release_connection()
 
         return EventSourceResponse(_final_event())
 
-    queue = queue_manager.subscribe(job_id)
+    try:
+        queue = queue_manager.subscribe(job_id)
+    except TooManySubscribersError as exc:
+        _release_connection()
+        raise HTTPException(
+            status_code=status.HTTP_429_TOO_MANY_REQUESTS,
+            detail=str(exc),
+        ) from exc
 
     async def _event_generator():
         try:
             while True:
                 try:
                     event = await asyncio.wait_for(queue.get(), timeout=30.0)
                     if "status" in event:
                         event = {**event, "status": _legacy_status(str(event["status"]))}
                     yield {
                         "event": "training",
                         "data": json.dumps(event),
                     }
                     if event.get("status") in {"completed", "failed", "cancelled"}:
                         break
                 except asyncio.TimeoutError:
                     yield {"event": "ping", "data": ""}
         finally:
             queue_manager.unsubscribe(job_id, queue)
+            _release_connection()
 
     return EventSourceResponse(_event_generator())

 succeeded in 570ms:
9545987 (HEAD -> master, origin/master) fix(audio): try soundfile before torchaudio in load_audio
6de96f5 Document required training corpus mount
49ffd9a Add corpus downloader CLI
854acaf Add Edge TTS retry backoff
b45e03c Require corpus speech negatives in backend training
9d27691 fix(deps): add onnxscript + fast_mp3_augment to [training] extra
acdd18f Fix edge TTS negative generation
12e9a50 Add training pipeline latent bug audit
9cbb8e6 Fail fast on backend startup prerequisites
0c3923b Pin OpenWakeWord evaluation helpers to ONNX
196bfdd fix(training): four runtime bugs blocking the actual product
2320f2d ci: gate deploy-pages workflow behind manual dispatch
c6d87c3 docs(status): TIER 1-4 hardening pass complete
a561b4f fix(deploy): run alembic upgrade head in entrypoint + persist webhook idempotency
ee8f735 Fix trivial public page accessibility issues
9ced0a4 Add live accessibility audit report
3ed32ec Persist Stripe webhook idempotency
2565b14 Update legal pages for billing and email providers
7ef1c05 ci(deploy): GitHub Action to auto-deploy frontend to Pages on master push
9f7e544 (tag: v0.2.3) release: v0.2.3
06c878b feat(launch-prep): TIER 1-4 production hardening pass
c12b9ff Add security regression tests
96ebb19 docs(status): test-debt resolved (136 passed, 0 failed)
0c48227 Fix team invite route unit tests
8af98d7 Update job queue priority tests
d552e58 Fix health details auth tests
ddbfb8e docs(stripe): flip TEST -> LIVE in production status
0c829bb Fix billing test auth setup
8fe1d51 Fix backend API contract tests
0469ad8 test: fix anyio TestClient teardown hang in billing/health tests
9ca2f55 docs: operations runbook + status updates for 2026-05-07 deploy
d75a971 chore(wasm): commit deployed browser SDK bundle to frontend public
8df121c feat(rate-limit): use CF-Connecting-IP for keying + raise REGISTER_LIMIT 10/hr -> 100/hr
d43e841 chore: gitignore .openapi_live.json debug artifact
028f000 docs(deploy): canonical deployment + production-status guides
5d7ac2a Merge branch 'livetest/wasm' into master
71be46c Merge branch 'livetest/teams-and-invites' into master
a545d72 Merge branch 'livetest/exhaustive-tests' into master
574fcef chore(eval): training and benchmark tooling tweaks
6d589d8 test(auth): adapt direct-route tests to security sprint signatures
cb1ffca feat(security): post-launch hardening sprint
2a517d0 test: add live deployment smoke suite
ab2f4af docs(wasm): update browser sdk instructions
da209e1 ci(wasm): build browser sdk
d63e869 fix(wasm-demo): ship runnable browser bundle
6416f2f fix(wasm): support current onnxruntime metadata
ab47fa8 feat(teams): wire console team management
dbaaabc feat(teams): send invite emails
195d65c test(backend): cover logged-in password changes
a7b5092 chore(models): remove deprecated registry references
bf778a9 chore(ci): implement model verification and docs scripts
7b66e49 feat(frontend): add launch metadata and password page
9912ac5 chore: ignore local launch artifacts
4afb3e3 docs: living-doc updates from launch sprint
67b3beb chore(deploy): production docker-compose
ed6070a feat(backend): add login_lockout migration + entrypoint

codex
The git diff so far shows `/api/training/status` already used the queue lookup at `54f20b4`; today’s visible changes added SSE limits, per-user pending limits, migrations, and training-pipeline behavior, not a switch from Postgres status reads to SQLite status reads. I’m also checking the code actually loaded inside `wakeword-backend-1`, because a stale container would be the only way the live endpoint could disagree with the checked-out code path.
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command 'git log --oneline --name-only 54f20b4.. -- console/backend/app/routes/training.py console/backend/app/job_queue.py console/backend/app/routes/jobs.py console/backend/app/services/training_service.py console/backend/app/models.py console/backend/alembic/versions' in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command 'git diff --unified=25 54f20b4..HEAD -G "get_training_status|get_owned_job_or_404|submit_job|INSERT INTO jobs|TrainingJob|training_jobs|_create_model_record|run_training_job_sync" -- console/backend/app/routes/training.py console/backend/app/routes/jobs.py console/backend/app/job_queue.py console/backend/app/services/training_service.py console/backend/app/models.py' in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command "docker exec wakeword-backend-1 python -c \"import inspect; from app.config import settings; from app.routes.training import get_training_status; from app.routes.jobs import get_owned_job_or_404; from app.job_queue import JobQueue; print('training_file=', inspect.getfile(get_training_status)); print(inspect.getsource(get_training_status)); print('owned_file=', inspect.getfile(get_owned_job_or_404)); print(inspect.getsource(get_owned_job_or_404)); print('queue_get_job_file=', inspect.getfile(JobQueue.get_job)); print(inspect.getsource(JobQueue.get_job)); print('queue_db=', settings.data_dir / 'job_queue.db')\"" in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command 'docker exec wakeword-backend-1 python -c "import inspect; from app.job_queue import JobQueue; print(inspect.getsource(JobQueue.submit_job)); print(inspect.getsource(JobQueue._update_job)); print(inspect.getsource(JobQueue._create_model_record))"' in J:\CLAUDE\PROJECTS\Wakeword
 succeeded in 542ms:
diff --git a/console/backend/app/job_queue.py b/console/backend/app/job_queue.py
index f782cbe..1b5db12 100644
--- a/console/backend/app/job_queue.py
+++ b/console/backend/app/job_queue.py
@@ -1,56 +1,58 @@
 """Persistent async training job queue with circuit breaker protection."""
 
 from __future__ import annotations
 
 import asyncio
 import json
 import logging
 import shutil
 import tempfile
 import threading
 from collections.abc import AsyncIterator
 from contextlib import asynccontextmanager, suppress
 from dataclasses import dataclass, field
 from datetime import datetime, timedelta, timezone
 from enum import Enum
 from pathlib import Path
 from typing import Any
 
 import aiosqlite
 from sqlalchemy import select
 
 from app.config import settings
 from app.database import async_session_factory
-from app.models import Recording, TrainedModel
+from app.models import Recording, TrainedModel, User
 from app.monitoring import log_exception
 from app.services.training_service import TrainingCancelledError, run_training_job_sync
 from app.storage import build_companion_config_identifier, build_model_key, get_storage
 
 logger = logging.getLogger("violawake.jobs")
 
 QUEUE_MAX_SIZE = 50
+PER_USER_MAX_PENDING = 3
+MAX_SUBSCRIBERS_PER_JOB = 5
 FAILURE_THRESHOLD = 3
 FAILURE_BACKOFF_SECONDS = 300
 ACCOUNT_DELETE_CANCEL_TIMEOUT_SECONDS = 30.0
 
 
 def _utcnow() -> datetime:
     return datetime.now(timezone.utc)
 
 
 def _serialize_datetime(value: datetime | None) -> str | None:
     if value is None:
         return None
     return value.astimezone(timezone.utc).isoformat()
 
 
 def _deserialize_datetime(value: str | None) -> datetime | None:
     if not value:
         return None
     parsed = datetime.fromisoformat(value)
     if parsed.tzinfo is None:
         return parsed.replace(tzinfo=timezone.utc)
     return parsed.astimezone(timezone.utc)
 
 
 class JobStatus(str, Enum):
@@ -106,69 +108,78 @@ _TIER_PRIORITY: dict[str, int] = {
     "free": PRIORITY_FREE,
     "developer": PRIORITY_DEVELOPER,
     "business": PRIORITY_BUSINESS,
     "enterprise": PRIORITY_ENTERPRISE,
 }
 
 
 async def _resolve_user_priority(user_id: int) -> int:
     """Return the queue priority for a user based on their subscription tier."""
     from app.models import Subscription
 
     async with async_session_factory() as session:
         result = await session.execute(
             select(Subscription.tier).where(Subscription.user_id == user_id)
         )
         row = result.first()
         tier = row[0] if row else "free"
 
     return _TIER_PRIORITY.get(str(tier), PRIORITY_FREE)
 
 
 class QueueFullError(RuntimeError):
     """Raised when the persistent queue is at capacity."""
 
 
+class TooManyPendingJobsError(RuntimeError):
+    """Raised when a user already has too many active jobs."""
+
+
+class TooManySubscribersError(RuntimeError):
+    """Raised when a job already has too many SSE subscribers."""
+
+
 class JobQueue:
     """Persistent async training job queue."""
 
     def __init__(
         self,
         *,
         db_path: Path | None = None,
         max_concurrent: int = 2,
         max_pending: int = QUEUE_MAX_SIZE,
     ) -> None:
         self._db_path = db_path or (settings.data_dir / "job_queue.db")
         self._queue: asyncio.Queue[int] = asyncio.Queue(maxsize=max_pending)
         self._semaphore = asyncio.Semaphore(max_concurrent)
         self._subscribers: dict[int, list[asyncio.Queue[dict[str, Any]]]] = {}
         self._queued_job_ids: set[int] = set()
         self._running_job_ids: set[int] = set()
         self._cancel_events: dict[int, threading.Event] = {}
         self._inflight_tasks: set[asyncio.Task[None]] = set()
         self._retry_tasks: dict[int, asyncio.Task[None]] = {}
+        self._submission_lock = asyncio.Lock()
         self._state_lock = asyncio.Lock()
         self._refill_lock = asyncio.Lock()
         self._worker_task: asyncio.Task[None] | None = None
         self._closed = False
 
     async def start(self) -> None:
         """Initialize persistence and start the dispatcher loop."""
         await self._initialize_db()
         await self._resume_jobs()
         self._worker_task = asyncio.create_task(self._worker_loop(), name="job-queue-worker")
         await self._fill_queue_from_db()
         logger.info("Job queue started with max_concurrent=%s", settings.max_concurrent_jobs)
 
     async def shutdown(self) -> None:
         """Stop the dispatcher loop and cancel outstanding retry timers."""
         self._closed = True
         if self._worker_task is not None:
             self._worker_task.cancel()
             with suppress(asyncio.CancelledError):
                 await self._worker_task
             self._worker_task = None
 
         for cancel_event in list(self._cancel_events.values()):
             cancel_event.set()
 
@@ -188,87 +199,107 @@ class JobQueue:
         self._retry_tasks.clear()
 
     async def submit_job(
         self,
         *,
         user_id: int,
         wake_word: str,
         recording_ids: list[int],
         epochs: int,
         priority: int | None = None,
     ) -> int:
         """Persist a new training job and enqueue it when capacity allows.
 
         When *priority* is not supplied it is resolved automatically from the
         user's subscription tier (free=0, developer=5, business=10).
         """
         if await self._pending_count() >= self._queue.maxsize:
             raise QueueFullError("Training queue is full. Please try again later.")
 
         if priority is None:
             priority = await _resolve_user_priority(user_id)
 
         created_at = _utcnow()
         payload = json.dumps(recording_ids)
 
-        async with self._connect() as conn:
-            cursor = await conn.execute(
-                """
-                INSERT INTO jobs (
-                    user_id,
-                    wake_word,
-                    status,
-                    created_at,
-                    started_at,
-                    completed_at,
-                    error,
-                    progress_pct,
-                    recording_ids,
-                    epochs,
-                    model_id,
-                    d_prime,
-                    priority
-                ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
-                """,
-                (
-                    user_id,
-                    wake_word,
-                    JobStatus.PENDING.value,
-                    _serialize_datetime(created_at),
-                    None,
-                    None,
-                    None,
-                    0.0,
-                    payload,
-                    epochs,
-                    None,
-                    None,
-                    priority,
-                ),
-            )
-            await conn.commit()
-            job_id = int(cursor.lastrowid)
+        async with self._submission_lock:
+            async with self._connect() as conn:
+                async with conn.execute(
+                    """
+                    SELECT COUNT(*) AS count
+                    FROM jobs
+                    WHERE user_id = ? AND status IN (?, ?)
+                    """,
+                    (
+                        user_id,
+                        JobStatus.PENDING.value,
+                        JobStatus.RUNNING.value,
+                    ),
+                ) as cursor:
+                    row = await cursor.fetchone()
+                active_job_count = int(row["count"]) if row is not None else 0
+                if active_job_count >= PER_USER_MAX_PENDING:
+                    raise TooManyPendingJobsError(
+                        "Too many pending jobs. Wait for current jobs to complete."
+                    )
+
+                cursor = await conn.execute(
+                    """
+                    INSERT INTO jobs (
+                        user_id,
+                        wake_word,
+                        status,
+                        created_at,
+                        started_at,
+                        completed_at,
+                        error,
+                        progress_pct,
+                        recording_ids,
+                        epochs,
+                        model_id,
+                        d_prime,
+                        priority
+                    ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+                    """,
+                    (
+                        user_id,
+                        wake_word,
+                        JobStatus.PENDING.value,
+                        _serialize_datetime(created_at),
+                        None,
+                        None,
+                        None,
+                        0.0,
+                        payload,
+                        epochs,
+                        None,
+                        None,
+                        priority,
+                    ),
+                )
+                await conn.commit()
+                job_id = int(cursor.lastrowid)
 
         logger.info(
             "Queued training job %s for user %s (priority=%s)",
             job_id,
             user_id,
             priority,
         )
         await self._fill_queue_from_db()
         # Publish an initial PENDING event so SSE subscribers immediately see
         # their queue position after submission.
         queue_position = await self._queue_position(job_id)
         await self._publish(
             job_id,
             {
                 "status": JobStatus.PENDING.value,
                 "progress": 0.0,
                 "epoch": 0,
                 "total_epochs": epochs,
                 "train_loss": 0.0,
                 "val_loss": 0.0,
                 "message": "Queued for training.",
                 "error": None,
                 "d_prime": None,
                 "model_id": None,
                 "queue_position": queue_position,
@@ -451,50 +482,52 @@ class JobQueue:
         async with self._state_lock:
             queued_job_ids = sorted(self._queued_job_ids)
             running_job_ids = sorted(self._running_job_ids)
 
         worker_task_running = self._worker_task is not None and not self._worker_task.done()
         active_workers = len(running_job_ids)
         max_workers = settings.max_concurrent_jobs
         return {
             "queue_depth": pending_count,
             "in_memory_queue_depth": self._queue.qsize(),
             "persisted_running_jobs": persisted_running_count,
             "worker_status": {
                 "active_workers": active_workers,
                 "max_workers": max_workers,
                 "available_slots": max(max_workers - active_workers, 0),
                 "worker_task_running": worker_task_running,
                 "queued_job_ids": queued_job_ids,
                 "running_job_ids": running_job_ids,
             },
         }
 
     def subscribe(self, job_id: int) -> asyncio.Queue[dict[str, Any]]:
         """Subscribe to SSE-style job updates."""
         queue: asyncio.Queue[dict[str, Any]] = asyncio.Queue()
         listeners = self._subscribers.setdefault(job_id, [])
+        if len(listeners) >= MAX_SUBSCRIBERS_PER_JOB:
+            raise TooManySubscribersError("Too many subscribers for this job.")
         listeners.append(queue)
         return queue
 
     def unsubscribe(self, job_id: int, queue: asyncio.Queue[dict[str, Any]]) -> None:
         """Unsubscribe from SSE-style job updates."""
         listeners = self._subscribers.get(job_id)
         if listeners is None:
             return
         try:
             listeners.remove(queue)
         except ValueError:
             return
         if not listeners:
             self._subscribers.pop(job_id, None)
 
     async def _initialize_db(self) -> None:
         self._db_path.parent.mkdir(parents=True, exist_ok=True)
         async with self._connect() as conn:
             await conn.execute("PRAGMA journal_mode=WAL")
             await conn.execute("PRAGMA foreign_keys=ON")
             await conn.execute(
                 """
                 CREATE TABLE IF NOT EXISTS jobs (
                     id INTEGER PRIMARY KEY AUTOINCREMENT,
                     user_id INTEGER NOT NULL,
@@ -730,50 +763,69 @@ class JobQueue:
                 d_prime=artifact.d_prime,
             )
             await self._record_success(job.user_id)
 
             # Schedule post-training recording deletion (privacy: recordings
             # are deleted after training per the privacy FAQ).
             await self._schedule_recording_cleanup(job.recording_ids)
 
             await self._publish(
                 job_id,
                 {
                     "status": JobStatus.COMPLETED.value,
                     "progress": 100.0,
                     "epoch": job.epochs,
                     "total_epochs": job.epochs,
                     "train_loss": 0.0,
                     "val_loss": 0.0,
                     "message": "Training complete.",
                     "error": None,
                     "d_prime": artifact.d_prime,
                     "model_id": model_id,
                     "queue_position": None,
                 },
             )
             logger.info("Training job %s completed for user %s", job_id, job.user_id)
+
+            # Best-effort training-complete email notification.
+            try:
+                from app.email_service import get_email_service
+
+                email_svc = get_email_service()
+                if email_svc.enabled:
+                    async with async_session_factory() as session:
+                        user = await session.get(User, job.user_id)
+                    if user is not None:
+                        download_url = f"/models/{model_id}/download"
+                        await email_svc.send_training_complete(
+                            to=user.email,
+                            model_name=job.wake_word,
+                            download_url=download_url,
+                        )
+            except Exception as email_exc:
+                log_exception(logger, email_exc, message="Training-complete email failed", source="email")
+
         except TrainingCancelledError as exc:
             current_job = await self.get_job(job_id)
             completed_at = _utcnow()
             progress_pct = current_job.progress_pct if current_job is not None else 0.0
             await self._update_job(
                 job_id,
                 status=JobStatus.CANCELLED,
                 completed_at=completed_at,
                 error=str(exc),
             )
             await self._publish(
                 job_id,
                 {
                     "status": JobStatus.CANCELLED.value,
                     "progress": progress_pct,
                     "epoch": 0,
                     "total_epochs": current_job.epochs if current_job is not None else 0,
                     "train_loss": 0.0,
                     "val_loss": 0.0,
                     "message": "Training cancelled.",
                     "error": str(exc),
                     "d_prime": current_job.d_prime if current_job is not None else None,
                     "model_id": current_job.model_id if current_job is not None else None,
                     "queue_position": None,
                 },

 succeeded in 611ms:
b45e03c Require corpus speech negatives in backend training
console/backend/app/services/training_service.py
3ed32ec Persist Stripe webhook idempotency
console/backend/alembic/versions/20260507_0001_d4e5f6a7b8c9_add_processed_stripe_events_table.py
console/backend/app/models.py
cb1ffca feat(security): post-launch hardening sprint
console/backend/app/job_queue.py
console/backend/app/models.py
console/backend/app/routes/jobs.py
console/backend/app/routes/training.py
ed6070a feat(backend): add login_lockout migration + entrypoint
console/backend/alembic/versions/20260405_0001_c3d4e5f6a7b8_add_login_lockout_and_soft_delete.py

 succeeded in 1693ms:
    async def submit_job(
        self,
        *,
        user_id: int,
        wake_word: str,
        recording_ids: list[int],
        epochs: int,
        priority: int | None = None,
    ) -> int:
        """Persist a new training job and enqueue it when capacity allows.

        When *priority* is not supplied it is resolved automatically from the
        user's subscription tier (free=0, developer=5, business=10).
        """
        if await self._pending_count() >= self._queue.maxsize:
            raise QueueFullError("Training queue is full. Please try again later.")

        if priority is None:
            priority = await _resolve_user_priority(user_id)

        created_at = _utcnow()
        payload = json.dumps(recording_ids)

        async with self._submission_lock:
            async with self._connect() as conn:
                async with conn.execute(
                    """
                    SELECT COUNT(*) AS count
                    FROM jobs
                    WHERE user_id = ? AND status IN (?, ?)
                    """,
                    (
                        user_id,
                        JobStatus.PENDING.value,
                        JobStatus.RUNNING.value,
                    ),
                ) as cursor:
                    row = await cursor.fetchone()
                active_job_count = int(row["count"]) if row is not None else 0
                if active_job_count >= PER_USER_MAX_PENDING:
                    raise TooManyPendingJobsError(
                        "Too many pending jobs. Wait for current jobs to complete."
                    )

                cursor = await conn.execute(
                    """
                    INSERT INTO jobs (
                        user_id,
                        wake_word,
                        status,
                        created_at,
                        started_at,
                        completed_at,
                        error,
                        progress_pct,
                        recording_ids,
                        epochs,
                        model_id,
                        d_prime,
                        priority
                    ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
                    """,
                    (
                        user_id,
                        wake_word,
                        JobStatus.PENDING.value,
                        _serialize_datetime(created_at),
                        None,
                        None,
                        None,
                        0.0,
                        payload,
                        epochs,
                        None,
                        None,
                        priority,
                    ),
                )
                await conn.commit()
                job_id = int(cursor.lastrowid)

        logger.info(
            "Queued training job %s for user %s (priority=%s)",
            job_id,
            user_id,
            priority,
        )
        await self._fill_queue_from_db()
        # Publish an initial PENDING event so SSE subscribers immediately see
        # their queue position after submission.
        queue_position = await self._queue_position(job_id)
        await self._publish(
            job_id,
            {
                "status": JobStatus.PENDING.value,
                "progress": 0.0,
                "epoch": 0,
                "total_epochs": epochs,
                "train_loss": 0.0,
                "val_loss": 0.0,
                "message": "Queued for training.",
                "error": None,
                "d_prime": None,
                "model_id": None,
                "queue_position": queue_position,
            },
        )
        return job_id

    async def _update_job(
        self,
        job_id: int,
        *,
        status: JobStatus | None = None,
        progress_pct: float | None = None,
        started_at: datetime | None = None,
        completed_at: datetime | None = None,
        error: str | None = None,
        model_id: int | None = None,
        d_prime: float | None = None,
    ) -> None:
        assignments: list[str] = []
        values: list[Any] = []

        if status is not None:
            assignments.append("status = ?")
            values.append(status.value)
        if progress_pct is not None:
            assignments.append("progress_pct = ?")
            values.append(progress_pct)
        if started_at is not None:
            assignments.append("started_at = ?")
            values.append(_serialize_datetime(started_at))
        if completed_at is not None:
            assignments.append("completed_at = ?")
            values.append(_serialize_datetime(completed_at))
        if error is not None or status in {JobStatus.RUNNING, JobStatus.COMPLETED, JobStatus.CANCELLED}:
            assignments.append("error = ?")
            values.append(error)
        if model_id is not None:
            assignments.append("model_id = ?")
            values.append(model_id)
        if d_prime is not None:
            assignments.append("d_prime = ?")
            values.append(d_prime)

        if not assignments:
            return

        values.append(job_id)
        async with self._connect() as conn:
            await conn.execute(
                f"UPDATE jobs SET {', '.join(assignments)} WHERE id = ?",
                values,
            )
            await conn.commit()

    async def _create_model_record(
        self,
        *,
        user_id: int,
        wake_word: str,
        file_path: str,
        config_json: str | None,
        d_prime: float | None,
        size_bytes: int,
    ) -> int:
        async with async_session_factory() as session:
            model = TrainedModel(
                user_id=user_id,
                wake_word=wake_word,
                file_path=str(file_path),
                config_json=config_json,
                d_prime=d_prime,
                size_bytes=size_bytes,
            )
            session.add(model)
            await session.flush()
            await session.commit()
            return int(model.id)


 succeeded in 2042ms:
training_file= /app/app/routes/training.py
@router.get("/status/{job_id}", response_model=TrainingStatusResponse)
async def get_training_status(
    job_id: int,
    current_user: Annotated[User, Depends(get_verified_user)],
) -> TrainingStatusResponse:
    """Get the current status of a queued training job."""
    job = await get_owned_job_or_404(job_id, current_user)
    return TrainingStatusResponse(
        job_id=job.id,
        status=_legacy_status(job.status.value),
        progress=job.progress_pct,
        d_prime=job.d_prime,
        model_id=job.model_id,
        error=job.error,
    )

owned_file= /app/app/routes/jobs.py
async def get_owned_job_or_404(job_id: int, current_user: User) -> Job:
    """Return an owned job or raise 404."""
    job = await (await init_job_queue()).get_job(job_id)
    if job is None or job.user_id != current_user.id:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Training job not found")
    return job

queue_get_job_file= /app/app/job_queue.py
    async def get_job(self, job_id: int) -> Job | None:
        """Return a persisted job by ID."""
        async with self._connect() as conn, conn.execute(
            "SELECT * FROM jobs WHERE id = ?",
            (job_id,),
        ) as cursor:
            row = await cursor.fetchone()
        if row is None:
            return None
        return self._row_to_job(row)

queue_db= /app/data/job_queue.db

exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$i=0; Get-Content '"'console/backend/app/database.py' | ForEach-Object { "'$i++; '"'{0,4}: {1}' -f "'$i, $_ }' in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$i=0; Get-Content '"'console/backend/app/config.py' | ForEach-Object { "'$i++; if ($i -le 180) { '"'{0,4}: {1}' -f "'$i, $_ } }' in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command "rg -n \"DATABASE_URL|database_url|sqlite|job_queue.db|data_dir|create_async_engine|async_session_factory|TrainingJob|__tablename__ = \\\"jobs\\\"\" console/backend/app console/backend -S" in J:\CLAUDE\PROJECTS\Wakeword
 succeeded in 653ms:
   1: """SQLAlchemy async database setup."""
   2: 
   3: from __future__ import annotations
   4: 
   5: from collections.abc import AsyncGenerator
   6: 
   7: from sqlalchemy import inspect, text
   8: from sqlalchemy.engine import Connection
   9: from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
  10: from sqlalchemy.orm import DeclarativeBase
  11: 
  12: from app.config import settings
  13: 
  14: # Railway deployments should set VIOLAWAKE_DB_URL to a full
  15: # postgresql+asyncpg://... URL so the backend uses persistent PostgreSQL
  16: # instead of the default filesystem-backed SQLite database.
  17: DATABASE_URL = (
  18:     settings.db_url.strip()
  19:     if settings.db_url and settings.db_url.strip()
  20:     else f"sqlite+aiosqlite:///{settings.db_path}"
  21: )
  22: 
  23: engine = create_async_engine(DATABASE_URL, echo=False)
  24: async_session_factory = async_sessionmaker(engine, expire_on_commit=False)
  25: 
  26: 
  27: class Base(DeclarativeBase):
  28:     """Declarative base for all ORM models."""
  29:     pass
  30: 
  31: 
  32: def _ensure_schema_updates(connection: Connection) -> None:
  33:     """Apply lightweight schema updates for local-first deployments."""
  34:     inspector = inspect(connection)
  35:     table_names = set(inspector.get_table_names())
  36:     if "users" not in table_names:
  37:         return
  38: 
  39:     user_columns = {column["name"] for column in inspector.get_columns("users")}
  40:     if "email_verified" not in user_columns:
  41:         connection.execute(
  42:             text("ALTER TABLE users ADD COLUMN email_verified BOOLEAN NOT NULL DEFAULT FALSE")
  43:         )
  44:     if "failed_login_count" not in user_columns:
  45:         try:
  46:             connection.execute(
  47:                 text(
  48:                     "ALTER TABLE users ADD COLUMN IF NOT EXISTS "
  49:                     "failed_login_count INTEGER DEFAULT 0 NOT NULL"
  50:                 )
  51:             )
  52:         except Exception:
  53:             connection.execute(
  54:                 text("ALTER TABLE users ADD COLUMN failed_login_count INTEGER DEFAULT 0 NOT NULL")
  55:             )
  56:     if "locked_until" not in user_columns:
  57:         try:
  58:             connection.execute(
  59:                 text("ALTER TABLE users ADD COLUMN IF NOT EXISTS locked_until TIMESTAMP")
  60:             )
  61:         except Exception:
  62:             connection.execute(text("ALTER TABLE users ADD COLUMN locked_until TIMESTAMP"))
  63: 
  64:     # Team FK columns on recordings and trained_models (nullable, so no default needed)
  65:     if "recordings" in table_names:
  66:         recording_columns = {col["name"] for col in inspector.get_columns("recordings")}
  67:         if "team_id" not in recording_columns:
  68:             connection.execute(text("ALTER TABLE recordings ADD COLUMN team_id INTEGER REFERENCES teams(id)"))
  69: 
  70:     if "trained_models" in table_names:
  71:         model_columns = {col["name"] for col in inspector.get_columns("trained_models")}
  72:         if "team_id" not in model_columns:
  73:             connection.execute(text("ALTER TABLE trained_models ADD COLUMN team_id INTEGER REFERENCES teams(id)"))
  74: 
  75:     # Soft-delete support: recordings are marked deleted_at after training completes
  76:     if "recordings" in table_names:
  77:         recording_columns = {col["name"] for col in inspector.get_columns("recordings")}
  78:         if "deleted_at" not in recording_columns:
  79:             connection.execute(text("ALTER TABLE recordings ADD COLUMN deleted_at TIMESTAMP"))
  80: 
  81: 
  82: async def get_db() -> AsyncGenerator[AsyncSession, None]:
  83:     """FastAPI dependency that yields a database session."""
  84:     async with async_session_factory() as session:
  85:         try:
  86:             yield session
  87:             await session.commit()
  88:         except Exception:
  89:             await session.rollback()
  90:             raise
  91: 
  92: 
  93: async def init_db() -> None:
  94:     """Create all tables (idempotent)."""
  95:     async with engine.begin() as conn:
  96:         await conn.run_sync(Base.metadata.create_all)
  97:         await conn.run_sync(_ensure_schema_updates)

 succeeded in 821ms:
   1: """Application configuration for ViolaWake Console backend."""
   2: 
   3: from __future__ import annotations
   4: 
   5: import secrets
   6: from pathlib import Path
   7: from typing import Annotated, Any, Self
   8: 
   9: from pydantic import field_validator, model_validator
  10: from pydantic_settings import BaseSettings, NoDecode, SettingsConfigDict
  11: 
  12: DEFAULT_CORS_ORIGINS = [
  13:     "http://localhost:5173",
  14:     "http://127.0.0.1:5173",
  15: ]
  16: 
  17: 
  18: def _generate_dev_secret_key() -> str:
  19:     """Generate a development-only JWT key."""
  20:     return secrets.token_urlsafe(32)
  21: 
  22: 
  23: class Settings(BaseSettings):
  24:     """Application settings loaded from environment / .env file."""
  25: 
  26:     # Environment
  27:     env: str = "development"
  28: 
  29:     # Paths
  30:     base_dir: Path = Path(__file__).resolve().parent.parent
  31:     data_dir: Path = Path(__file__).resolve().parent.parent / "data"
  32:     db_path: Path = Path(__file__).resolve().parent.parent / "data" / "violawake.db"
  33:     upload_dir: Path = Path(__file__).resolve().parent.parent / "data" / "recordings"
  34:     models_dir: Path = Path(__file__).resolve().parent.parent / "data" / "models"
  35:     tmp_dir: Path = Path(__file__).resolve().parent.parent / "data" / "tmp"
  36: 
  37:     # Object storage
  38:     r2_endpoint: str = ""
  39:     r2_access_key_id: str = ""
  40:     r2_secret_access_key: str = ""
  41:     r2_bucket: str = "violawake"
  42: 
  43:     # Database
  44:     db_url: str = ""  # Optional full SQLAlchemy async URL, e.g. Railway PostgreSQL
  45: 
  46:     # Auth
  47:     secret_key: str = ""
  48:     algorithm: str = "HS256"
  49:     access_token_expire_hours: int = 2
  50:     trusted_proxy_count: int = 0
  51: 
  52:     # CORS
  53:     cors_origins: Annotated[list[str], NoDecode] = DEFAULT_CORS_ORIGINS.copy()
  54: 
  55:     # Training
  56:     training_timeout: int = 1800  # seconds (30 minutes)
  57:     max_concurrent_jobs: int = 2
  58:     negatives_corpus_dir: str = ""  # Path to curated negative audio corpus (paid tier)
  59: 
  60:     # Retention cleanup (0 = disabled)
  61:     recording_retention_days: int = 90  # Days to keep recordings; 0 disables automatic cleanup
  62:     model_retention_days: int = 365  # Days to keep trained models; 0 disables automatic cleanup
  63:     post_training_retention_hours: int = 24  # Hours to keep recordings after training completes; 0 disables
  64: 
  65:     # Admin
  66:     admin_token: str = ""  # When set, enables POST /api/admin/cleanup (protect with a strong secret)
  67: 
  68:     # Stripe billing
  69:     stripe_secret_key: str = ""
  70:     stripe_webhook_secret: str = ""
  71:     stripe_price_developer: str = ""  # Stripe Price ID for $29/mo Developer tier
  72:     stripe_price_business: str = ""  # Stripe Price ID for $99/mo Business tier
  73:     sentry_dsn: str = ""
  74: 
  75:     # Free trial
  76:     trial_days: int = 14  # 0 to disable free trial for paid tiers
  77: 
  78:     # Console URLs (for Stripe checkout redirect)
  79:     console_base_url: str = "http://localhost:5173"
  80: 
  81:     # Email
  82:     resend_api_key: str = ""
  83: 
  84:     model_config = SettingsConfigDict(
  85:         env_prefix="VIOLAWAKE_",
  86:         env_file=".env",
  87:         extra="ignore",
  88:     )
  89: 
  90:     @field_validator("env", mode="before")
  91:     @classmethod
  92:     def normalize_env(cls, value: Any) -> str:
  93:         """Accept mixed-case env names while keeping comparisons consistent."""
  94:         if value is None:
  95:             return "development"
  96:         return str(value).strip().lower() or "development"
  97: 
  98:     @field_validator("cors_origins", mode="before")
  99:     @classmethod
 100:     def parse_cors_origins(cls, value: Any) -> Any:
 101:         """Accept comma-separated CORS origins from env vars."""
 102:         if isinstance(value, str):
 103:             raw = value.strip()
 104:             if not raw:
 105:                 return []
 106:             if raw.startswith("["):
 107:                 return value
 108:             return [origin.strip() for origin in raw.split(",") if origin.strip()]
 109:         return value
 110: 
 111:     @model_validator(mode="after")
 112:     def validate_production_settings(self) -> Self:
 113:         """Resolve development defaults and enforce production requirements."""
 114:         _MIN_SECRET_KEY_LENGTH = 32
 115:         _INSECURE_PLACEHOLDERS = {"changeme", "secret", "password", "test", "dev"}
 116: 
 117:         key = self.secret_key.strip()
 118:         key_is_empty = not key
 119:         key_is_placeholder = key.lower() in _INSECURE_PLACEHOLDERS
 120: 
 121:         if key_is_empty or key_is_placeholder:
 122:             if self.is_production:
 123:                 raise ValueError(
 124:                     "VIOLAWAKE_SECRET_KEY must be set to a unique, random value "
 125:                     "when VIOLAWAKE_ENV=production. "
 126:                     "Generate one with: python -c \"import secrets; print(secrets.token_urlsafe(64))\""
 127:                 )
 128:             import logging
 129:             _logger = logging.getLogger("violawake.config")
 130:             self.secret_key = _generate_dev_secret_key()
 131:             _logger.warning(
 132:                 "VIOLAWAKE_SECRET_KEY was empty or insecure â€” generated a random "
 133:                 "development key. DO NOT use this in production."
 134:             )
 135:         elif len(key) < _MIN_SECRET_KEY_LENGTH:
 136:             if self.is_production:
 137:                 raise ValueError(
 138:                     f"VIOLAWAKE_SECRET_KEY is too short ({len(key)} chars). "
 139:                     f"Production requires at least {_MIN_SECRET_KEY_LENGTH} characters. "
 140:                     "Generate one with: python -c \"import secrets; print(secrets.token_urlsafe(64))\""
 141:                 )
 142:             import logging
 143:             _logger = logging.getLogger("violawake.config")
 144:             _logger.warning(
 145:                 "VIOLAWAKE_SECRET_KEY is only %d characters (minimum %d recommended). "
 146:                 "Short keys are brute-forceable. This is acceptable for development only.",
 147:                 len(key),
 148:                 _MIN_SECRET_KEY_LENGTH,
 149:             )
 150:         return self
 151: 
 152:     @property
 153:     def is_production(self) -> bool:
 154:         return self.env == "production"
 155: 
 156:     @property
 157:     def database_url(self) -> str:
 158:         """Return the configured database URL, defaulting to local SQLite."""
 159:         if self.db_url and self.db_url.strip():
 160:             return self.db_url.strip()
 161:         return f"sqlite+aiosqlite:///{self.db_path}"
 162: 
 163:     @property
 164:     def database_log_target(self) -> str:
 165:         """Return a safe database identifier for logs without leaking credentials."""
 166:         if self.db_url and self.db_url.strip():
 167:             return "VIOLAWAKE_DB_URL"
 168:         return str(self.db_path)
 169: 
 170:     @property
 171:     def effective_cors_origins(self) -> list[str]:
 172:         """Return CORS origins.
 173: 
 174:         If ``cors_origins`` was explicitly set via env var, use exactly those.
 175:         Otherwise fall back to sensible defaults based on the environment.
 176:         """
 177:         if self.cors_origins != DEFAULT_CORS_ORIGINS:
 178:             return list(self.cors_origins)
 179:         if self.is_production:
 180:             return [

 succeeded in 1978ms:
BUILD_VS_BUY_AUDIT.md:188:| `backend/app/models.py` | 146 | 7 models using SQLAlchemy 2.0 `Mapped` annotations: User, Team, TeamMember, Recording, TrainingJob, TrainedModel, Subscription, UsageRecord |
BUILD_VS_BUY_AUDIT.md:203:- **No indexes on some foreign keys.** Most FKs have `index=True`, which is good. The `TrainingJob.model_id` FK lacks an index, but it is rarely queried by model_id so this is not a real issue.
BUILD_VS_BUY_AUDIT.md:213:| **SQLAlchemy async** | **Already using it.** Correctly configured with `async_sessionmaker` and `create_async_engine`. |
BUILD_VS_BUY_AUDIT.md:227:`backend/app/job_queue.py` — ~500+ lines. Custom persistent job queue using **aiosqlite** with:
BUILD_VS_BUY_AUDIT.md:259:This is the right architecture. The custom queue is purpose-built for ML training job management and would be harder to replicate with any generic queue library. The aiosqlite backend is appropriate for the traffic level and deployment model (single server on Railway).
console\tests\test_billing.py:7:import sqlite3
console\tests\test_billing.py:77:    with sqlite3.connect(settings.db_path) as conn:
console\tests\test_billing.py:128:    from app.database import async_session_factory
console\tests\test_billing.py:131:    async with async_session_factory() as session:
console\tests\test_billing.py:147:    from app.database import async_session_factory
console\tests\test_billing.py:150:    async with async_session_factory() as session:
console\tests\test_backend.py:13:import sqlite3
console\tests\test_backend.py:85:    with sqlite3.connect(settings.db_path) as conn:
console\tests\test_backend.py:125:    with sqlite3.connect(settings.db_path) as conn:
console\tests\test_backend.py:240:    with sqlite3.connect(settings.db_path) as conn:
console\tests\test_backend.py:317:    with sqlite3.connect(settings.db_path) as conn:
console\tests\test_backend.py:822:        with sqlite3.connect(settings.db_path) as conn:
console\tests\test_backend.py:915:        with sqlite3.connect(settings.db_path) as conn:
console\backend\requirements.txt:6:aiosqlite>=0.19
console\backend\tests\test_change_password.py:3:import sqlite3
console\backend\tests\test_change_password.py:27:    settings.data_dir.mkdir(parents=True, exist_ok=True)
console\backend\tests\test_change_password.py:28:    with sqlite3.connect(settings.db_path) as conn:
console\backend\tests\test_change_password.py:47:    with sqlite3.connect(settings.db_path) as conn:
console\tests\test_job_queue.py:397:            import aiosqlite
console\tests\test_job_queue.py:398:            async with aiosqlite.connect(q._db_path) as conn:
console\tests\test_job_queue.py:399:                conn.row_factory = aiosqlite.Row
console\tests\test_job_queue.py:424:            import aiosqlite
console\tests\test_job_queue.py:425:            async with aiosqlite.connect(q._db_path) as conn:
console\tests\test_job_queue.py:426:                conn.row_factory = aiosqlite.Row
console\tests\test_job_queue.py:476:            import aiosqlite
console\tests\test_job_queue.py:477:            async with aiosqlite.connect(q._db_path) as conn:
console\tests\test_job_queue.py:478:                conn.row_factory = aiosqlite.Row
console\backend\app\config.py:31:    data_dir: Path = Path(__file__).resolve().parent.parent / "data"
console\backend\app\config.py:157:    def database_url(self) -> str:
console\backend\app\config.py:161:        return f"sqlite+aiosqlite:///{self.db_path}"
console\backend\app\config.py:195:settings.data_dir.mkdir(parents=True, exist_ok=True)
console\backend\app\database.py:9:from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
console\backend\app\database.py:17:DATABASE_URL = (
console\backend\app\database.py:20:    else f"sqlite+aiosqlite:///{settings.db_path}"
console\backend\app\database.py:23:engine = create_async_engine(DATABASE_URL, echo=False)
console\backend\app\database.py:24:async_session_factory = async_sessionmaker(engine, expire_on_commit=False)
console\backend\app\database.py:84:    async with async_session_factory() as session:
console\tests\test_retention.py:107:            patch("app.retention.async_session_factory", return_value=mock_session),
console\tests\test_retention.py:136:            patch("app.retention.async_session_factory", return_value=mock_session),
console\tests\test_retention.py:167:            patch("app.retention.async_session_factory", return_value=mock_session),
console\tests\test_retention.py:197:            patch("app.retention.async_session_factory", return_value=mock_session),
console\tests\test_retention.py:248:            patch("app.retention.async_session_factory", return_value=mock_session),
console\tests\test_retention.py:276:            patch("app.retention.async_session_factory", return_value=mock_session),
console\tests\e2e\conftest.py:12:import sqlite3
console\tests\e2e\conftest.py:74:            with sqlite3.connect(target_db) as conn:
console\frontend\src\api.ts:7:  TrainingJob,
console\frontend\src\api.ts:289:): Promise<TrainingJob> {
console\frontend\src\api.ts:290:  return request<TrainingJob>(`/training/status/${jobId}`);
console\backend\alembic\env.py:40:database_url = settings.database_url
console\backend\alembic\env.py:50:        url=database_url,
console\backend\alembic\env.py:77:    configuration["sqlalchemy.url"] = database_url
console\backend\app\job_queue.py:19:import aiosqlite
console\backend\app\job_queue.py:23:from app.database import async_session_factory
console\backend\app\job_queue.py:119:    async with async_session_factory() as session:
console\backend\app\job_queue.py:151:        self._db_path = db_path or (settings.data_dir / "job_queue.db")
console\backend\app\job_queue.py:795:                    async with async_session_factory() as session:
console\backend\app\job_queue.py:1032:        conn: aiosqlite.Connection,
console\backend\app\job_queue.py:1172:        async with async_session_factory() as session:
console\backend\app\job_queue.py:1206:        async with async_session_factory() as session:
console\backend\app\job_queue.py:1227:        async with async_session_factory() as session:
console\backend\app\job_queue.py:1241:    def _row_to_job(self, row: aiosqlite.Row) -> Job:
console\backend\app\job_queue.py:1266:    async def _connect(self) -> AsyncIterator[aiosqlite.Connection]:
console\backend\app\job_queue.py:1267:        connection = await aiosqlite.connect(self._db_path, timeout=30)
console\backend\app\job_queue.py:1268:        connection.row_factory = aiosqlite.Row
console\backend\app\models.py:30:    training_jobs: Mapped[list[TrainingJob]] = relationship(back_populates="user", cascade="all, delete-orphan")
console\backend\app\models.py:82:class TrainingJob(Base):
console\backend\app\health.py:15:from app.database import async_session_factory
console\backend\app\health.py:72:        async with async_session_factory() as session:
console\frontend\src\types.ts:33:export interface TrainingJob {
console\backend\app\retention.py:12:from app.database import async_session_factory
console\backend\app\retention.py:29:    when the queue's aiosqlite DB diverges from the main app database.
console\backend\app\retention.py:38:    import aiosqlite
console\backend\app\retention.py:42:    async with aiosqlite.connect(queue._db_path, timeout=10) as conn:
console\backend\app\retention.py:43:        conn.row_factory = aiosqlite.Row
console\backend\app\retention.py:74:    async with async_session_factory() as session:
console\backend\app\retention.py:127:    async with async_session_factory() as session:
console\backend\app\retention.py:187:    async with async_session_factory() as session:
console\backend\app\retention.py:243:    async with async_session_factory() as session:
console\backend\app\routes\auth.py:28:from app.models import Recording, Subscription, TrainedModel, TrainingJob, UsageRecord, User
console\backend\app\routes\auth.py:419:    await db.execute(delete(TrainingJob).where(TrainingJob.user_id == current_user.id))
LAUNCH_READINESS.md:218:- **Persistent job queue** backed by aiosqlite (separate from main DB). Jobs survive restarts.
docs\TRAINING_PIPELINE_AUDIT_2026-05-07.md:102:DATABASE_URL = settings.db_url.strip() if settings.db_url and settings.db_url.strip() else ...
docs\TRAINING_PIPELINE_AUDIT_2026-05-07.md:103:self._db_path = db_path or (settings.data_dir / "job_queue.db")
docs\TRAINING_PIPELINE_AUDIT_2026-05-07.md:106:The app data model can use `VIOLAWAKE_DB_URL=postgresql+asyncpg://...`, but training job state is always an `aiosqlite` file under `/app/data`. The production compose file has a volume, so single-node Docker is survivable. Fresh deploys without a persistent `/app/data` volume, horizontal replicas, or platform restarts can lose pending/running job state while the main database remains intact. Proposed fix: move the queue tables into Postgres or add an explicit deployment guard that refuses multi-replica/ephemeral-volume production mode. Estimated effort: 1-2 days.
docs\TRAINING_PIPELINE_AUDIT_2026-05-07.md:182:Required backend paths: `console/backend/app/config.py:30-35` defines `data_dir`, `db_path`, `upload_dir`, `models_dir`, and `tmp_dir`; `config.py:195-198` creates them at import. `job_queue.py:151` requires a writable local `data/job_queue.db`; `training_service.py:72`, `107`, and `job_queue.py:707` require `settings.tmp_dir` for temporary training work.
scripts\deploy_launch.py:152:   - Copy the DATABASE_URL (starts with postgresql://...)
scripts\deploy_launch.py:296:            user_data_dir="",  # fresh context

exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$i=0; Get-Content '"'docs/TRAINING_PIPELINE_AUDIT_2026-05-07.md' | ForEach-Object { "'$i++; if ($i -ge 90 -and $i -le 115) { '"'{0,4}: {1}' -f "'$i, $_ } }' in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$i=0; Get-Content '"'LAUNCH_READINESS.md' | ForEach-Object { "'$i++; if ($i -ge 210 -and $i -le 225) { '"'{0,4}: {1}' -f "'$i, $_ } }' in J:\CLAUDE\PROJECTS\Wakeword
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$i=0; Get-Content '"'console/backend/app/retention.py' | ForEach-Object { "'$i++; if ($i -ge 1 -and $i -le 90) { '"'{0,4}: {1}' -f "'$i, $_ } }' in J:\CLAUDE\PROJECTS\Wakeword
 succeeded in 338ms:
  90: ```dockerfile
  91: RUN pip install --no-cache-dir "/sdk[training]"
  92: ```
  93: 
  94: The production image installs `violawake[training]`, which includes `edge-tts` but not the `tts` extra (`kokoro-onnx`). `_generate_tts_positives()` has a Kokoro fallback probe, but `TTSEngine` only loads `kokoro-onnx` and its large model files on first synthesis. Confusable and speech negatives do not try Kokoro at all. On a customer machine without internet, behind a proxy, or during Edge rate limiting, quality drops and training can fail if the mounted corpus is absent or too small. Proposed fix: make offline training explicit. Either ship/pre-download an offline TTS backend and its model assets into the image/cache, or remove online TTS from the synchronous path and require a mounted negative/positive corpus with a startup readiness check. Estimated effort: 1-2 days.
  95: 
  96: ### 6. HIGH - Production job queue persists to local SQLite even when the app database is Postgres
  97: 
  98: File/lines: `console/backend/app/database.py:17-23`, `console/backend/app/job_queue.py:151`, `docker-compose.production.yml:36`
  99: 
 100: Evidence:
 101: ```py
 102: DATABASE_URL = settings.db_url.strip() if settings.db_url and settings.db_url.strip() else ...
 103: self._db_path = db_path or (settings.data_dir / "job_queue.db")
 104: ```
 105: 
 106: The app data model can use `VIOLAWAKE_DB_URL=postgresql+asyncpg://...`, but training job state is always an `aiosqlite` file under `/app/data`. The production compose file has a volume, so single-node Docker is survivable. Fresh deploys without a persistent `/app/data` volume, horizontal replicas, or platform restarts can lose pending/running job state while the main database remains intact. Proposed fix: move the queue tables into Postgres or add an explicit deployment guard that refuses multi-replica/ephemeral-volume production mode. Estimated effort: 1-2 days.
 107: 
 108: ### 7. MEDIUM - Universal negative corpus is optional in the console path but quality-critical
 109: 
 110: File/lines: `console/backend/app/services/training_service.py:230-270`, `src/violawake_sdk/tools/train.py:2472-2485`, `docker-compose.production.yml:25-32`
 111: 
 112: Evidence:
 113: ```py
 114: _CORPUS_SEARCH_PATHS = [
 115:     Path(__file__).resolve().parent.parent.parent.parent / "corpus",

 succeeded in 339ms:
 210: 
 211: ---
 212: 
 213: ## 6. Training Pipeline -- YES
 214: 
 215: **Evidence reviewed:** `services/training_service.py` (full), `job_queue.py` (full), `routes/training.py`, `routes/jobs.py`
 216: 
 217: ### Architecture
 218: - **Persistent job queue** backed by aiosqlite (separate from main DB). Jobs survive restarts.
 219: - **Worker pool**: Configurable `max_concurrent_jobs` (default: 2). Training runs in `asyncio.to_thread()` to avoid blocking the event loop.
 220: - **Circuit breaker**: 3 consecutive failures pause the queue for 5 minutes. Prevents cascading failures.
 221: 
 222: ### Training process
 223: 1. Recordings downloaded from storage to temp directory
 224: 2. Minimum 5 valid WAV files required
 225: 3. Calls the Console training path (temporal CNN) with progress callback

 succeeded in 350ms:
   1: """Automatic retention cleanup for recordings and trained models."""
   2: 
   3: from __future__ import annotations
   4: 
   5: import json
   6: import logging
   7: from datetime import datetime, timedelta, timezone
   8: 
   9: from sqlalchemy import select
  10: 
  11: from app.config import settings
  12: from app.database import async_session_factory
  13: from app.models import Recording, TrainedModel
  14: from app.storage import get_storage
  15: 
  16: logger = logging.getLogger("violawake.retention")
  17: 
  18: 
  19: def _utcnow() -> datetime:
  20:     return datetime.now(timezone.utc)
  21: 
  22: 
  23: async def _get_active_recording_ids() -> set[int]:
  24:     """Return recording IDs referenced by active (pending or running) jobs.
  25: 
  26:     Recordings tied to an active training job must never be deleted while
  27:     that job is still running.  We look up the live job queue rather than
  28:     querying the SQLAlchemy session so the check is always accurate even
  29:     when the queue's aiosqlite DB diverges from the main app database.
  30:     """
  31:     try:
  32:         from app.job_queue import JobStatus, get_job_queue
  33:         queue = get_job_queue()
  34:     except RuntimeError:
  35:         # Queue not yet initialised (e.g. during testing without a running app)
  36:         return set()
  37: 
  38:     import aiosqlite
  39: 
  40:     active_ids: set[int] = set()
  41: 
  42:     async with aiosqlite.connect(queue._db_path, timeout=10) as conn:
  43:         conn.row_factory = aiosqlite.Row
  44:         async with conn.execute(
  45:             "SELECT recording_ids FROM jobs WHERE status IN (?, ?)",
  46:             (JobStatus.PENDING.value, JobStatus.RUNNING.value),
  47:         ) as cursor:
  48:             rows = await cursor.fetchall()
  49: 
  50:     for row in rows:
  51:         try:
  52:             ids = json.loads(row["recording_ids"])
  53:             active_ids.update(int(rid) for rid in ids)
  54:         except Exception:
  55:             pass
  56: 
  57:     return active_ids
  58: 
  59: 
  60: async def mark_recordings_for_deletion(recording_ids: list[int]) -> int:
  61:     """Soft-delete recordings by setting their deleted_at timestamp.
  62: 
  63:     Called after a training job completes successfully. The actual storage
  64:     file deletion happens later via ``cleanup_soft_deleted_recordings``.
  65: 
  66:     Returns the number of recordings marked.
  67:     """
  68:     if not recording_ids:
  69:         return 0
  70: 
  71:     now = _utcnow()
  72:     marked = 0
  73: 
  74:     async with async_session_factory() as session:
  75:         result = await session.execute(
  76:             select(Recording).where(
  77:                 Recording.id.in_(recording_ids),
  78:                 Recording.deleted_at.is_(None),
  79:             )
  80:         )
  81:         recordings = result.scalars().all()
  82: 
  83:         for recording in recordings:
  84:             recording.deleted_at = now
  85:             marked += 1
  86: 
  87:         if marked:
  88:             await session.commit()
  89: 
  90:     if marked:

codex
The repo already has an audit note calling this out: the app DB can be Postgres while the queue state remains `/app/data/job_queue.db`. I’m checking backend logs around job 49 only to reconcile the “queued for 15 minutes” observation with the row timestamps.
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command 'docker logs wakeword-backend-1 --since "2026-05-07T14:20:00Z" 2>&1 | Select-String -Pattern "job 49|jobs/49|status/49|training/status/49|Queued training job|Training job 49|adaptive_max_pool|ONNX|failed" -Context 1,1' in J:\CLAUDE\PROJECTS\Wakeword
2026-05-07T16:09:06.497953Z ERROR codex_core::tools::router: error=Exit code: 1
Wall time: 15.2 seconds
Total output lines: 4748
Output:

> {"timestamp": "2026-05-07T14:20:00.046239+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.39s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:01.643518+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.54s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:01.817213+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.29s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:05.989980+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.62s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:20:06.090101+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "56e00cc8d99241cd9a1ece58778bb3e1", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.269}
> {"timestamp": "2026-05-07T14:20:07.124590+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.18s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:08.377604+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.43s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:08.483448+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.67s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:10.069129+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.02s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:10.559964+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.23s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:20:10.701580+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "d4a30dca015a4a34af32f49ef1cd09db", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.64}
> {"timestamp": "2026-05-07T14:20:11.997095+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.53s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:13.544927+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.11s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:14.633052+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:14.894739+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.01s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:20:15.325290+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "7bcd16ecdb394d52a5d711698f86d270", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.616}
> {"timestamp": "2026-05-07T14:20:15.960860+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.92s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:17.327921+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.14s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:18.539626+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.38s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:18.689852+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.04s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:20:19.934175+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a04088e912ca472ca2562b080b6fb0fe", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.895}
> {"timestamp": "2026-05-07T14:20:20.251710+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:21.857363+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:22.964798+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.01s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:23.812660+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.47s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:20:24.589873+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "1582164001294987bcfd09b611d37451", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.438}
> {"timestamp": "2026-05-07T14:20:25.529944+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.61s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:25.893214+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:27.204191+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.71s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:27.551634+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.93s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:28.717059+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.64s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:20:29.212604+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "e6060c6c568a4cf498478fc0f21f6252", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.242}
> {"timestamp": "2026-05-07T14:20:30.255677+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.24s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:31.717539+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.90s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:31.909933+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.01s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:33.121827+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.23s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:20:33.881346+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "2d020655a9514994864bfd1b2e56919f", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.054}
> {"timestamp": "2026-05-07T14:20:34.097289+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.76s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:37.749808+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.67s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:38.877232+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:40.304113+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.52s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:40.601561+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.11s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:20:41.202543+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6694737069fe4ad8967fb9c63cdd10a2", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.509}
> {"timestamp": "2026-05-07T14:20:41.927690+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.83s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:43.175447+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.78s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:44.169303+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.61s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:44.543568+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:45.528744+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.71s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:20:45.818935+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "fb425bf744f3478491be261f21d2cbc9", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.653}
> {"timestamp": "2026-05-07T14:20:46.267181+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.34s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:47.814096+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.98s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:48.631162+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.81s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:49.727999+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.56s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:20:50.423835+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "0f39b408d8404e9190567cf75985f491", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.774}
> {"timestamp": "2026-05-07T14:20:50.948116+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:51.800360+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:52.426998+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.85s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:53.235939+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.11s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:20:55.013503+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "1dd7a4e041e04664a368c69556eab211", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.377}
> {"timestamp": "2026-05-07T14:20:55.071995+00:00", "level": "WARNING", "logg…122962 tokens truncated… "2026-05-07T15:01:09.891622+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.60s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:12.305055+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:13.797965+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.52s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:19.611083+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:20.785310+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.11s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:23.362335+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:24.920240+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.93s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:28.005896+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.37s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:29.598885+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.20s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:32.650564+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.80s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:33.629294+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.95s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:37.109220+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.00s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:38.308273+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.05s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:40.868761+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.78s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:41.873415+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.80s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:44.852097+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.85s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:45.926745+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.95s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:51.610441+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.48s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:53.329774+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.93s", "request_id": "-"}
  /usr/local/lib/python3.11/site-packages/violawake_sdk/training/temporal_model.py:271: UserWarning: # 'dynamic_axes' 
is not recommended when dynamo=True, and may lead to 'torch._dynamo.exc.UserError: Constraints violated.' Supply the 
'dynamic_shapes' argument instead if export is unsuccessful.
>   torch.onnx.export(
> W0507 15:14:47.094000 1 site-packages/torch/onnx/_internal/exporter/_compat.py:133] Setting ONNX exporter to use 
operator set version 18 because the requested opset_version 11 is a lower version than we have implementations for. 
Automatic version conversion will be performed, which may not be successful at converting to the requested version. If 
version conversion is unsuccessful, the opset version of the exported model will be kept at 18. Please consider 
setting opset_version >=18 to leverage latest ONNX features
> W0507 15:14:47.935000 1 site-packages/torch/onnx/_internal/exporter/_registration.py:110] torchvision is not 
installed. Skipping torchvision::nms
> W0507 15:14:47.936000 1 site-packages/torch/onnx/_internal/exporter/_registration.py:110] torchvision is not 
installed. Skipping torchvision::roi_align
> W0507 15:14:47.936000 1 site-packages/torch/onnx/_internal/exporter/_registration.py:110] torchvision is not 
installed. Skipping torchvision::roi_pool
  /usr/local/lib/python3.11/copyreg.py:105: FutureWarning: `isinstance(treespec, LeafSpec)` is deprecated, use 
`isinstance(treespec, TreeSpec) and treespec.is_leaf()` instead.
    return cls.__new__(cls, *args)
> {"timestamp": "2026-05-07T15:14:49.995941+00:00", "level": "ERROR", "logger": "violawake.training", "message": 
"Training job failed", "request_id": "-", "source": "training", "error_kind": "unexpected", "error_reason": "bug", 
"error_type": "ConversionError", "error_message": "Failed to convert the exported program to an ONNX model. 
\u001b[96mThis is step 3/3\u001b[0m of exporting the model to ONNX. Next steps:\n- If there is a missing ONNX 
function, implement it and register it to the registry.\n- If there is an internal error during ONNX conversion, debug 
the error and submit a PR to PyTorch.\n- Create an error report with `torch.onnx.export(..., report=True)`, and save 
the ExportedProgram as a pt2 file. Create an issue in the PyTorch GitHub repository against the 
\u001b[96m*onnx*\u001b[0m component. Attach the error report and the pt2 model.\n\n## Exception summary\n\n<class 
'torch.onnx._internal.exporter._errors.DispatchError'>: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\u2b06\ufe0f\n<class 'torch.onnx._internal.exporter._errors.ConversionError'>: Error when 
translating node %adaptive_max_pool2d : [num_users=1] = 
call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = (%unsqueeze, [1, 1]), kwargs = {}). See the 
stack trace for more information.\n\n(Refer to the full stack trace above for more information.)", "job_id": 49, 
"wake_word": "viola_e2e_1778163936", "exception": "Traceback (most recent call last):\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 816, in _translate_fx_graph\n 
   _handle_call_function_node_with_lowering(\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 598, in 
_handle_call_function_node_with_lowering\n    raise 
_errors.DispatchError(\ntorch.onnx._internal.exporter._errors.DispatchError: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent 
call last):\n  File \"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1509, in 
export\n    onnx_program = _exported_program_to_onnx_program(\n                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n 
 File \"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1123, in 
_exported_program_to_onnx_program\n    values = _translate_fx_graph(\n             ^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 842, in _translate_fx_graph\n 
   raise _errors.ConversionError(\ntorch.onnx._internal.exporter._errors.ConversionError: Error when translating node 
%adaptive_max_pool2d : [num_users=1] = call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = 
(%unsqueeze, [1, 1]), kwargs = {}). See the stack trace for more information.\n\nThe above exception was the direct 
cause of the following exception:\n\nTraceback (most recent call last):\n  File 
\"/app/app/services/training_service.py\", line 304, in run_training_job_sync\n    _train_temporal_cnn(\n  File 
\"/usr/local/lib/python3.11/site-packages/violawake_sdk/tools/train.py\", line 1572, in _train_temporal_cnn\n    
export_temporal_onnx(model, str(output_path), seq_len=seq_len, embedding_dim=EMBEDDING_DIM)\n  File 
\"/usr/local/lib/python3.11/site-packages/violawake_sdk/training/temporal_model.py\", line 271, in 
export_temporal_onnx\n    torch.onnx.export(\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/__init__.py\", line 291, in export\n    return 
_compat.export_compat(\n           ^^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_compat.py\", line 161, in export_compat\n    
onnx_program = _core.export(\n                   ^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_flags.py\", line 27, in wrapper\n    return 
func(*args, **kwargs)\n           ^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1551, in export\n    raise 
_errors.ConversionError(\ntorch.onnx._internal.exporter._errors.ConversionError: Failed to convert the exported 
program to an ONNX model. \u001b[96mThis is step 3/3\u001b[0m of exporting the model to ONNX. Next steps:\n- If there 
is a missing ONNX function, implement it and register it to the registry.\n- If there is an internal error during ONNX 
conversion, debug the error and submit a PR to PyTorch.\n- Create an error report with `torch.onnx.export(..., 
report=True)`, and save the ExportedProgram as a pt2 file. Create an issue in the PyTorch GitHub repository against 
the \u001b[96m*onnx*\u001b[0m component. Attach the error report and the pt2 model.\n\n## Exception summary\n\n<class 
'torch.onnx._internal.exporter._errors.DispatchError'>: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\u2b06\ufe0f\n<class 'torch.onnx._internal.exporter._errors.ConversionError'>: Error when 
translating node %adaptive_max_pool2d : [num_users=1] = 
call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = (%unsqueeze, [1, 1]), kwargs = {}). See the 
stack trace for more information.\n\n(Refer to the full stack trace above for more information.)"}
> {"timestamp": "2026-05-07T15:14:50.055445+00:00", "level": "ERROR", "logger": "violawake.jobs", "message": "Training 
job failed", "request_id": "-", "source": "job_queue", "error_kind": "unexpected", "error_reason": "bug", 
"error_type": "ConversionError", "error_message": "Failed to convert the exported program to an ONNX model. 
\u001b[96mThis is step 3/3\u001b[0m of exporting the model to ONNX. Next steps:\n- If there is a missing ONNX 
function, implement it and register it to the registry.\n- If there is an internal error during ONNX conversion, debug 
the error and submit a PR to PyTorch.\n- Create an error report with `torch.onnx.export(..., report=True)`, and save 
the ExportedProgram as a pt2 file. Create an issue in the PyTorch GitHub repository against the 
\u001b[96m*onnx*\u001b[0m component. Attach the error report and the pt2 model.\n\n## Exception summary\n\n<class 
'torch.onnx._internal.exporter._errors.DispatchError'>: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\u2b06\ufe0f\n<class 'torch.onnx._internal.exporter._errors.ConversionError'>: Error when 
translating node %adaptive_max_pool2d : [num_users=1] = 
call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = (%unsqueeze, [1, 1]), kwargs = {}). See the 
stack trace for more information.\n\n(Refer to the full stack trace above for more information.)", "job_id": 49, 
"exception": "Traceback (most recent call last):\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 816, in _translate_fx_graph\n 
   _handle_call_function_node_with_lowering(\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 598, in 
_handle_call_function_node_with_lowering\n    raise 
_errors.DispatchError(\ntorch.onnx._internal.exporter._errors.DispatchError: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent 
call last):\n  File \"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1509, in 
export\n    onnx_program = _exported_program_to_onnx_program(\n                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n 
 File \"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1123, in 
_exported_program_to_onnx_program\n    values = _translate_fx_graph(\n             ^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 842, in _translate_fx_graph\n 
   raise _errors.ConversionError(\ntorch.onnx._internal.exporter._errors.ConversionError: Error when translating node 
%adaptive_max_pool2d : [num_users=1] = call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = 
(%unsqueeze, [1, 1]), kwargs = {}). See the stack trace for more information.\n\nThe above exception was the direct 
cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/app/app/job_queue.py\", line 719, 
in _execute_job\n    artifact = await asyncio.to_thread(\n               ^^^^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/asyncio/threads.py\", line 25, in to_thread\n    return await loop.run_in_executor(None, 
func_call)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/concurrent/futures/thread.py\", line 58, in run\n    result = self.fn(*self.args, 
**self.kwargs)\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/app/app/services/training_service.py\", 
line 304, in run_training_job_sync\n    _train_temporal_cnn(\n  File 
\"/usr/local/lib/python3.11/site-packages/violawake_sdk/tools/train.py\", line 1572, in _train_temporal_cnn\n    
export_temporal_onnx(model, str(output_path), seq_len=seq_len, embedding_dim=EMBEDDING_DIM)\n  File 
\"/usr/local/lib/python3.11/site-packages/violawake_sdk/training/temporal_model.py\", line 271, in 
export_temporal_onnx\n    torch.onnx.export(\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/__init__.py\", line 291, in export\n    return 
_compat.export_compat(\n           ^^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_compat.py\", line 161, in export_compat\n    
onnx_program = _core.export(\n                   ^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_flags.py\", line 27, in wrapper\n    return 
func(*args, **kwargs)\n           ^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1551, in export\n    raise 
_errors.ConversionError(\ntorch.onnx._internal.exporter._errors.ConversionError: Failed to convert the exported 
program to an ONNX model. \u001b[96mThis is step 3/3\u001b[0m of exporting the model to ONNX. Next steps:\n- If there 
is a missing ONNX function, implement it and register it to the registry.\n- If there is an internal error during ONNX 
conversion, debug the error and submit a PR to PyTorch.\n- Create an error report with `torch.onnx.export(..., 
report=True)`, and save the ExportedProgram as a pt2 file. Create an issue in the PyTorch GitHub repository against 
the \u001b[96m*onnx*\u001b[0m component. Attach the error report and the pt2 model.\n\n## Exception summary\n\n<class 
'torch.onnx._internal.exporter._errors.DispatchError'>: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\u2b06\ufe0f\n<class 'torch.onnx._internal.exporter._errors.ConversionError'>: Error when 
translating node %adaptive_max_pool2d : [num_users=1] = 
call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = (%unsqueeze, [1, 1]), kwargs = {}). See the 
stack trace for more information.\n\n(Refer to the full stack trace above for more information.)"}



 exited 1 in 15248ms:

> {"timestamp": "2026-05-07T14:20:00.046239+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.39s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:01.643518+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.54s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:01.817213+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.29s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:05.989980+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.62s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:20:06.090101+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "56e00cc8d99241cd9a1ece58778bb3e1", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.269}
> {"timestamp": "2026-05-07T14:20:07.124590+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.18s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:08.377604+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.43s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:08.483448+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.67s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:10.069129+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.02s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:10.559964+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.23s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:20:10.701580+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "d4a30dca015a4a34af32f49ef1cd09db", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.64}
> {"timestamp": "2026-05-07T14:20:11.997095+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.53s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:13.544927+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.11s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:14.633052+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:14.894739+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.01s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:20:15.325290+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "7bcd16ecdb394d52a5d711698f86d270", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.616}
> {"timestamp": "2026-05-07T14:20:15.960860+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.92s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:17.327921+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.14s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:18.539626+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.38s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:18.689852+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.04s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:20:19.934175+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a04088e912ca472ca2562b080b6fb0fe", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.895}
> {"timestamp": "2026-05-07T14:20:20.251710+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:21.857363+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:22.964798+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.01s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:23.812660+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.47s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:20:24.589873+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "1582164001294987bcfd09b611d37451", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.438}
> {"timestamp": "2026-05-07T14:20:25.529944+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.61s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:25.893214+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:27.204191+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.71s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:27.551634+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.93s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:28.717059+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.64s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:20:29.212604+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "e6060c6c568a4cf498478fc0f21f6252", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.242}
> {"timestamp": "2026-05-07T14:20:30.255677+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.24s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:31.717539+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.90s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:31.909933+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.01s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:33.121827+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.23s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:20:33.881346+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "2d020655a9514994864bfd1b2e56919f", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.054}
> {"timestamp": "2026-05-07T14:20:34.097289+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.76s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:37.749808+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.67s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:38.877232+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:40.304113+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.52s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:40.601561+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.11s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:20:41.202543+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6694737069fe4ad8967fb9c63cdd10a2", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.509}
> {"timestamp": "2026-05-07T14:20:41.927690+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.83s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:43.175447+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.78s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:44.169303+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.61s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:44.543568+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:45.528744+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.71s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:20:45.818935+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "fb425bf744f3478491be261f21d2cbc9", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.653}
> {"timestamp": "2026-05-07T14:20:46.267181+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.34s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:47.814096+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.98s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:48.631162+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.81s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:49.727999+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.56s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:20:50.423835+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "0f39b408d8404e9190567cf75985f491", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.774}
> {"timestamp": "2026-05-07T14:20:50.948116+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:51.800360+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:52.426998+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.85s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:53.235939+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.11s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:20:55.013503+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "1dd7a4e041e04664a368c69556eab211", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.377}
> {"timestamp": "2026-05-07T14:20:55.071995+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.90s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:56.191456+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.52s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:56.479386+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.12s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:57.807455+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.18s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:20:59.428714+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.77s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:20:59.679246+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "9ac6dd66605548dd878a69cc1509b2c1", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.271}
> {"timestamp": "2026-05-07T14:21:00.408199+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.11s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:00.852972+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.31s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:02.423728+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.63s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:02.894566+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.31s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:21:04.327177+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "1ec78b52deff42aeab10e7494396fc1b", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.592}
> {"timestamp": "2026-05-07T14:21:04.424959+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.59s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:05.828586+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.37s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:10.076650+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.52s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:10.300492+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.79s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:11.330901+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.17s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:21:11.624014+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "054f861c12504ab6a330bdb7cb82594f", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.954}
> {"timestamp": "2026-05-07T14:21:12.019774+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.93s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:13.145754+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.76s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:14.429511+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.92s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:15.577795+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.13s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:21:16.334819+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "349286b0266e4ee3873a5055e19b57a2", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.032}
> {"timestamp": "2026-05-07T14:21:16.407059+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:17.499546+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.74s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:19.197900+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:20.073078+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.92s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:20.206118+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.72s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:21:20.887382+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "4a1a512433db44e68383179ccd74aee0", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.17}
> {"timestamp": "2026-05-07T14:21:21.239051+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.55s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:22.403974+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.47s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:24.120371+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.68s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:24.436411+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.04s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:21:25.489943+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "48e3c176189a4480ac351361016c402a", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.696}
> {"timestamp": "2026-05-07T14:21:25.704435+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:27.097148+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.30s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:28.461683+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.16s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:28.592756+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.72s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:29.826712+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.52s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:21:30.115071+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "0163dbf7cc454fcab0618c3276ef1f97", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.229}
> {"timestamp": "2026-05-07T14:21:31.124849+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:32.556392+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.07s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:32.855391+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:34.011341+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.99s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:21:34.776847+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "5310a632984646eda5068fc154137a83", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.308}
> {"timestamp": "2026-05-07T14:21:36.230318+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:36.806097+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:37.359091+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.01s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:37.901051+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.00s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:21:39.461927+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "72e5d584e6704127b084da89765842c6", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.509}
> {"timestamp": "2026-05-07T14:21:42.494710+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.14s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:43.877299+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.66s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:44.487520+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.79s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:45.543079+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.88s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:21:46.835646+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "32760dc8db034252ac448648d2482f23", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.647}
> {"timestamp": "2026-05-07T14:21:46.962644+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.10s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:47.901534+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.42s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:48.516945+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.19s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:50.530270+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.59s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:21:51.547732+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "948882e734da4ea89060ae915d349e8e", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.371}
> {"timestamp": "2026-05-07T14:21:51.668204+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.27s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:53.171175+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.05s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:53.181290+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.92s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:54.328446+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.14s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:21:56.087461+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "235c9190428c41379afcf6d01d88de32", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.395}
> {"timestamp": "2026-05-07T14:21:56.709021+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.01s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:57.293880+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.44s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:57.937629+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.94s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:21:58.958304+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.73s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:00.336472+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.03s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:22:00.692186+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "efd74ead9138425aa3e8eb16474dc45c", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 5.406}
> {"timestamp": "2026-05-07T14:22:01.670547+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.81s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:02.194643+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:03.547519+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.12s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:04.623201+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.10s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:22:05.233726+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "e56de39fa482417f85069f669e38ab30", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.543}
> {"timestamp": "2026-05-07T14:22:05.965205+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.92s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:06.168314+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.78s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:07.188773+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:09.220837+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.95s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:22:09.928534+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "05f27e0780724b56803c204563d6c474", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.166}
> {"timestamp": "2026-05-07T14:22:10.386349+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.73s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:11.691571+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.27s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:15.894864+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.10s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:16.657854+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.33s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:22:17.318933+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "25c296d855aa48b4a5a72ba0a8d9ed7c", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.376}
> {"timestamp": "2026-05-07T14:22:18.222177+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:18.773460+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:20.122978+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:20.476450+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.31s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:22:21.951737+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "9d660adeddd24a88a012d89b39d6dc2d", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.493}
> {"timestamp": "2026-05-07T14:22:22.038103+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.60s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:23.842863+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.11s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:24.868202+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:25.262527+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.83s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:26.289974+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.94s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:22:26.555126+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "17c19e6b31e1430e8470c9a7234bbaf2", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.898}
> {"timestamp": "2026-05-07T14:22:27.500195+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.29s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:28.944523+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.98s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:28.998186+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.84s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:30.157629+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.59s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:32.715410+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.26s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:33.395312+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.81s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:34.200398+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.59s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:34.468786+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:36.750417+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.90s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:37.166500+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:37.884032+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.62s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:38.536411+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:41.134009+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.34s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:42.327759+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.96s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:42.896367+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.98s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:43.515742+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.66s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:48.538882+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.90s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:48.821073+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.17s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:49.736426+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.60s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:50.234788+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.55s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:52.735554+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.07s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:53.221938+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.25s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:54.291916+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.79s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:54.757285+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.86s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:56.857141+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.16s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:57.102657+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:58.221161+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.61s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:22:58.503791+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.00s", "request_id": "-"}
  [entrypoint] running alembic upgrade head
  [entrypoint] ensuring openwakeword backbone models are downloaded
> {"timestamp": "2026-05-07T14:23:01.678529+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.96s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:23:02.879676+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.83s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:23:06.814525+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.96s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:23:08.102868+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.07s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:23:11.768043+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.19s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:23:13.214056+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.53s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:23:15.363541+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.03s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:23:16.731558+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.69s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:23:22.528058+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.35s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:23:24.126681+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.78s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:23:26.717765+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.95s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:23:28.035172+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.82s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:23:31.469473+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.19s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:23:32.896095+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.73s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:23:35.098787+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:23:36.488283+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.56s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:23:39.497302+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.85s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:23:40.805311+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.70s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:23:43.227557+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.41s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:23:44.846165+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.57s", "request_id": "-"}
  INFO:     Shutting down
  {"timestamp": "2026-05-07T14:24:18.567342+00:00", "level": "INFO", "logger": "violawake.retention", "message": 
"Model retention cleanup complete: deleted 0 model(s)", "request_id": "-"}
> {"timestamp": "2026-05-07T14:24:32.036049+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola_e2e_1778162842': 
NoAudioReceived: No audio was received. Please verify that your parameters are correct.; retrying in 1.18s", 
"request_id": "-"}
> {"timestamp": "2026-05-07T14:24:33.409263+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola_e2e_1778162842': 
NoAudioReceived: No audio was received. Please verify that your parameters are correct.; retrying in 2.23s", 
"request_id": "-"}
> {"timestamp": "2026-05-07T14:24:35.871598+00:00", "level": "ERROR", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis failed for voice en-US-DavisNeural text 'viola_e2e_1778162842': edge-tts failed after 3 
attempts: NoAudioReceived: No audio was received. Please verify that your parameters are correct.", "request_id": "-"}
  {"timestamp": "2026-05-07T14:24:35.871723+00:00", "level": "INFO", "logger": "violawake_sdk.tts", "message": 
"TTSEngine created: voice=af_heart, speed=1.0", "request_id": "-"}
  {"timestamp": "2026-05-07T14:24:35.874674+00:00", "level": "INFO", "logger": "violawake.training", "message": 
"Generated 27 TTS positives for job 48 (total: 49)", "request_id": "-"}
> {"timestamp": "2026-05-07T14:24:37.226753+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.76s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:24:38.240980+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.97s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:24:40.142813+00:00", "level": "INFO", "logger": "violawake.console", "message": 
"Handled request exception", "request_id": "0752759145d645f59066587b4d66ec70", "source": "request", "error_kind": 
"expected", "error_reason": "user_input", "error_type": "HTTPException", "error_message": "401: Not authenticated", 
"method": "GET", "path": "/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 401}
  {"timestamp": "2026-05-07T14:24:40.143065+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "0752759145d645f59066587b4d66ec70", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 401, "duration_ms": 1.152}
> {"timestamp": "2026-05-07T14:24:40.772155+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.45s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:24:42.448469+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.94s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:24:45.596185+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.32s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:24:47.124367+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.05s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:24:49.636428+00:00", "level": "INFO", "logger": "violawake.console", "message": 
"Handled request exception", "request_id": "e71b9d278c514d788a2bb866e80267c4", "source": "request", "error_kind": 
"expected", "error_reason": "user_input", "error_type": "HTTPException", "error_message": "401: Not authenticated", 
"method": "GET", "path": "/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 401}
  {"timestamp": "2026-05-07T14:24:49.636704+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "e71b9d278c514d788a2bb866e80267c4", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 401, "duration_ms": 0.614}
> {"timestamp": "2026-05-07T14:24:49.997695+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.03s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:24:51.318204+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.14s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:24:55.039417+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:24:57.338268+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.51s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:01.094205+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.84s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:02.131309+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.18s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:25:02.434436+00:00", "level": "INFO", "logger": "violawake.console", "message": 
"Handled request exception", "request_id": "f614d7637c0b42efb78dd1a11410e5f5", "source": "request", "error_kind": 
"expected", "error_reason": "user_input", "error_type": "HTTPException", "error_message": "401: Not authenticated", 
"method": "GET", "path": "/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 401}
  {"timestamp": "2026-05-07T14:25:02.434762+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "f614d7637c0b42efb78dd1a11410e5f5", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 401, "duration_ms": 1.528}
> {"timestamp": "2026-05-07T14:25:05.684050+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.38s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:07.256969+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.10s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:10.308191+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.30s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:11.882298+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.79s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:25:12.265640+00:00", "level": "INFO", "logger": "violawake.console", "message": 
"Handled request exception", "request_id": "d58fdb57d8c643c58bb0050de8bd578c", "source": "request", "error_kind": 
"expected", "error_reason": "user_input", "error_type": "HTTPException", "error_message": "401: Not authenticated", 
"method": "GET", "path": "/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 401}
  {"timestamp": "2026-05-07T14:25:12.265906+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "d58fdb57d8c643c58bb0050de8bd578c", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 401, "duration_ms": 0.531}
> {"timestamp": "2026-05-07T14:25:15.340196+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.83s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:16.376468+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.81s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:18.644363+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.07s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:19.933720+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.69s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:25:21.933075+00:00", "level": "INFO", "logger": "violawake.console", "message": 
"Handled request exception", "request_id": "4161659a56a44752b28b058bef529cd1", "source": "request", "error_kind": 
"expected", "error_reason": "user_input", "error_type": "HTTPException", "error_message": "401: Not authenticated", 
"method": "GET", "path": "/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 401}
  {"timestamp": "2026-05-07T14:25:21.933448+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "4161659a56a44752b28b058bef529cd1", "method": "GET", "path": 
"/api/training/status/48", "route": "/api/training/status/{job_id}", "status_code": 401, "duration_ms": 0.807}
> {"timestamp": "2026-05-07T14:25:23.028355+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.02s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:24.284081+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:27.223159+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.96s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:28.392965+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:34.419468+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.80s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:35.463182+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.90s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:37.830835+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.14s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:38.416446+00:00", "level": "ERROR", "logger": "violawake.email", "message": "Failed 
to send email to e2e-53efbc46e3@violawake-test.example.com for subject Verify your ViolaWake email", "request_id": 
"16cbc5d782d740138d4f34ebbefdf4c9", "exception": "Traceback (most recent call last):\n  File 
\"/app/app/email_service.py\", line 191, in _send_email\n    await asyncio.to_thread(resend.Emails.send, params)\n  
File \"/usr/local/lib/python3.11/asyncio/threads.py\", line 25, in to_thread\n    return await 
loop.run_in_executor(None, func_call)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/concurrent/futures/thread.py\", line 58, in run\n    result = self.fn(*self.args, 
**self.kwargs)\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/resend/emails/_emails.py\", line 286, in send\n    
).perform_with_content()\n      ^^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/resend/request.py\", line 49, in perform_with_content\n    resp = 
self.perform()\n           ^^^^^^^^^^^^^^\n  File \"/usr/local/lib/python3.11/site-packages/resend/request.py\", line 
37, in perform\n    raise_for_code_and_type(\n  File \"/usr/local/lib/python3.11/site-packages/resend/exceptions.py\", 
line 270, in raise_for_code_and_type\n    raise ResendError(\nresend.exceptions.ResendError: The violawake.com domain 
is not verified. Please, add and verify your domain on https://resend.com/domains"}
> {"timestamp": "2026-05-07T14:25:38.417616+00:00", "level": "WARNING", "logger": "violawake.auth", "message": 
"Verification email failed \u2014 auto-verifying e2e-53efbc46e3@violawake-test.example.com", "request_id": 
"16cbc5d782d740138d4f34ebbefdf4c9"}
  {"timestamp": "2026-05-07T14:25:38.420433+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "16cbc5d782d740138d4f34ebbefdf4c9", "method": "POST", "path": "/api/auth/register", 
"route": "/api/auth/register", "status_code": 201, "duration_ms": 617.901}
  {"timestamp": "2026-05-07T14:25:39.171824+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "de694a75e4c3463ca928a971e73f70e4", "method": "POST", "path": 
"/api/recordings/upload", "route": "/api/recordings/upload", "status_code": 200, "duration_ms": 41.378}
> {"timestamp": "2026-05-07T14:25:39.247333+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.80s", "request_id": "-"}
  {"timestamp": "2026-05-07T14:25:39.252164+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "4d966da67af74dbeadf4ce3a961d8e45", "method": "POST", "path": 
"/api/recordings/upload", "route": "/api/recordings/upload", "status_code": 200, "duration_ms": 18.939}
  {"timestamp": "2026-05-07T14:25:40.140501+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "14a98ad091834ef387fea73a6449c7bb", "method": "GET", "path": "/api/recordings", 
"route": "/api/recordings", "status_code": 200, "duration_ms": 7.268}
> {"timestamp": "2026-05-07T14:25:40.229591+00:00", "level": "INFO", "logger": "violawake.jobs", "message": "Queued 
training job 49 for user 36 (priority=0)", "request_id": "359fbf7f17b34c60bc4d13266edd7426"}
  {"timestamp": "2026-05-07T14:25:40.243676+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "359fbf7f17b34c60bc4d13266edd7426", "method": "POST", "path": "/api/training/start", 
"route": "/api/training/start", "status_code": 202, "duration_ms": 69.691}
> {"timestamp": "2026-05-07T14:25:40.281611+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "cf1d7b892f5a4a4da684a5b205bcb671", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.965}
> {"timestamp": "2026-05-07T14:25:42.440901+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.16s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:43.860723+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.65s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:44.906989+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6cba8543213344bc8df52bab8a9afda7", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.051}
> {"timestamp": "2026-05-07T14:25:46.235562+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.11s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:47.587223+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.69s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:49.520616+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "64044f9df2514ae684bbbde51ddab515", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 5.521}
> {"timestamp": "2026-05-07T14:25:50.866692+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola_e2e_1778163936': 
NoAudioReceived: No audio was received. Please verify that your parameters are correct.; retrying in 1.20s", 
"request_id": "-"}
> {"timestamp": "2026-05-07T14:25:50.915881+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.96s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:52.082023+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.10s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:52.287554+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola_e2e_1778163936': 
NoAudioReceived: No audio was received. Please verify that your parameters are correct.; retrying in 1.61s", 
"request_id": "-"}
  {"timestamp": "2026-05-07T14:25:54.120582+00:00", "level": "INFO", "logger": "violawake_sdk.tts", "message": 
"TTSEngine created: voice=af_heart, speed=1.0", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:54.123711+00:00", "level": "INFO", "logger": "violawake.training", "message": 
"Generated 27 TTS positives for job 49 (total: 49)", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:54.153852+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "7c38b8b991d24d2da331e95e75c13e60", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 17.755}
> {"timestamp": "2026-05-07T14:25:54.631772+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.38s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:55.458312+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.81s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:56.235152+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.89s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:56.521302+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.71s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:58.695117+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.76s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:58.822096+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "fde3f357ac41491cb23b6056027ec356", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.57}
> {"timestamp": "2026-05-07T14:25:59.305791+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.06s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:25:59.697322+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:00.601944+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:05.264819+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.28s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:05.856468+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.00s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:06.117557+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "20c6625aad3440ae9ea936c1b17f808c", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.593}
> {"timestamp": "2026-05-07T14:26:06.832177+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:07.308930+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.82s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:10.246219+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.32s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:10.532013+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.32s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:10.802499+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "127740a3a4814f658d63240fd331c421", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.197}
> {"timestamp": "2026-05-07T14:26:11.789266+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.06s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:12.042872+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:14.625513+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.35s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:15.338301+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.84s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:15.468558+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "2106b20422644eabae96c0005213436d", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.337}
> {"timestamp": "2026-05-07T14:26:16.289596+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.86s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:16.478936+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.98s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:18.898910+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.93s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:19.383766+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.49s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:20.010913+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "5f6d3f9ca7b7487a8ebe0eba0520c876", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.056}
> {"timestamp": "2026-05-07T14:26:20.041337+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:21.118439+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.24s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:23.098865+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.42s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:24.316421+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.31s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:24.642821+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "fd2683fb18eb4e16a1dca7528c5686a9", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.808}
> {"timestamp": "2026-05-07T14:26:24.885915+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.03s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:25.850759+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:27.691121+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.86s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:28.804555+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.94s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:29.444209+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "dee73b4729f34e14b6bc94925039af45", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.199}
> {"timestamp": "2026-05-07T14:26:30.036470+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.27s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:31.546738+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.54s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:32.328866+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.35s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:33.569819+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.49s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:33.905801+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.74s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:36.829737+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "71b8206e29184b55bdc2dd270e21f8e9", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.575}
> {"timestamp": "2026-05-07T14:26:37.946108+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.74s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:38.779691+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:40.501490+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.14s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:41.081284+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:41.485929+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "80cab17a0e304c0d91507e81dfb7d89f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.184}
> {"timestamp": "2026-05-07T14:26:42.456145+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.89s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:43.862326+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.76s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:44.909597+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.84s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:45.285047+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.34s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:46.083144+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "8084f594d08642a899871426dd8e88c4", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.868}
> {"timestamp": "2026-05-07T14:26:46.859632+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:47.580753+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.06s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:48.855507+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.60s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:50.234681+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.49s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:50.699953+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "f6852ca9af8d41468da32cc4930a82f5", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.226}
> {"timestamp": "2026-05-07T14:26:51.884291+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.24s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:51.955682+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.53s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:53.371046+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.82s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:53.914171+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.31s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:55.326990+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "5f7ea8dcc9b34d9d84c40c7c108dc283", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.089}
> {"timestamp": "2026-05-07T14:26:55.456006+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.65s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:55.604340+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.10s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:56.895813+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.73s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:58.358704+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.39s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:59.822208+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.45s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:59.946767+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.02s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:26:59.970875+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b62b6164ea4d4622a33fb3f77d9a486b", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.751}
> {"timestamp": "2026-05-07T14:27:01.496293+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.56s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:02.970352+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.92s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:04.005467+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.50s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:04.128479+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.87s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:04.621424+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "756dd602f9544b24a2a020adad38f03c", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.826}
> {"timestamp": "2026-05-07T14:27:05.736619+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:10.264739+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.05s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:11.561876+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.11s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:11.931507+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b0d7a3d33c1b490d8880a51ac7086435", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.042}
> {"timestamp": "2026-05-07T14:27:12.029163+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:13.496442+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:16.202554+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:16.601631+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "12acdf3fefc34a3496c71bd06f46f9a8", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.721}
> {"timestamp": "2026-05-07T14:27:17.338256+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.16s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:20.735970+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.31s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:21.237492+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "468e2b1408924dc596b92df5d37e9949", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.774}
> {"timestamp": "2026-05-07T14:27:22.243129+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.83s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:24.947621+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.04s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:25.541405+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.16s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:25.816506+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "8e68bf297aaa44aabccd95f611668554", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.374}
> {"timestamp": "2026-05-07T14:27:26.251577+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.95s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:26.928894+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.66s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:29.637007+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.39s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:29.711978+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.27s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:30.423372+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "04005bd96b4a4f37b45eb7426d734ded", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.805}
> {"timestamp": "2026-05-07T14:27:31.179348+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.69s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:31.243516+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.82s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:33.564099+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:34.673492+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.09s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:35.086059+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a70a3d4124744a23a81d2dd7b714feae", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.365}
> {"timestamp": "2026-05-07T14:27:35.297003+00:00", "level": "ERROR", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis failed for voice en-US-BrandonNeural text 'viola e he': edge-tts failed after 3 
attempts: WSServerHandshakeError: 503, message='Invalid response status', url='wss://speech.platform.bing.com/consumer/
speech/synthesize/readaloud/edge/v1?TrustedClientToken=6A5AA1D4EAFF4E9FB37E23D68491D6F4&ConnectionId=e2196ede7ced46cd89
4c091196432a96&Sec-MS-GEC=4F5CCAE953F4EC4E9A9E34A5EB5EA3647687FC10376FC8E9D65801CC2ADDB7BC&Sec-MS-GEC-Version=1-143.0.3
650.75'", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:35.913117+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:37.239678+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:37.948359+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.23s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:40.459352+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.14s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:42.388612+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "61a04def670e4d49a74f5692159b2eab", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.316}
> {"timestamp": "2026-05-07T14:27:43.803132+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.25s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:44.938724+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:45.285228+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.01s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:46.056345+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.66s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:47.060395+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "fb4e87aa6f434a88ba8d8087ff5f67f9", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.101}
> {"timestamp": "2026-05-07T14:27:47.739594+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.41s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:49.059163+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.11s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:49.364066+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.64s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:50.397676+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.89s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:51.667932+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "957925777b26488db351784a22ac3db4", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.96}
> {"timestamp": "2026-05-07T14:27:52.103543+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.42s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:52.640864+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.28s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:53.722698+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.14s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:54.123700+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.67s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:56.221649+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6099fbc7c36f46a3ac0e0ab525078cc6", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.256}
> {"timestamp": "2026-05-07T14:27:56.577529+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.25s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:57.111037+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.79s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:58.089529+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.23s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:27:58.166060+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.02s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:00.841422+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "18370eb11d1b4633b1d1da5ce94eb386", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.197}
> {"timestamp": "2026-05-07T14:28:01.145917+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.03s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:02.040962+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:02.364885+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.60s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:03.186016+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:05.470900+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "df6a5762d69d4c9ab72ecc1e4ef1b9fd", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.737}
> {"timestamp": "2026-05-07T14:28:05.629564+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.43s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:05.743108+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.24s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:07.200023+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.54s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:07.250581+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.03s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:09.747010+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.10s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:10.022006+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.37s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:10.192662+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "133b5eb0a9d44e718f2fd12534464740", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.998}
> {"timestamp": "2026-05-07T14:28:11.141794+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.03s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:11.637943+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:16.947190+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.17s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:17.111816+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.45s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:17.645790+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "94d5e0340c414c0e83150504fbcbfe3b", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.991}
> {"timestamp": "2026-05-07T14:28:18.391756+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.07s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:18.822988+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:21.273923+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.38s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:22.374557+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "7f9c6b6831f94073ad82bceb053f62a9", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.011}
> {"timestamp": "2026-05-07T14:28:22.630151+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.16s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:22.877729+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:24.018850+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:26.249072+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.09s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:26.570048+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.20s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:26.960328+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "29b18e389b6e444499f369b8c5a6d890", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.12}
> {"timestamp": "2026-05-07T14:28:27.531752+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.05s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:27.997117+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.83s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:30.301952+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.81s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:30.845979+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.89s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:31.349988+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.95s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:31.500525+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "54457c0807694c60b4e38f7829c6315f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.682}
> {"timestamp": "2026-05-07T14:28:31.972082+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.60s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:34.290555+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.31s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:34.678524+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.38s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:35.810413+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.83s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:36.037202+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "952b8155068a4847b52ef7d7d8ad7f66", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.063}
> {"timestamp": "2026-05-07T14:28:36.302175+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.23s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:39.215361+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.83s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:39.323361+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.80s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:40.224944+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:40.384974+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.56s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:40.647856+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "3903a10bd155487197b5f2fc3fa2c7d0", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.871}
> {"timestamp": "2026-05-07T14:28:42.589497+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.11s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:43.495858+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.42s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:43.957024+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.82s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:47.910275+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.10s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:48.115288+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "145865fca5eb47d29f75179904d5daf9", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.106}
> {"timestamp": "2026-05-07T14:28:49.948775+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.79s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:50.435641+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.79s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:51.007214+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.72s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:51.488812+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.71s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:52.745520+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "1ae89938be594eeab5d1ec0882ec472b", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.215}
> {"timestamp": "2026-05-07T14:28:53.646504+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.16s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:54.633510+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.49s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:55.234962+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.14s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:56.345245+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.19s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:57.288494+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6da70ecf58bf4c168ef4f467af261a67", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.157}
> {"timestamp": "2026-05-07T14:28:59.061507+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.30s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:28:59.293248+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:00.656317+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.07s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:00.732976+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:01.911004+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "df02e021db2e4da6a8da2b931fed21a8", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.656}
> {"timestamp": "2026-05-07T14:29:03.793856+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.84s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:04.711918+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.75s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:04.874845+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.10s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:05.699407+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.73s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:06.533989+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "1d005de5502648db947667f37fdbd2f2", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.986}
> {"timestamp": "2026-05-07T14:29:08.159376+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.34s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:08.205559+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:09.551279+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:09.708017+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.86s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:11.160502+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "9a09abc99ba24833a41a0534e4c5e3ce", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.899}
> {"timestamp": "2026-05-07T14:29:12.631342+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:12.739975+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.47s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:14.025618+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.89s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:14.447757+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.68s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:15.837650+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "86afdd14638044d58442083f2207653a", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.547}
> {"timestamp": "2026-05-07T14:29:17.043211+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:17.388288+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.96s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:20.863298+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.73s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:21.288833+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.04s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:23.306396+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "8779042ce0344a4a87909cc6e4d8f2ca", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.197}
> {"timestamp": "2026-05-07T14:29:23.788435+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.19s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:23.978612+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.09s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:25.183885+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.78s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:25.271827+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.16s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:27.899069+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.17s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:28.041785+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b71ec19fefc849e7a34eb31e4a113bd3", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.294}
> {"timestamp": "2026-05-07T14:29:28.058127+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.87s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:29.142877+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.51s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:29.300884+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.66s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:31.321719+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.02s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:31.942361+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.09s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:32.579068+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:32.700474+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "1455e702052e4196ad4932a2f646e247", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.558}
> {"timestamp": "2026-05-07T14:29:33.232507+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.24s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:36.059157+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.17s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:36.398776+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.47s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:37.285431+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "84121ae801cc454eade96e60813c40f5", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.081}
> {"timestamp": "2026-05-07T14:29:37.441873+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.62s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:38.129540+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.65s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:39.481167+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.85s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:40.521486+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.07s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:41.041211+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.92s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:41.918196+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "214a4ec9cbce4dab8b64d76a9bb024fd", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.947}
> {"timestamp": "2026-05-07T14:29:42.173602+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.14s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:43.650509+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.45s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:44.851591+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.99s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:45.326079+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.23s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:46.067699+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.06s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:46.593002+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "d987038eee844e778d3450f47d0ce023", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.009}
> {"timestamp": "2026-05-07T14:29:48.401883+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:49.268194+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.79s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:49.827947+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.86s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:52.770256+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:53.747302+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "3533556416a74ca080285a6f23ac8493", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.033}
> {"timestamp": "2026-05-07T14:29:55.691291+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.83s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:56.733439+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.80s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:29:58.397460+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "838a84dc4cdf4dfab5e12afe1c63a22e", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.352}
> {"timestamp": "2026-05-07T14:29:59.014811+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.25s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:00.029464+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.80s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:00.479943+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.99s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:01.049638+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.97s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:02.971158+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.84s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:03.060135+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6e8e5e1cc99d40ae9c7a299366914c9d", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.289}
> {"timestamp": "2026-05-07T14:30:03.414007+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.81s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:04.015634+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:04.456206+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.16s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:07.344535+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.42s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:07.664010+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.97s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:07.683473+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "3b591258b5bd45f9af3e470247ff3ebc", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.488}
> {"timestamp": "2026-05-07T14:30:08.937674+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:08.986923+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.03s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:11.742095+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.42s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:11.759033+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.81s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:12.280133+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ffb09b3b73004c68a82cb9aa6c6a6e5a", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 7.187}
> {"timestamp": "2026-05-07T14:30:12.767815+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.92s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:13.353301+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.86s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:16.229026+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:16.755115+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.01s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:16.915585+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "f3daac339c6a40a4aeaa8d893fc87179", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.036}
> {"timestamp": "2026-05-07T14:30:17.550945+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.14s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:17.962466+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:20.229510+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.47s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:20.592210+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.85s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:21.587172+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "0983b6063fad493ab932edb4e1297ed5", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.526}
> {"timestamp": "2026-05-07T14:30:21.624299+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.63s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:21.879571+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.62s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:26.950414+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.84s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:27.231334+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:28.000904+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.07s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:28.367478+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.79s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:28.881208+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "5bf61561c29448c8a72212745f80c1e7", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.275}
> {"timestamp": "2026-05-07T14:30:30.958806+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.92s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:32.091009+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:33.553777+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "712d5820278a47caad60430672eca1e2", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.82}
> {"timestamp": "2026-05-07T14:30:34.882240+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.17s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:36.267658+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.68s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:38.119985+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "adc395d45b5d4c46b5f0bc611b361727", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.177}
> {"timestamp": "2026-05-07T14:30:39.598809+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.16s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:42.246533+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.82s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:42.690848+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "599d9dc39d8b4293a1b90fa35e9d1806", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.329}
> {"timestamp": "2026-05-07T14:30:44.620784+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.93s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:45.614572+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.14s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:45.761159+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:47.007254+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.86s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:47.337743+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "33650cc4dfcb44a48f460dfad54acdb6", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 5.498}
> {"timestamp": "2026-05-07T14:30:48.824763+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.06s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:49.273234+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.16s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:50.106193+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.06s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:50.637196+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.19s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:51.994314+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "49539b0acb364c379f6c9096282c3487", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.321}
> {"timestamp": "2026-05-07T14:30:52.986661+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.98s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:53.913126+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.92s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:54.214122+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.95s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:55.070768+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.18s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:30:59.326213+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ac7115f7b82643b18f64a9f639282259", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.296}
> {"timestamp": "2026-05-07T14:31:00.203535+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.14s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:00.724270+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.29s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:01.579647+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:02.236177+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.20s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:03.981204+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "d4ee181e5aa34e099cc081cb4471e3f9", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.704}
> {"timestamp": "2026-05-07T14:31:04.173161+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.33s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:05.761590+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.25s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:05.858597+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.30s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:07.354709+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.16s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:08.615460+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "4cff519d242d49fba1ea6628fc8c7d42", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.805}
> {"timestamp": "2026-05-07T14:31:09.289965+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:09.924222+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.14s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:10.788832+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.58s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:11.258149+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.83s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:13.096366+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:13.193255+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a3550d4d3ff1410b9e8a14539228b007", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.829}
> {"timestamp": "2026-05-07T14:31:14.049460+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.69s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:14.154710+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:15.271389+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.17s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:17.331280+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.24s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:17.982511+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "e77df705c7414b68bb60cafb1542d17e", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 10.739}
> {"timestamp": "2026-05-07T14:31:18.309803+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.06s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:18.778654+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.19s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:19.570567+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.06s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:21.481491+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.03s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:22.643340+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "0eead31e69ff45c6a52df0ab7e1fc3d6", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.844}
> {"timestamp": "2026-05-07T14:31:22.787631+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.01s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:23.092886+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:24.531450+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.70s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:25.912209+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.05s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:26.684307+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:27.211104+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.16s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:27.297489+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "f6fbfec5c66144718a9d21541fa530d0", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.164}
> {"timestamp": "2026-05-07T14:31:30.727236+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:32.912920+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:33.638363+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.09s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:34.281299+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.16s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:34.572316+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "483992c23b3349f2b19d71156aa59dc0", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.993}
> {"timestamp": "2026-05-07T14:31:34.919499+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.53s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:37.222434+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.30s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:37.914980+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.82s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:38.726869+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.94s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:39.198264+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.65s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:39.240848+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "c0e2b15cbd274df3b090388d154825de", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.93}
> {"timestamp": "2026-05-07T14:31:41.285209+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.34s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:42.337722+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.33s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:42.850140+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:43.905316+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.72s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:43.914601+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "fd3df044821b4849a868396e82e3c0d0", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.129}
> {"timestamp": "2026-05-07T14:31:45.759282+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.82s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:46.050495+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.46s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:46.810979+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.68s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:47.762049+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.96s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:48.452072+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "2efafbdf5b3d464f8757a3a6c9310ba1", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 6.785}
> {"timestamp": "2026-05-07T14:31:49.203127+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:50.261334+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.18s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:50.793587+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.47s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:52.471426+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.54s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:53.080187+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ac92c648f2244a31b249b2eb5af986a3", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.613}
> {"timestamp": "2026-05-07T14:31:53.766951+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.19s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:54.745948+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.37s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:55.159670+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:56.334079+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.24s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:57.380291+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.34s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:31:57.762549+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "79b173a6e991426bba54f33ccbd16f87", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.38}
> {"timestamp": "2026-05-07T14:31:58.898941+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.64s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:00.062000+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.80s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:03.715468+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:04.380981+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.35s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:05.075346+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "3e232c1550da43dea087f2e696bbb284", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.203}
> {"timestamp": "2026-05-07T14:32:05.949292+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.94s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:06.368744+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:07.770903+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.55s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:08.624419+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.23s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:09.976348+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "762211425d2949d79e95521f38bb911c", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.832}
> {"timestamp": "2026-05-07T14:32:10.078286+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.61s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:10.375233+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.78s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:11.343341+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.75s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:13.331293+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.83s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:13.873859+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.26s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:14.353348+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.18s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:14.548232+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ffed88d74d3141cbb53156850db0fc79", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 7.65}
> {"timestamp": "2026-05-07T14:32:15.453432+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:17.019246+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.89s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:18.139035+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:18.826294+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.28s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:19.114323+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "3bacf2b0f1b643f28f56477b138e45ec", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.653}
> {"timestamp": "2026-05-07T14:32:20.388482+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.92s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:21.798724+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.80s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:22.727188+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.23s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:22.809274+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.54s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:23.737058+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "e4101af877d74c7fb13fa9f38e0ac67b", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.233}
> {"timestamp": "2026-05-07T14:32:24.400399+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:25.476637+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.17s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:26.949701+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:27.929606+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.14s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:28.382908+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "c16ea6d6ef114da98969e2f96c3a99d1", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.229}
> {"timestamp": "2026-05-07T14:32:29.283436+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.92s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:30.342213+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.39s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:31.992371+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.90s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:32.040744+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.25s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:33.065110+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "7151277190e9455f990adb07f98c167e", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.645}
> {"timestamp": "2026-05-07T14:32:36.193271+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.24s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:37.110758+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.28s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:38.647625+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.51s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:39.899393+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.24s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:40.426506+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "cdf13206429042378e16133e88e126bb", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.48}
> {"timestamp": "2026-05-07T14:32:41.267928+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.48s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:41.374039+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.94s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:42.977417+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.62s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:44.059120+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.40s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:45.172529+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "92b34842c93a46d8a74d53b6ccbc920f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.05}
> {"timestamp": "2026-05-07T14:32:45.478383+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.49s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:45.682898+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.00s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:47.538046+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.94s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:49.030835+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.36s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:49.716822+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "369d19f6f7ea411ca1dfef514498be8a", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.178}
> {"timestamp": "2026-05-07T14:32:50.805171+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.18s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:51.327078+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.81s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:52.388008+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:53.827136+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.83s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:54.251695+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b7cd038e009b4787979460f004b1bde5", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.831}
> {"timestamp": "2026-05-07T14:32:54.869590+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.93s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:54.958313+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.47s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:56.741506+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.63s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:58.298214+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.90s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:58.788641+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "1254f91aff414ebe967fafd83f4b5724", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.66}
> {"timestamp": "2026-05-07T14:32:59.406402+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.05s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:32:59.614722+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.93s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:00.925389+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:01.955820+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.11s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:03.291929+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.23s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:03.472685+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "e28a48256cf14de99426ba4dd8bdb3cd", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.188}
> {"timestamp": "2026-05-07T14:33:03.999370+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.16s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:05.399967+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:09.892754+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.27s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:10.883087+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "e0c3b1a10c9f4e4983a3bd7e47db5ff7", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.25}
> {"timestamp": "2026-05-07T14:33:11.387389+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.94s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:11.760468+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:13.110818+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.09s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:14.317901+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.76s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:15.338514+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.94s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:15.529962+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "32aa009b664748e2a24012c9cb0a0835", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.589}
> {"timestamp": "2026-05-07T14:33:15.957950+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.86s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:17.049873+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.80s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:19.200484+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.41s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:19.955763+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.78s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:20.155567+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ae9509a8da3f42c9b1074e0c1f1b699d", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.656}
> {"timestamp": "2026-05-07T14:33:20.823552+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.03s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:21.030707+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.53s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:23.535107+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.90s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:23.684200+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.89s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:24.706286+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "0fe79348ec18478ebd736fe4ec2416f3", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.881}
> {"timestamp": "2026-05-07T14:33:24.712521+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.94s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:24.790693+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.23s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:28.229848+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:28.446931+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.40s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:29.338995+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.16s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:29.363130+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "8d69236310e54254a26581825479c1af", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.928}
> {"timestamp": "2026-05-07T14:33:30.066959+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.94s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:31.947865+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.11s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:32.860687+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:33.513394+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.68s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:34.010791+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "2f0e2aefc3a04c8e9935bfd1b1c6c2ef", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.212}
> {"timestamp": "2026-05-07T14:33:34.203898+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.14s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:36.251194+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:37.477875+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:37.777557+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.20s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:41.356966+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "705883ae39f1426c947829379f7ba568", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 7.252}
> {"timestamp": "2026-05-07T14:33:42.022381+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.80s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:44.106400+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.02s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:44.533185+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.78s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:45.332868+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.09s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:45.520783+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.63s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:46.053940+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "c028a08897394f6786db93dd093fcc56", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.843}
> {"timestamp": "2026-05-07T14:33:48.163780+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.06s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:48.770973+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'vyaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.12s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:49.422884+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:50.125627+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'vyaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.90s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:50.672774+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b942dfea1e4a4b1993262794dbc53eaa", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.762}
> {"timestamp": "2026-05-07T14:33:52.393706+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:52.442971+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'vyaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:53.485496+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.81s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:53.782806+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'vyaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.69s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:55.269231+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "0c043caa6df44ea19dccc4f511906b1b", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.699}
> {"timestamp": "2026-05-07T14:33:56.737700+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'vyaiola e e': NoAudioReceived: 
No audio was received. Please verify that your parameters are correct.; retrying in 0.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:57.019210+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.89s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:57.928634+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'vyaiola e e': NoAudioReceived: 
No audio was received. Please verify that your parameters are correct.; retrying in 2.23s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:58.287045+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.71s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:33:59.805336+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "c3048b79a7534064bc2bf19d846dd77f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.422}
> {"timestamp": "2026-05-07T14:34:00.408885+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.18s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:00.844738+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'vyaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.78s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:01.816734+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.73s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:02.067534+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'vyaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.06s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:04.417325+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "9ce2414d2d9e4c408012926cb3f0c849", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.32}
> {"timestamp": "2026-05-07T14:34:04.586840+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.04s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:05.513658+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'vvaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.28s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:05.834955+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.61s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:06.988267+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'vvaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.55s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:08.123032+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.26s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:08.983908+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'vvaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:09.034135+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "9c084fe1f80845228c06a9cd959577b5", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.29}
> {"timestamp": "2026-05-07T14:34:09.586685+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.67s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:10.420135+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'vvaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:15.606282+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:16.212328+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'vvaiola e e': NoAudioReceived: 
No audio was received. Please verify that your parameters are correct.; retrying in 1.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:16.542209+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "355a5a3874a3400891953ce33f09206f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.684}
> {"timestamp": "2026-05-07T14:34:16.949995+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.00s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:17.504493+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'vvaiola e e': NoAudioReceived: 
No audio was received. Please verify that your parameters are correct.; retrying in 1.87s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:19.427599+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.30s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:20.249207+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'vvaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.11s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:21.040553+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.64s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:21.298302+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6a8e2b0f2f124e899c1864b237b819d0", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.827}
> {"timestamp": "2026-05-07T14:34:21.537203+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'vvaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.80s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:23.810819+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.31s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:24.865302+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.82s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:25.313953+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.72s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:25.846033+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "8f64ded80b1c4dc1b423054d52d490da", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.301}
> {"timestamp": "2026-05-07T14:34:25.917817+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:27.755599+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.31s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:28.400274+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.06s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:29.303516+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:29.663883+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.79s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:30.412529+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ae9f254397ca4b2ab468387bb50e17e6", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.508}
> {"timestamp": "2026-05-07T14:34:32.557998+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:32.605698+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.95s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:33.748455+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.19s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:33.953887+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.11s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:35.024513+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "096ae7e3414f424981ac32f43f3c4907", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.904}
> {"timestamp": "2026-05-07T14:34:36.479526+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.85s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:36.820483+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.75s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:37.582050+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.07s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:37.886984+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.70s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:39.673046+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "619debff066d459abefbdcc3918ff687", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 5.489}
> {"timestamp": "2026-05-07T14:34:40.721443+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:41.052424+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.31s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:41.796705+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.66s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:42.642093+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:46.875264+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.85s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:47.008955+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "9ee8673970084b9f895969370ebb8bc0", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 6.731}
> {"timestamp": "2026-05-07T14:34:47.855920+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.29s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:47.944705+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.89s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:49.379053+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.99s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:51.180955+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'vyaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:51.715792+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "4661936560b24574becbb3409da626ab", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.898}
> {"timestamp": "2026-05-07T14:34:52.129493+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'vyaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.78s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:52.487911+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:53.588644+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.55s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:54.481957+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'vyaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.49s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:55.862087+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.76s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:56.144307+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'vyaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.72s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:56.407087+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "d172f13178994492ba9a08b4105e07fa", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.804}
> {"timestamp": "2026-05-07T14:34:56.821476+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.96s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:34:58.994000+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'vyaiola e e': NoAudioReceived: 
No audio was received. Please verify that your parameters are correct.; retrying in 1.27s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:00.243996+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.83s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:00.456013+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'vyaiola e e': NoAudioReceived: 
No audio was received. Please verify that your parameters are correct.; retrying in 1.72s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:00.946906+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b42c9b8065064056bb5663762972b5e7", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.279}
> {"timestamp": "2026-05-07T14:35:01.299795+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.62s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:03.075907+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'vyaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.39s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:03.374791+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.94s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:04.541180+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.67s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:04.675828+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'vyaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.02s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:05.483940+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "0a8f7752eb534c88bb1eafe802e44741", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.429}
> {"timestamp": "2026-05-07T14:35:07.215436+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:08.027556+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'vvaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.18s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:08.324818+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.82s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:09.472284+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'vvaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.83s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:10.024270+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b1df05a9e97c41848c0e2bb5b8b2dde3", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.285}
> {"timestamp": "2026-05-07T14:35:10.876097+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.09s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:11.751308+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'vvaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.42s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:12.178487+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.71s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:13.402269+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'vvaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:14.716927+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a2fe0fc90d0b400f92fd8d3b0606d593", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.442}
> {"timestamp": "2026-05-07T14:35:15.319985+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:16.297043+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.50s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:19.465878+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'vvaiola e e': NoAudioReceived: 
No audio was received. Please verify that your parameters are correct.; retrying in 0.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:20.472059+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'vvaiola e e': NoAudioReceived: 
No audio was received. Please verify that your parameters are correct.; retrying in 2.01s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:21.102077+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.24s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:22.138148+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "bc547b9a9ae44662b6d2a8f9d04be880", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 8.181}
> {"timestamp": "2026-05-07T14:35:22.688935+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.82s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:23.380738+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'vvaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.92s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:24.601331+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'vvaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.75s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:25.587957+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.98s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:26.774735+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "f94a6cfa987148fab49037e70612d8b2", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.682}
> {"timestamp": "2026-05-07T14:35:26.797465+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:27.827495+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.93s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:28.987134+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.99s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:29.487409+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.40s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:31.121680+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.89s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:31.356868+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.81s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:31.390338+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "894d050d21c0407dae0e425c1f464037", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.471}
> {"timestamp": "2026-05-07T14:35:32.383631+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.09s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:34.444744+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:35.469051+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.23s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:35.724799+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.06s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:35.951398+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b3e82705ae2d4be8a0615def25ff9875", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 15.299}
> {"timestamp": "2026-05-07T14:35:37.214344+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:38.249869+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.11s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:39.580131+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.72s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:40.183323+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.20s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:40.605648+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "1c3c870edc824e89867b50c56529960c", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.119}
> {"timestamp": "2026-05-07T14:35:41.584070+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:42.358187+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.10s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:43.639077+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.83s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:45.247639+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a1bc6775da4c483282bfb3edb485f2be", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.961}
> {"timestamp": "2026-05-07T14:35:45.270739+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:46.242349+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:46.631261+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.72s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:47.576900+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.65s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:48.780036+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.97s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:52.572184+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "f3d5a79d62ed49c1874854ff20de8604", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.349}
> {"timestamp": "2026-05-07T14:35:52.669600+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.07s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:53.353557+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.23s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:54.798692+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.10s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:55.960211+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.39s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:57.245658+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "99364ffc5b814fd48c9fc77d1571cbde", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.731}
> {"timestamp": "2026-05-07T14:35:57.328773+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.84s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:57.549391+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.07s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:35:58.367638+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.24s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:00.825976+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.92s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:01.879367+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "4a34cc8ea44a4d1db8cc3bcf943f4288", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.235}
> {"timestamp": "2026-05-07T14:36:02.021508+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.68s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:02.161631+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.04s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:03.434993+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.01s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:05.449052+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.46s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:06.349403+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.43s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:06.492583+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "55bf9ce609d1454f841b14d559f4f7d5", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.551}
> {"timestamp": "2026-05-07T14:36:07.105207+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.90s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:08.277974+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.51s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:09.851620+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.03s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:11.135159+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a7594129d3de4d8f81f6b178a0984a1f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 40.722}
> {"timestamp": "2026-05-07T14:36:11.142626+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.72s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:11.689052+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:12.782308+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.81s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:14.714307+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.03s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:15.292682+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:15.781219+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "f78bf6d638b5410384384059356ad0d3", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.987}
> {"timestamp": "2026-05-07T14:36:15.956672+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.52s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:16.383968+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.59s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:18.283150+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.06s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:19.216128+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:19.591327+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.02s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:20.442408+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "4bf7761a6f0543bcb012cfa6d5915c62", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.013}
> {"timestamp": "2026-05-07T14:36:20.565774+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.58s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:25.550210+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.26s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:25.654770+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:27.060799+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.06s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:27.069120+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.20s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:27.704779+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b4ba000cbcdf4e848ffa495de31c587f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.936}
> {"timestamp": "2026-05-07T14:36:30.023327+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.04s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:30.949748+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.35s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:31.247375+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.51s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:32.367457+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "9b5d932d0fbf4cfc8ee48adc8feeeb67", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.931}
> {"timestamp": "2026-05-07T14:36:32.942728+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:34.134319+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.75s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:35.118697+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.70s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:35.541462+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.99s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:36.720490+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.89s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:37.006397+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a8876f729c554ec393cf107fd2409963", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.009}
> {"timestamp": "2026-05-07T14:36:37.794571+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:39.095140+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.10s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:39.962660+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.16s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:41.342985+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.85s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:41.623523+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "7ac697fde7804675aea6da4f90c8d1f1", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.801}
> {"timestamp": "2026-05-07T14:36:42.930123+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.99s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:43.972902+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.04s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:44.147797+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.52s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:45.461777+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.59s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:46.195958+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "79af649cae854a8eadf2a047fba876a2", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.395}
> {"timestamp": "2026-05-07T14:36:46.310521+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.29s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:48.079316+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.20s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:48.895723+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.42s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:50.629988+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.05s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:50.858294+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "144253f2593c4c27a4984a6e89e73dcc", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.369}
> {"timestamp": "2026-05-07T14:36:51.727622+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.99s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:52.933030+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.55s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:53.269155+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.85s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:54.326825+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.86s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:57.874054+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.41s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:58.156162+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "7eed5e1df04740209060a4f587d49bee", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.485}
> {"timestamp": "2026-05-07T14:36:59.528212+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:36:59.915709+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:01.187806+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.98s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:03.036244+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "890a583bf2654daeaa01782ae3055fc8", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 18.368}
> {"timestamp": "2026-05-07T14:37:04.074045+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.17s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:04.283970+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.95s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:05.454083+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:05.497065+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.04s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:07.692552+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "4b50238e1f564abc8b66f543ece263f5", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.784}
> {"timestamp": "2026-05-07T14:37:07.982062+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.23s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:09.170646+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.07s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:09.675553+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.73s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:10.456254+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.00s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:12.235128+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a4855df50e17422d9e9b27fe132f5e46", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.359}
> {"timestamp": "2026-05-07T14:37:12.761768+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.90s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:13.137911+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.43s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:13.899256+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.05s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:14.833871+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.17s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:16.871127+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a814e3e1140345c4a3b5c51aa2da9195", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.619}
> {"timestamp": "2026-05-07T14:37:16.985349+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.84s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:18.059700+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.55s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:18.122694+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:19.720123+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.56s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:21.488523+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.93s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:21.512708+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ec952a3f571d4b9fbb29897c5e122bfe", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.721}
> {"timestamp": "2026-05-07T14:37:22.211688+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.97s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:22.965265+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.04s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:23.494024+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.56s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:25.571954+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.37s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:26.202342+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "147ce5e8b95e4c59914d3cfd9e3c8874", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.442}
> {"timestamp": "2026-05-07T14:37:26.852528+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.24s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:27.184312+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.54s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:30.962249+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.93s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:32.573675+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.23s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:33.302965+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.50s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:33.569586+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ab54a561bbca4adf9adeb135e7d2ea5e", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.101}
> {"timestamp": "2026-05-07T14:37:34.014884+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.87s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:35.061807+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.55s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:36.613545+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.24s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:37.743364+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.17s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:38.104203+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.82s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:38.226936+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b4758ecbe20449f0a3a388ea494a7182", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.029}
> {"timestamp": "2026-05-07T14:37:39.102875+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.95s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:41.411131+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:41.821380+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.19s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:42.801609+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.14s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:42.857464+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "e8cd4723575b455d975fa72d1bf5f9c2", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.663}
> {"timestamp": "2026-05-07T14:37:43.224161+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.57s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:45.398158+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.96s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:46.394460+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.07s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:46.583159+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.53s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:47.440353+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "c1ffbee0e20f4d22befd3464c18e8d50", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.369}
> {"timestamp": "2026-05-07T14:37:47.662450+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.72s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:49.111229+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.78s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:49.772002+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.79s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:50.117648+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.65s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:50.793937+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.58s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:52.021130+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "57ecd1f0211a4783a4dd8d6bd04f241c", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.737}
> {"timestamp": "2026-05-07T14:37:52.508722+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.98s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:53.529833+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.03s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:53.659007+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.83s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:54.774637+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.73s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:56.630778+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b104dbec09834d398c0080732bcacf03", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.534}
> {"timestamp": "2026-05-07T14:37:56.967127+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.89s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:57.358773+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.33s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:58.179936+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.17s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:37:58.914180+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.98s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:03.563157+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.47s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:04.061317+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "bf0bdbbcc8f04fed8b18e144fb0f3c9f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.382}
> {"timestamp": "2026-05-07T14:38:05.284064+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.98s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:05.388669+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.43s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:07.041529+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.59s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:08.478379+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:08.776084+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "fda81675fa1143c99650ebe49e8ed4f3", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 26.217}
> {"timestamp": "2026-05-07T14:38:09.407422+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.19s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:09.832025+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:10.832115+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.76s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:12.761255+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.47s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:13.339682+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "f7ab406d5953495e8715282f19c63523", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.833}
> {"timestamp": "2026-05-07T14:38:13.628087+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.46s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:14.482979+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.57s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:15.261146+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.58s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:17.511355+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.07s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:17.570935+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.89s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:17.931258+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a2c8c420898543e7ada6ee73956d6487", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 13.138}
> {"timestamp": "2026-05-07T14:38:18.699874+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.06s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:18.795417+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.95s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:21.130848+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.85s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:22.046292+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:22.198825+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:22.569795+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "28d2e34047384ec29432fcf5b4b26d77", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.543}
> {"timestamp": "2026-05-07T14:38:23.318651+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.79s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:25.516267+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.30s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:25.585009+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:26.663158+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.17s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:27.126221+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.05s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:27.231079+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "9a1819f28bbf4822b0194779e914c6ed", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 15.949}
> {"timestamp": "2026-05-07T14:38:30.133741+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.98s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:30.369429+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.26s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:31.414151+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.57s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:31.888254+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "d277ff85f8ea48969dbfd81d04f62141", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.131}
> {"timestamp": "2026-05-07T14:38:31.901938+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:37.157032+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:37.567603+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.79s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:38.273535+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.92s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:38.585469+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.93s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:39.378962+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "4787faa491f445b78b3d4e6b1712f60f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.865}
> {"timestamp": "2026-05-07T14:38:40.638092+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:41.866036+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.31s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:42.065059+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:43.370568+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:44.083936+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "53071a1b1d3f4102880a63ba5a40caea", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.839}
> {"timestamp": "2026-05-07T14:38:45.256731+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:45.631518+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.01s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:46.703826+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.98s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:46.853385+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.57s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:48.668367+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ca7b14be112743e3ae6cee86ae6dc454", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.921}
> {"timestamp": "2026-05-07T14:38:49.339927+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.10s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:49.440235+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.49s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:50.671182+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.84s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:51.143426+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:53.257679+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "9c238867712e4de1b5b7fa584fdce1f9", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.951}
> {"timestamp": "2026-05-07T14:38:53.742040+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.05s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:54.104436+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:55.017713+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.64s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:55.521672+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.85s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:57.736336+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.43s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:57.860394+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a66da214a1004e3ab460c139c67f603d", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.755}
> {"timestamp": "2026-05-07T14:38:57.979996+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.10s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:59.319508+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.09s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:38:59.434730+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.60s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:01.862698+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:02.156608+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:02.522669+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "420094589be742b7820d02ab05d89083", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.072}
> {"timestamp": "2026-05-07T14:39:03.260209+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.85s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:03.616906+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.12s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:09.097103+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.14s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:09.121861+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:09.760101+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "fa4996bc65e74052ba76bfd97ea05c70", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.82}
> {"timestamp": "2026-05-07T14:39:10.453986+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.10s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:10.468930+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:13.351645+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.39s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:14.031686+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.75s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:14.456964+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "eee00bd7f2e040158146367de340ab3e", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.418}
> {"timestamp": "2026-05-07T14:39:14.987905+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.23s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:15.038973+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:17.686254+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.14s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:19.007706+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.52s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:19.098788+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6066a7b615e34f4abd18996778561353", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.368}
> {"timestamp": "2026-05-07T14:39:21.763994+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.24s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:23.401203+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.70s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:23.642960+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "43bc7f10d16644c8a50a9f8f8f28a4ca", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 5.723}
> {"timestamp": "2026-05-07T14:39:25.792695+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.84s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:26.854519+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.68s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:28.230438+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "85c23ce2b64f44588d18d25e94291d5c", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.628}
> {"timestamp": "2026-05-07T14:39:30.345578+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.27s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:31.824746+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.96s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:32.847334+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "63a4394abfe4423ebbcd97e54b90c950", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 15.339}
> {"timestamp": "2026-05-07T14:39:34.282004+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:35.395537+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:37.610662+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "dda2364cf564421e82bf99f61258a76d", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.038}
> {"timestamp": "2026-05-07T14:39:41.397759+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.95s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:42.587548+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.65s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:44.990410+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "957c4b03cc7040ecb4fcce6c69d1480e", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.883}
> {"timestamp": "2026-05-07T14:39:45.097046+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:46.204184+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.16s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:49.616952+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "06b87990410642e5aefc9b933bf665a0", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.745}
> {"timestamp": "2026-05-07T14:39:49.800701+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.25s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:51.240241+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:53.703224+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.36s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:54.201183+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6a889b7b7ae44f299d6b3028702f02a0", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.762}
> {"timestamp": "2026-05-07T14:39:55.399763+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.71s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:58.247992+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.40s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:39:58.742903+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ad37e3467ba649b3b9729ce2d4368a34", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.508}
> {"timestamp": "2026-05-07T14:39:59.901090+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:40:02.625213+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.31s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:40:03.428882+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "e79d171b1a074afebf6967954880b72d", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 6.129}
> {"timestamp": "2026-05-07T14:40:04.128909+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.63s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:40:07.158032+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.99s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:40:08.085791+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "bdee5906c9a14ebcaea463ccc9cee5d7", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.928}
> {"timestamp": "2026-05-07T14:40:08.355532+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.25s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:40:13.688989+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.26s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:40:15.205146+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.84s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:40:15.428325+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "5b1f77c27cef42df8b19d585a0688f59", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 7.357}
> {"timestamp": "2026-05-07T14:40:18.305960+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.29s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:40:19.816565+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.03s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:40:20.156526+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "e7988ae7267c4f7ab5deaf16c41e3ead", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.547}
  [entrypoint] running alembic upgrade head
  [entrypoint] ensuring openwakeword backbone models are downloaded
> {"timestamp": "2026-05-07T14:40:22.634815+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.94s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:40:23.785805+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:40:24.773310+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6a56c32bebe345be98f273f1cc7fd8f0", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 5.408}
> {"timestamp": "2026-05-07T14:40:29.397910+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "18aebc81018a4c2a8df5824f73888b30", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 14.454}
> {"timestamp": "2026-05-07T14:40:34.006400+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "9cab73d247f248b195ca43123d82244d", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 6.901}
> {"timestamp": "2026-05-07T14:40:38.663036+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ce79466ce47e4b38ad7734d71a05b121", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 7.434}
> {"timestamp": "2026-05-07T14:42:07.955207+00:00", "level": "ERROR", "logger": "violawake.email", "message": "Failed 
to send email to livetest-1778164926@violawake-test.example.com for subject Verify your ViolaWake email", 
"request_id": "39788e8aa10f4283ad413e90431a8cb9", "exception": "Traceback (most recent call last):\n  File 
\"/app/app/email_service.py\", line 191, in _send_email\n    await asyncio.to_thread(resend.Emails.send, params)\n  
File \"/usr/local/lib/python3.11/asyncio/threads.py\", line 25, in to_thread\n    return await 
loop.run_in_executor(None, func_call)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/concurrent/futures/thread.py\", line 58, in run\n    result = self.fn(*self.args, 
**self.kwargs)\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/resend/emails/_emails.py\", line 286, in send\n    
).perform_with_content()\n      ^^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/resend/request.py\", line 49, in perform_with_content\n    resp = 
self.perform()\n           ^^^^^^^^^^^^^^\n  File \"/usr/local/lib/python3.11/site-packages/resend/request.py\", line 
37, in perform\n    raise_for_code_and_type(\n  File \"/usr/local/lib/python3.11/site-packages/resend/exceptions.py\", 
line 270, in raise_for_code_and_type\n    raise ResendError(\nresend.exceptions.ResendError: The violawake.com domain 
is not verified. Please, add and verify your domain on https://resend.com/domains"}
> {"timestamp": "2026-05-07T14:42:07.956447+00:00", "level": "WARNING", "logger": "violawake.auth", "message": 
"Verification email failed \u2014 auto-verifying livetest-1778164926@violawake-test.example.com", "request_id": 
"39788e8aa10f4283ad413e90431a8cb9"}
  {"timestamp": "2026-05-07T14:42:07.959059+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "39788e8aa10f4283ad413e90431a8cb9", "method": "POST", "path": "/api/auth/register", 
"route": "/api/auth/register", "status_code": 201, "duration_ms": 605.214}
  {"timestamp": "2026-05-07T14:46:41.827803+00:00", "level": "INFO", "logger": "violawake.retention", "message": 
"Model retention cleanup complete: deleted 0 model(s)", "request_id": "-"}
> {"timestamp": "2026-05-07T14:46:50.455178+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola_e2e_1778163936': 
NoAudioReceived: No audio was received. Please verify that your parameters are correct.; retrying in 1.03s", 
"request_id": "-"}
> {"timestamp": "2026-05-07T14:46:51.695017+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola_e2e_1778163936': 
NoAudioReceived: No audio was received. Please verify that your parameters are correct.; retrying in 1.97s", 
"request_id": "-"}
> {"timestamp": "2026-05-07T14:46:53.859248+00:00", "level": "ERROR", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis failed for voice en-US-DavisNeural text 'viola_e2e_1778163936': edge-tts failed after 3 
attempts: NoAudioReceived: No audio was received. Please verify that your parameters are correct.", "request_id": "-"}
  {"timestamp": "2026-05-07T14:46:53.859382+00:00", "level": "INFO", "logger": "violawake_sdk.tts", "message": 
"TTSEngine created: voice=af_heart, speed=1.0", "request_id": "-"}
> {"timestamp": "2026-05-07T14:46:53.866448+00:00", "level": "INFO", "logger": "violawake.training", "message": 
"Generated 27 TTS positives for job 49 (total: 49)", "request_id": "-"}
> {"timestamp": "2026-05-07T14:46:55.277999+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.36s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:46:56.879119+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.78s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:46:59.116703+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.39s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:00.757626+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.71s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:03.581945+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.09s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:07.610159+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.95s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:10.519569+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.27s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:12.007456+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:15.578483+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.14s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:16.930950+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.79s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:19.257344+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.07s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:20.529405+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.87s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:23.618389+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:25.061257+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.10s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:28.052891+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.29s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:29.601017+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.97s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:32.926241+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.84s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:33.976321+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:36.853628+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.45s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:41.194838+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.02s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:44.277293+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.82s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:45.359114+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.95s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:48.097763+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.85s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:49.132896+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.66s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:52.323551+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:53.863533+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.82s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:56.080895+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.16s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:47:57.465412+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.14s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:00.689857+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.86s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:01.751313+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.93s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:04.569990+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:06.261950+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.14s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:12.801040+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.99s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:14.034280+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.16s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:16.611077+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.35s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:18.201690+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:21.464233+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.75s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:22.585392+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.73s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:25.105377+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.18s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:26.492720+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.20s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:30.250808+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.94s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:31.437353+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:34.018320+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.81s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:35.018403+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:38.496834+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.09s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:39.774200+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:45.349301+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.40s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:47.068987+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:50.410570+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.38s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:51.997228+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.69s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:54.094443+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.41s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:55.740854+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.84s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:48:58.768920+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.16s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:00.130100+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.86s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:02.745454+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.27s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:04.224721+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.07s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:07.637851+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.43s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:09.298595+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.20s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:11.968890+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:12.986920+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.75s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:18.509710+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.24s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:19.998953+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.66s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:22.516224+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.82s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:23.620686+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.25s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:27.327712+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.06s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:28.585226+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:30.879258+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.11s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:32.231662+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.59s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:34.906759+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.49s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:36.612811+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.72s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:39.087395+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:40.511705+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.54s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:43.604067+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.85s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:44.702200+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.54s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:46.680929+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.12s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:50.696080+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.70s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:53.521928+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.45s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:55.185493+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.73s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:57.711593+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.03s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:49:58.947467+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.53s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:02.106372+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.84s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:03.323776+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.10s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:05.812804+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.98s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:07.030188+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.80s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:09.965650+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.02s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:11.187470+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:13.845751+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.02s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:15.094303+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.89s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:18.676861+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.05s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:23.766741+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.86s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:26.100661+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.98s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:27.318556+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.78s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:30.435150+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.32s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:31.983439+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.61s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:34.676254+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.24s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:36.121447+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:39.917588+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:41.308181+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.20s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:44.077720+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.24s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:45.518169+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.03s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:48.881651+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.76s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:49.898394+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.97s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:52.943866+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.25s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:50:57.184303+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.67s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:00.516570+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.36s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:02.229579+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.85s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:04.825999+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:06.040228+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.93s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:09.241707+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.17s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:10.626112+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.95s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:13.438770+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.12s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:14.852516+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.18s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:18.534185+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.90s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:19.684117+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.23s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:22.431733+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.20s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:23.882644+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.81s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:29.503840+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.76s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:30.508033+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:33.134455+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.32s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:34.677016+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.92s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:38.266025+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.44s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:39.941140+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.16s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:42.586801+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.16s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:44.007324+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.06s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:47.217839+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:48.540912+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.72s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:51.072373+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.97s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:52.247921+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.06s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:55.601054+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.04s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:51:56.900995+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.59s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:01.648909+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:02.873325+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.51s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:05.676724+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.78s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:06.725272+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.63s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:09.067205+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.24s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:10.514819+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viaola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.52s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:13.565907+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.88s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:14.627216+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.74s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:16.850677+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:17.839128+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.75s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:20.644420+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.94s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:21.803272+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.20s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:24.713123+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:26.158039+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'vaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.12s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:29.726450+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.24s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:31.171429+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.81s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:36.173695+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.04s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:37.514080+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.81s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:40.429767+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.80s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:41.422543+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:44.235351+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.89s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:45.419314+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'wiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.81s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:49.254800+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.49s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:50.995678+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.85s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:53.331476+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:54.736035+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.73s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:57.992102+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.01s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:52:59.294476+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.60s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:01.885193+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.90s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:02.989037+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'vyola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:09.195769+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.29s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:10.714659+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.53s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:12.697194+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.90s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:13.813037+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.03s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:17.619183+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.82s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:18.638708+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.54s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:20.960730+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.10s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:22.321103+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viula e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.82s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:25.675863+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.90s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:26.793314+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:29.363808+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.79s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:30.407213+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.71s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:33.605176+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.42s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:35.226430+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.69s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:40.462380+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.20s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:41.882733+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viora e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.19s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:46.133670+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.82s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:47.179167+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:49.909325+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.42s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:51.604941+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.50s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:54.234295+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.92s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:55.464698+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.56s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:57.766371+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.85s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:53:58.868116+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violo e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.86s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:02.473848+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:04.004799+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.60s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:06.132328+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.97s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:07.691155+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.90s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:13.463809+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.50s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:15.141628+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.23s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:18.155792+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.79s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:19.241716+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.95s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:22.791466+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.47s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:24.495607+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.76s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:26.768643+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.83s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:27.776400+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:30.943022+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.93s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:32.121195+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.01s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:35.038949+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.96s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:36.252114+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'veola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:39.782809+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.40s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:41.458920+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.57s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:46.389529+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.81s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:47.428720+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.15s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:51.207966+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.87s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:52.329532+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.05s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:55.286467+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.81s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:56.321219+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'piola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.82s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:54:59.778235+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.39s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:01.419196+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.54s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:03.448848+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.98s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:04.716512+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.76s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:07.713352+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.38s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:09.380456+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.01s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:12.562432+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.06s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:13.949190+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'fiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.64s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:19.849646+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.85s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:20.947934+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.02s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:23.384113+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.41s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:25.043429+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.18s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:28.278040+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.11s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:29.596237+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.25s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:32.705673+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.97s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:33.927207+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'biola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.89s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:37.354584+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'vyaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.82s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:38.409038+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'vyaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.07s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:40.881660+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'vyaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.39s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:42.461403+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'vyaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.69s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:45.128264+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'vyaiola e e': NoAudioReceived: 
No audio was received. Please verify that your parameters are correct.; retrying in 1.41s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:46.763288+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'vyaiola e e': NoAudioReceived: 
No audio was received. Please verify that your parameters are correct.; retrying in 2.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:52.442951+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'vyaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.25s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:53.973813+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'vyaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.98s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:57.490664+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'vvaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.93s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:55:58.611149+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'vvaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.59s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:56:00.596537+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'vvaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.34s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:56:02.156734+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'vvaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.55s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:56:04.820706+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'vvaiola e e': NoAudioReceived: 
No audio was received. Please verify that your parameters are correct.; retrying in 0.77s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:56:05.767344+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'vvaiola e e': NoAudioReceived: 
No audio was received. Please verify that your parameters are correct.; retrying in 1.94s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:56:08.719917+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'vvaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.31s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:56:10.229323+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'vvaiola e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:56:13.767646+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.28s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:56:15.243186+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.00s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:56:17.668912+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.75s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:56:18.712751+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.79s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:56:24.341878+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.31s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:56:25.927740+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:56:28.849428+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.89s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:56:29.952461+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.10s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:56:33.577234+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.26s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:56:35.108971+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.52s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:57:11.935049+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.23s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:57:13.391847+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.09s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:57:16.553857+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.43s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:57:18.364461+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:57:21.260288+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.87s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:57:22.364896+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violia e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.95s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:57:28.324033+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.95s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:57:29.629766+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.20s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:57:32.252949+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.09s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:57:33.598434+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.63s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:57:36.320442+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.95s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:57:37.598347+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.24s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:57:40.616822+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.25s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:57:42.077189+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violah e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.23s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:57:45.728983+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.23s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:57:47.230246+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:57:49.967730+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.04s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:57:51.263831+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:57:54.429191+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.85s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:57:55.510812+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.20s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:01.186868+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.31s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:02.749051+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'violaa e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.18s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:06.378935+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.28s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:07.899341+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.90s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:10.255597+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.11s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:11.594394+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.66s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:14.482811+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.40s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:16.065779+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.00s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:18.851585+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.89s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:19.970522+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola he e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.07s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:23.516564+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.43s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:25.150406+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.99s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:27.535436+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.25s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:29.076384+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:35.162037+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.13s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:36.577990+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.00s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:39.384369+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.04s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:40.633606+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola eh e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.12s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:44.227934+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.43s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:45.870450+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.03s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:48.344441+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.26s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:49.880164+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.55s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:52.474593+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.27s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:53.965765+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:56.872595+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.06s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:58:58.174869+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ee e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.23s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:02.349037+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.04s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:06.481422+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.70s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:08.600104+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.12s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:09.933447+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.61s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:12.629837+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.45s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:14.307413+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.72s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:16.954119+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.39s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:18.551883+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ea e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.74s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:21.839501+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.14s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:23.308245+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.67s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:25.372873+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.29s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:26.868858+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.60s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:29.536156+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.31s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:31.078841+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.62s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:33.612017+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.27s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:35.202650+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e he': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.93s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:41.291590+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.27s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:42.802068+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.76s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:45.025654+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.33s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:46.696963+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.79s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:50.285233+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.81s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:51.277372+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.59s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:53.914949+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.09s", "request_id": "-"}
> {"timestamp": "2026-05-07T14:59:55.229634+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e eh': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.22s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:01.462788+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AriaNeural text 'viola e ee': 
WSServerHandshakeError: 503, message='Invalid response status', url='wss://speech.platform.bing.com/consumer/speech/syn
thesize/readaloud/edge/v1?TrustedClientToken=6A5AA1D4EAFF4E9FB37E23D68491D6F4&ConnectionId=53ff32d8f3d746d6ada94f1dfa96
a46d&Sec-MS-GEC=B770C2A54D455AFADD37B55B5E4D345FFB493BD7FF5958DB440C9005A23E8020&Sec-MS-GEC-Version=1-143.0.3650.75'; 
retrying in 1.32s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:03.456347+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.99s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:04.687988+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.69s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:06.918158+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.92s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:08.122345+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:14.268490+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.92s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:15.447406+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.19s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:18.423494+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.03s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:19.673414+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ee': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.00s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:23.213832+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.10s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:24.559687+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.80s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:26.840550+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.28s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:28.369443+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.02s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:31.496194+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.95s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:32.680205+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.82s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:35.308938+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.24s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:36.773215+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ea': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.71s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:39.985836+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.93s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:41.184673+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.97s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:46.294472+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.75s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:47.288828+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.08s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:50.613055+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.43s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:52.265078+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.58s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:54.856218+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.03s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:56.169300+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola e ae': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.98s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:00:59.886713+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.39s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:01.510211+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.03s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:03.990962+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.19s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:05.371488+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.66s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:08.213377+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.46s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:09.891622+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.60s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:12.305055+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:13.797965+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viola ae e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.52s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:19.611083+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.91s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:20.785310+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.11s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:23.362335+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.21s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:24.920240+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.93s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:28.005896+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.37s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:29.598885+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.20s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:32.650564+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.80s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:33.629294+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'viohla e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.95s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:37.109220+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-DavisNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.00s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:38.308273+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-DavisNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 2.05s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:40.868761+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-AmberNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.78s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:41.873415+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-AmberNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.80s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:44.852097+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-BrandonNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 0.85s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:45.926745+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-BrandonNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.95s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:51.610441+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 1/3 failed for voice en-US-CoraNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.48s", "request_id": "-"}
> {"timestamp": "2026-05-07T15:01:53.329774+00:00", "level": "WARNING", "logger": "violawake_sdk.tools.train", 
"message": "edge-tts synthesis attempt 2/3 failed for voice en-US-CoraNeural text 'vioala e e': NoAudioReceived: No 
audio was received. Please verify that your parameters are correct.; retrying in 1.93s", "request_id": "-"}
  /usr/local/lib/python3.11/site-packages/violawake_sdk/training/temporal_model.py:271: UserWarning: # 'dynamic_axes' 
is not recommended when dynamo=True, and may lead to 'torch._dynamo.exc.UserError: Constraints violated.' Supply the 
'dynamic_shapes' argument instead if export is unsuccessful.
>   torch.onnx.export(
> W0507 15:14:47.094000 1 site-packages/torch/onnx/_internal/exporter/_compat.py:133] Setting ONNX exporter to use 
operator set version 18 because the requested opset_version 11 is a lower version than we have implementations for. 
Automatic version conversion will be performed, which may not be successful at converting to the requested version. If 
version conversion is unsuccessful, the opset version of the exported model will be kept at 18. Please consider 
setting opset_version >=18 to leverage latest ONNX features
> W0507 15:14:47.935000 1 site-packages/torch/onnx/_internal/exporter/_registration.py:110] torchvision is not 
installed. Skipping torchvision::nms
> W0507 15:14:47.936000 1 site-packages/torch/onnx/_internal/exporter/_registration.py:110] torchvision is not 
installed. Skipping torchvision::roi_align
> W0507 15:14:47.936000 1 site-packages/torch/onnx/_internal/exporter/_registration.py:110] torchvision is not 
installed. Skipping torchvision::roi_pool
  /usr/local/lib/python3.11/copyreg.py:105: FutureWarning: `isinstance(treespec, LeafSpec)` is deprecated, use 
`isinstance(treespec, TreeSpec) and treespec.is_leaf()` instead.
    return cls.__new__(cls, *args)
> {"timestamp": "2026-05-07T15:14:49.995941+00:00", "level": "ERROR", "logger": "violawake.training", "message": 
"Training job failed", "request_id": "-", "source": "training", "error_kind": "unexpected", "error_reason": "bug", 
"error_type": "ConversionError", "error_message": "Failed to convert the exported program to an ONNX model. 
\u001b[96mThis is step 3/3\u001b[0m of exporting the model to ONNX. Next steps:\n- If there is a missing ONNX 
function, implement it and register it to the registry.\n- If there is an internal error during ONNX conversion, debug 
the error and submit a PR to PyTorch.\n- Create an error report with `torch.onnx.export(..., report=True)`, and save 
the ExportedProgram as a pt2 file. Create an issue in the PyTorch GitHub repository against the 
\u001b[96m*onnx*\u001b[0m component. Attach the error report and the pt2 model.\n\n## Exception summary\n\n<class 
'torch.onnx._internal.exporter._errors.DispatchError'>: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\u2b06\ufe0f\n<class 'torch.onnx._internal.exporter._errors.ConversionError'>: Error when 
translating node %adaptive_max_pool2d : [num_users=1] = 
call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = (%unsqueeze, [1, 1]), kwargs = {}). See the 
stack trace for more information.\n\n(Refer to the full stack trace above for more information.)", "job_id": 49, 
"wake_word": "viola_e2e_1778163936", "exception": "Traceback (most recent call last):\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 816, in _translate_fx_graph\n 
   _handle_call_function_node_with_lowering(\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 598, in 
_handle_call_function_node_with_lowering\n    raise 
_errors.DispatchError(\ntorch.onnx._internal.exporter._errors.DispatchError: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent 
call last):\n  File \"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1509, in 
export\n    onnx_program = _exported_program_to_onnx_program(\n                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n 
 File \"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1123, in 
_exported_program_to_onnx_program\n    values = _translate_fx_graph(\n             ^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 842, in _translate_fx_graph\n 
   raise _errors.ConversionError(\ntorch.onnx._internal.exporter._errors.ConversionError: Error when translating node 
%adaptive_max_pool2d : [num_users=1] = call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = 
(%unsqueeze, [1, 1]), kwargs = {}). See the stack trace for more information.\n\nThe above exception was the direct 
cause of the following exception:\n\nTraceback (most recent call last):\n  File 
\"/app/app/services/training_service.py\", line 304, in run_training_job_sync\n    _train_temporal_cnn(\n  File 
\"/usr/local/lib/python3.11/site-packages/violawake_sdk/tools/train.py\", line 1572, in _train_temporal_cnn\n    
export_temporal_onnx(model, str(output_path), seq_len=seq_len, embedding_dim=EMBEDDING_DIM)\n  File 
\"/usr/local/lib/python3.11/site-packages/violawake_sdk/training/temporal_model.py\", line 271, in 
export_temporal_onnx\n    torch.onnx.export(\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/__init__.py\", line 291, in export\n    return 
_compat.export_compat(\n           ^^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_compat.py\", line 161, in export_compat\n    
onnx_program = _core.export(\n                   ^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_flags.py\", line 27, in wrapper\n    return 
func(*args, **kwargs)\n           ^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1551, in export\n    raise 
_errors.ConversionError(\ntorch.onnx._internal.exporter._errors.ConversionError: Failed to convert the exported 
program to an ONNX model. \u001b[96mThis is step 3/3\u001b[0m of exporting the model to ONNX. Next steps:\n- If there 
is a missing ONNX function, implement it and register it to the registry.\n- If there is an internal error during ONNX 
conversion, debug the error and submit a PR to PyTorch.\n- Create an error report with `torch.onnx.export(..., 
report=True)`, and save the ExportedProgram as a pt2 file. Create an issue in the PyTorch GitHub repository against 
the \u001b[96m*onnx*\u001b[0m component. Attach the error report and the pt2 model.\n\n## Exception summary\n\n<class 
'torch.onnx._internal.exporter._errors.DispatchError'>: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\u2b06\ufe0f\n<class 'torch.onnx._internal.exporter._errors.ConversionError'>: Error when 
translating node %adaptive_max_pool2d : [num_users=1] = 
call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = (%unsqueeze, [1, 1]), kwargs = {}). See the 
stack trace for more information.\n\n(Refer to the full stack trace above for more information.)"}
> {"timestamp": "2026-05-07T15:14:50.055445+00:00", "level": "ERROR", "logger": "violawake.jobs", "message": "Training 
job failed", "request_id": "-", "source": "job_queue", "error_kind": "unexpected", "error_reason": "bug", 
"error_type": "ConversionError", "error_message": "Failed to convert the exported program to an ONNX model. 
\u001b[96mThis is step 3/3\u001b[0m of exporting the model to ONNX. Next steps:\n- If there is a missing ONNX 
function, implement it and register it to the registry.\n- If there is an internal error during ONNX conversion, debug 
the error and submit a PR to PyTorch.\n- Create an error report with `torch.onnx.export(..., report=True)`, and save 
the ExportedProgram as a pt2 file. Create an issue in the PyTorch GitHub repository against the 
\u001b[96m*onnx*\u001b[0m component. Attach the error report and the pt2 model.\n\n## Exception summary\n\n<class 
'torch.onnx._internal.exporter._errors.DispatchError'>: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\u2b06\ufe0f\n<class 'torch.onnx._internal.exporter._errors.ConversionError'>: Error when 
translating node %adaptive_max_pool2d : [num_users=1] = 
call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = (%unsqueeze, [1, 1]), kwargs = {}). See the 
stack trace for more information.\n\n(Refer to the full stack trace above for more information.)", "job_id": 49, 
"exception": "Traceback (most recent call last):\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 816, in _translate_fx_graph\n 
   _handle_call_function_node_with_lowering(\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 598, in 
_handle_call_function_node_with_lowering\n    raise 
_errors.DispatchError(\ntorch.onnx._internal.exporter._errors.DispatchError: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent 
call last):\n  File \"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1509, in 
export\n    onnx_program = _exported_program_to_onnx_program(\n                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n 
 File \"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1123, in 
_exported_program_to_onnx_program\n    values = _translate_fx_graph(\n             ^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 842, in _translate_fx_graph\n 
   raise _errors.ConversionError(\ntorch.onnx._internal.exporter._errors.ConversionError: Error when translating node 
%adaptive_max_pool2d : [num_users=1] = call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = 
(%unsqueeze, [1, 1]), kwargs = {}). See the stack trace for more information.\n\nThe above exception was the direct 
cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/app/app/job_queue.py\", line 719, 
in _execute_job\n    artifact = await asyncio.to_thread(\n               ^^^^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/asyncio/threads.py\", line 25, in to_thread\n    return await loop.run_in_executor(None, 
func_call)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/concurrent/futures/thread.py\", line 58, in run\n    result = self.fn(*self.args, 
**self.kwargs)\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/app/app/services/training_service.py\", 
line 304, in run_training_job_sync\n    _train_temporal_cnn(\n  File 
\"/usr/local/lib/python3.11/site-packages/violawake_sdk/tools/train.py\", line 1572, in _train_temporal_cnn\n    
export_temporal_onnx(model, str(output_path), seq_len=seq_len, embedding_dim=EMBEDDING_DIM)\n  File 
\"/usr/local/lib/python3.11/site-packages/violawake_sdk/training/temporal_model.py\", line 271, in 
export_temporal_onnx\n    torch.onnx.export(\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/__init__.py\", line 291, in export\n    return 
_compat.export_compat(\n           ^^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_compat.py\", line 161, in export_compat\n    
onnx_program = _core.export(\n                   ^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_flags.py\", line 27, in wrapper\n    return 
func(*args, **kwargs)\n           ^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1551, in export\n    raise 
_errors.ConversionError(\ntorch.onnx._internal.exporter._errors.ConversionError: Failed to convert the exported 
program to an ONNX model. \u001b[96mThis is step 3/3\u001b[0m of exporting the model to ONNX. Next steps:\n- If there 
is a missing ONNX function, implement it and register it to the registry.\n- If there is an internal error during ONNX 
conversion, debug the error and submit a PR to PyTorch.\n- Create an error report with `torch.onnx.export(..., 
report=True)`, and save the ExportedProgram as a pt2 file. Create an issue in the PyTorch GitHub repository against 
the \u001b[96m*onnx*\u001b[0m component. Attach the error report and the pt2 model.\n\n## Exception summary\n\n<class 
'torch.onnx._internal.exporter._errors.DispatchError'>: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\u2b06\ufe0f\n<class 'torch.onnx._internal.exporter._errors.ConversionError'>: Error when 
translating node %adaptive_max_pool2d : [num_users=1] = 
call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = (%unsqueeze, [1, 1]), kwargs = {}). See the 
stack trace for more information.\n\n(Refer to the full stack trace above for more information.)"}



exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command "docker logs wakeword-backend-1 --since \"2026-05-07T14:20:00Z\" 2>&1 | Select-String -Pattern '\"/api/training/status/49\"'" in J:\CLAUDE\PROJECTS\Wakeword
2026-05-07T16:09:13.397204Z ERROR codex_core::tools::router: error=Exit code: 1
Wall time: 0.7 seconds
Total output lines: 540
Output:

{"timestamp": "2026-05-07T14:25:40.281611+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "cf1d7b892f5a4a4da684a5b205bcb671", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.965}
{"timestamp": "2026-05-07T14:25:44.906989+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6cba8543213344bc8df52bab8a9afda7", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.051}
{"timestamp": "2026-05-07T14:25:49.520616+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "64044f9df2514ae684bbbde51ddab515", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 5.521}
{"timestamp": "2026-05-07T14:25:54.153852+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "7c38b8b991d24d2da331e95e75c13e60", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 17.755}
{"timestamp": "2026-05-07T14:25:58.822096+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "fde3f357ac41491cb23b6056027ec356", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.57}
{"timestamp": "2026-05-07T14:26:06.117557+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "20c6625aad3440ae9ea936c1b17f808c", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.593}
{"timestamp": "2026-05-07T14:26:10.802499+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "127740a3a4814f658d63240fd331c421", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.197}
{"timestamp": "2026-05-07T14:26:15.468558+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "2106b20422644eabae96c0005213436d", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.337}
{"timestamp": "2026-05-07T14:26:20.010913+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "5f6d3f9ca7b7487a8ebe0eba0520c876", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.056}
{"timestamp": "2026-05-07T14:26:24.642821+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "fd2683fb18eb4e16a1dca7528c5686a9", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.808}
{"timestamp": "2026-05-07T14:26:29.444209+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "dee73b4729f34e14b6bc94925039af45", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.199}
{"timestamp": "2026-05-07T14:26:36.829737+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "71b8206e29184b55bdc2dd270e21f8e9", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.575}
{"timestamp": "2026-05-07T14:26:41.485929+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "80cab17a0e304c0d91507e81dfb7d89f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.184}
{"timestamp": "2026-05-07T14:26:46.083144+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "8084f594d08642a899871426dd8e88c4", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.868}
{"timestamp": "2026-05-07T14:26:50.699953+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "f6852ca9af8d41468da32cc4930a82f5", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.226}
{"timestamp": "2026-05-07T14:26:55.326990+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "5f7ea8dcc9b34d9d84c40c7c108dc283", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.089}
{"timestamp": "2026-05-07T14:26:59.970875+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b62b6164ea4d4622a33fb3f77d9a486b", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.751}
{"timestamp": "2026-05-07T14:27:04.621424+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "756dd602f9544b24a2a020adad38f03c", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.826}
{"timestamp": "2026-05-07T14:27:11.931507+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b0d7a3d33c1b490d8880a51ac7086435", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.042}
{"timestamp": "2026-05-07T14:27:16.601631+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "12acdf3fefc34a3496c71bd06f46f9a8", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.721}
{"timestamp": "2026-05-07T14:27:21.237492+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "468e2b1408924dc596b92df5d37e9949", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.774}
{"timestamp": "2026-05-07T14:27:25.816506+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "8e68bf297aaa44aabccd95f611668554", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.374}
{"timestamp": "2026-05-07T14:27:30.423372+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "04005bd96b4a4f37b45eb7426d734ded", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.805}
{"timestamp": "2026-05-07T14:27:35.086059+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a70a3d4124744a23a81d2dd7b714feae", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.365}
{"timestamp": "2026-05-07T14:27:42.388612+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "61a04def670e4d49a74f5692159b2eab", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.316}
{"timestamp": "2026-05-07T14:27:47.060395+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "fb4e87aa6f434a88ba8d8087ff5f67f9", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.101}
{"timestamp": "2026-05-07T14:27:51.667932+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "957925777b26488db351784a22ac3db4", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.96}
{"timestamp": "2026-05-07T14:27:56.221649+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6099fbc7c36f46a3ac0e0ab525078cc6", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.256}
{"timestamp": "2026-05-07T14:28:00.841422+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "18370eb11d1b4633b1d1da5ce94eb386", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.197}
{"timestamp": "2026-05-07T14:28:05.470900+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "df6a5762d69d4c9ab72ecc1e4ef1b9fd", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.737}
{"timestamp": "2026-05-07T14:28:10.192662+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "133b5eb0a9d44e718f2fd12534464740", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.998}
{"timestamp": "2026-05-07T14:28:17.645790+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "94d5e0340c414c0e83150504fbcbfe3b", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.991}
{"timestamp": "2026-05-07T14:28:22.374557+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "7f9c6b6831f94073ad82bceb053f62a9", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.011}
{"timestamp": "2026-05-07T14:28:26.960328+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "29b18e389b6e444499f369b8c5a6d890", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.12}
{"timestamp": "2026-05-07T14:28:31.500525+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "54457c0807694c60b4e38f7829c6315f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.682}
{"timestamp": "2026-05-07T14:28:36.037202+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "952b8155068a4847b52ef7d7d8ad7f66", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.063}
{"timestamp": "2026-05-07T14:28:40.647856+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "3903a10bd155487197b5f2fc3fa2c7d0", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.871}
{"timestamp": "2026-05-07T14:28:48.115288+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "145865fca5eb47d29f75179904d5daf9", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.106}
{"timestamp": "2026-05-07T14:28:52.745520+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "1ae89938be594eeab5d1ec0882ec472b", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.215}
{"timestamp": "2026-05-07T14:28:57.288494+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6da70ecf58bf4c168ef4f467af261a67", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.157}
{"timestamp": "2026-05-07T14:29:01.911004+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "df02e021db2e4da6a8da2b931fed21a8", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.656}
{"timestamp": "2026-05-07T14:29:06.533989+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "1d005de5502648db947667f37fdbd2f2", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.986}
{"timestamp": "2026-05-07T14:29:11.160502+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "9a09abc99ba24833a41a0534e4c5e3ce", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.899}
{"timestamp": "2026-05-07T14:29:15.837650+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "86afdd14638044d58442083f2207653a", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.547}
{"timestamp": "2026-05-07T14:29:23.306396+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "8779042ce0344a4a87909cc6e4d8f2ca", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.197}
{"timestamp": "2026-05-07T14:29:28.041785+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b71ec19fefc849e7a34eb31e4a113bd3", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.294}
{"timestamp": "2026-05-07T14:29:32.700474+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "1455e702052e4196ad4932a2f646e247", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.558}
{"timestamp": "2026-05-07T14:29:37.285431+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "84121ae801cc454eade96e60813c40f5", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.081}
{"timestamp": "2026-05-07T14:29:41.918196+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "214a4ec9cbce4dab8b64d76a9bb024fd", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.947}
{"timestamp": "2026-05-07T14:29:46.593002+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "d987038eee844e778d3450f47d0ce023", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.009}
{"timestamp": "2026-05-07T14:29:53.747302+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "3533556416a74ca080285a6f23ac8493", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.033}
{"timestamp": "2026-05-07T14:29:58.397460+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "838a84dc4cdf4dfab5e12afe1c63a22e", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.352}
{"timestamp": "2026-05-07T14:30:03.060135+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6e8e5e1cc99d40ae9c7a299366914c9d", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.289}
{"timestamp": "2026-05-07T14:30:07.683473+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "3b591258b5bd45f9af3e470247ff3ebc", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.488}
{"timestamp": "2026-05-07T14:30:12.280133+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ffb09b3b73004c68a82cb9aa6c6a6e5a", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 7.187}
{"timestamp": "2026-05-07T14:30:16.915585+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "f3daac339c6a40a4aeaa8d893fc87179", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.036}
{"timestamp": "2026-05-07T14:30:21.587172+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "0983b6063fad493ab932edb4e1297ed5", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.526}
{"timestamp": "2026-05-07T14:30:28.881208+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "5bf61561c29448c8a72212745f80c1e7", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.275}
{"timestamp": "2026-05-07T14:30:33.553777+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "712d5820278a47caad60430672eca1e2", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.82}
{"timestamp": "2026-05-07T14:30:38.119985+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "adc395d45b5d4c46b5f0bc611b361727", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.177}
{"timestamp": "2026-05-07T14:30:42.690848+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "599d9dc39d8b4293a1b90fa35e9d1806", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.329}
{"timestamp": "2026-05-07T14:30:47.337743+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "33650cc4dfcb44a48f460dfad54acdb6", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 5.498}
{"timestamp": "2026-05-07T14:30:51.994314+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "49539b0acb364c3…4321 tokens truncated…612d8b2", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.682}
{"timestamp": "2026-05-07T14:35:31.390338+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "894d050d21c0407dae0e425c1f464037", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.471}
{"timestamp": "2026-05-07T14:35:35.951398+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b3e82705ae2d4be8a0615def25ff9875", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 15.299}
{"timestamp": "2026-05-07T14:35:40.605648+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "1c3c870edc824e89867b50c56529960c", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.119}
{"timestamp": "2026-05-07T14:35:45.247639+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a1bc6775da4c483282bfb3edb485f2be", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.961}
{"timestamp": "2026-05-07T14:35:52.572184+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "f3d5a79d62ed49c1874854ff20de8604", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.349}
{"timestamp": "2026-05-07T14:35:57.245658+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "99364ffc5b814fd48c9fc77d1571cbde", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.731}
{"timestamp": "2026-05-07T14:36:01.879367+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "4a34cc8ea44a4d1db8cc3bcf943f4288", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.235}
{"timestamp": "2026-05-07T14:36:06.492583+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "55bf9ce609d1454f841b14d559f4f7d5", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.551}
{"timestamp": "2026-05-07T14:36:11.135159+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a7594129d3de4d8f81f6b178a0984a1f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 40.722}
{"timestamp": "2026-05-07T14:36:15.781219+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "f78bf6d638b5410384384059356ad0d3", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.987}
{"timestamp": "2026-05-07T14:36:20.442408+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "4bf7761a6f0543bcb012cfa6d5915c62", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.013}
{"timestamp": "2026-05-07T14:36:27.704779+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b4ba000cbcdf4e848ffa495de31c587f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.936}
{"timestamp": "2026-05-07T14:36:32.367457+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "9b5d932d0fbf4cfc8ee48adc8feeeb67", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.931}
{"timestamp": "2026-05-07T14:36:37.006397+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a8876f729c554ec393cf107fd2409963", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.009}
{"timestamp": "2026-05-07T14:36:41.623523+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "7ac697fde7804675aea6da4f90c8d1f1", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.801}
{"timestamp": "2026-05-07T14:36:46.195958+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "79af649cae854a8eadf2a047fba876a2", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.395}
{"timestamp": "2026-05-07T14:36:50.858294+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "144253f2593c4c27a4984a6e89e73dcc", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.369}
{"timestamp": "2026-05-07T14:36:58.156162+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "7eed5e1df04740209060a4f587d49bee", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.485}
{"timestamp": "2026-05-07T14:37:03.036244+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "890a583bf2654daeaa01782ae3055fc8", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 18.368}
{"timestamp": "2026-05-07T14:37:07.692552+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "4b50238e1f564abc8b66f543ece263f5", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.784}
{"timestamp": "2026-05-07T14:37:12.235128+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a4855df50e17422d9e9b27fe132f5e46", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.359}
{"timestamp": "2026-05-07T14:37:16.871127+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a814e3e1140345c4a3b5c51aa2da9195", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.619}
{"timestamp": "2026-05-07T14:37:21.512708+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ec952a3f571d4b9fbb29897c5e122bfe", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.721}
{"timestamp": "2026-05-07T14:37:26.202342+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "147ce5e8b95e4c59914d3cfd9e3c8874", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.442}
{"timestamp": "2026-05-07T14:37:33.569586+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ab54a561bbca4adf9adeb135e7d2ea5e", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.101}
{"timestamp": "2026-05-07T14:37:38.226936+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b4758ecbe20449f0a3a388ea494a7182", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.029}
{"timestamp": "2026-05-07T14:37:42.857464+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "e8cd4723575b455d975fa72d1bf5f9c2", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.663}
{"timestamp": "2026-05-07T14:37:47.440353+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "c1ffbee0e20f4d22befd3464c18e8d50", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.369}
{"timestamp": "2026-05-07T14:37:52.021130+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "57ecd1f0211a4783a4dd8d6bd04f241c", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.737}
{"timestamp": "2026-05-07T14:37:56.630778+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b104dbec09834d398c0080732bcacf03", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.534}
{"timestamp": "2026-05-07T14:38:04.061317+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "bf0bdbbcc8f04fed8b18e144fb0f3c9f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.382}
{"timestamp": "2026-05-07T14:38:08.776084+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "fda81675fa1143c99650ebe49e8ed4f3", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 26.217}
{"timestamp": "2026-05-07T14:38:13.339682+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "f7ab406d5953495e8715282f19c63523", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.833}
{"timestamp": "2026-05-07T14:38:17.931258+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a2c8c420898543e7ada6ee73956d6487", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 13.138}
{"timestamp": "2026-05-07T14:38:22.569795+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "28d2e34047384ec29432fcf5b4b26d77", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.543}
{"timestamp": "2026-05-07T14:38:27.231079+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "9a1819f28bbf4822b0194779e914c6ed", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 15.949}
{"timestamp": "2026-05-07T14:38:31.888254+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "d277ff85f8ea48969dbfd81d04f62141", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.131}
{"timestamp": "2026-05-07T14:38:39.378962+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "4787faa491f445b78b3d4e6b1712f60f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.865}
{"timestamp": "2026-05-07T14:38:44.083936+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "53071a1b1d3f4102880a63ba5a40caea", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.839}
{"timestamp": "2026-05-07T14:38:48.668367+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ca7b14be112743e3ae6cee86ae6dc454", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.921}
{"timestamp": "2026-05-07T14:38:53.257679+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "9c238867712e4de1b5b7fa584fdce1f9", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.951}
{"timestamp": "2026-05-07T14:38:57.860394+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a66da214a1004e3ab460c139c67f603d", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.755}
{"timestamp": "2026-05-07T14:39:02.522669+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "420094589be742b7820d02ab05d89083", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.072}
{"timestamp": "2026-05-07T14:39:09.760101+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "fa4996bc65e74052ba76bfd97ea05c70", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.82}
{"timestamp": "2026-05-07T14:39:14.456964+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "eee00bd7f2e040158146367de340ab3e", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.418}
{"timestamp": "2026-05-07T14:39:19.098788+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6066a7b615e34f4abd18996778561353", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.368}
{"timestamp": "2026-05-07T14:39:23.642960+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "43bc7f10d16644c8a50a9f8f8f28a4ca", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 5.723}
{"timestamp": "2026-05-07T14:39:28.230438+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "85c23ce2b64f44588d18d25e94291d5c", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.628}
{"timestamp": "2026-05-07T14:39:32.847334+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "63a4394abfe4423ebbcd97e54b90c950", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 15.339}
{"timestamp": "2026-05-07T14:39:37.610662+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "dda2364cf564421e82bf99f61258a76d", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.038}
{"timestamp": "2026-05-07T14:39:44.990410+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "957c4b03cc7040ecb4fcce6c69d1480e", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.883}
{"timestamp": "2026-05-07T14:39:49.616952+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "06b87990410642e5aefc9b933bf665a0", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.745}
{"timestamp": "2026-05-07T14:39:54.201183+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6a889b7b7ae44f299d6b3028702f02a0", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.762}
{"timestamp": "2026-05-07T14:39:58.742903+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ad37e3467ba649b3b9729ce2d4368a34", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.508}
{"timestamp": "2026-05-07T14:40:03.428882+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "e79d171b1a074afebf6967954880b72d", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 6.129}
{"timestamp": "2026-05-07T14:40:08.085791+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "bdee5906c9a14ebcaea463ccc9cee5d7", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.928}
{"timestamp": "2026-05-07T14:40:15.428325+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "5b1f77c27cef42df8b19d585a0688f59", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 7.357}
{"timestamp": "2026-05-07T14:40:20.156526+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "e7988ae7267c4f7ab5deaf16c41e3ead", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.547}
{"timestamp": "2026-05-07T14:40:24.773310+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6a56c32bebe345be98f273f1cc7fd8f0", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 5.408}
{"timestamp": "2026-05-07T14:40:29.397910+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "18aebc81018a4c2a8df5824f73888b30", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 14.454}
{"timestamp": "2026-05-07T14:40:34.006400+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "9cab73d247f248b195ca43123d82244d", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 6.901}
{"timestamp": "2026-05-07T14:40:38.663036+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ce79466ce47e4b38ad7734d71a05b121", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 7.434}



 exited 1 in 652ms:

{"timestamp": "2026-05-07T14:25:40.281611+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "cf1d7b892f5a4a4da684a5b205bcb671", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.965}
{"timestamp": "2026-05-07T14:25:44.906989+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6cba8543213344bc8df52bab8a9afda7", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.051}
{"timestamp": "2026-05-07T14:25:49.520616+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "64044f9df2514ae684bbbde51ddab515", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 5.521}
{"timestamp": "2026-05-07T14:25:54.153852+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "7c38b8b991d24d2da331e95e75c13e60", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 17.755}
{"timestamp": "2026-05-07T14:25:58.822096+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "fde3f357ac41491cb23b6056027ec356", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.57}
{"timestamp": "2026-05-07T14:26:06.117557+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "20c6625aad3440ae9ea936c1b17f808c", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.593}
{"timestamp": "2026-05-07T14:26:10.802499+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "127740a3a4814f658d63240fd331c421", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.197}
{"timestamp": "2026-05-07T14:26:15.468558+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "2106b20422644eabae96c0005213436d", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.337}
{"timestamp": "2026-05-07T14:26:20.010913+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "5f6d3f9ca7b7487a8ebe0eba0520c876", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.056}
{"timestamp": "2026-05-07T14:26:24.642821+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "fd2683fb18eb4e16a1dca7528c5686a9", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.808}
{"timestamp": "2026-05-07T14:26:29.444209+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "dee73b4729f34e14b6bc94925039af45", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.199}
{"timestamp": "2026-05-07T14:26:36.829737+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "71b8206e29184b55bdc2dd270e21f8e9", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.575}
{"timestamp": "2026-05-07T14:26:41.485929+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "80cab17a0e304c0d91507e81dfb7d89f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.184}
{"timestamp": "2026-05-07T14:26:46.083144+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "8084f594d08642a899871426dd8e88c4", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.868}
{"timestamp": "2026-05-07T14:26:50.699953+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "f6852ca9af8d41468da32cc4930a82f5", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.226}
{"timestamp": "2026-05-07T14:26:55.326990+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "5f7ea8dcc9b34d9d84c40c7c108dc283", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.089}
{"timestamp": "2026-05-07T14:26:59.970875+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b62b6164ea4d4622a33fb3f77d9a486b", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.751}
{"timestamp": "2026-05-07T14:27:04.621424+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "756dd602f9544b24a2a020adad38f03c", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.826}
{"timestamp": "2026-05-07T14:27:11.931507+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b0d7a3d33c1b490d8880a51ac7086435", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.042}
{"timestamp": "2026-05-07T14:27:16.601631+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "12acdf3fefc34a3496c71bd06f46f9a8", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.721}
{"timestamp": "2026-05-07T14:27:21.237492+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "468e2b1408924dc596b92df5d37e9949", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.774}
{"timestamp": "2026-05-07T14:27:25.816506+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "8e68bf297aaa44aabccd95f611668554", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.374}
{"timestamp": "2026-05-07T14:27:30.423372+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "04005bd96b4a4f37b45eb7426d734ded", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.805}
{"timestamp": "2026-05-07T14:27:35.086059+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a70a3d4124744a23a81d2dd7b714feae", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.365}
{"timestamp": "2026-05-07T14:27:42.388612+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "61a04def670e4d49a74f5692159b2eab", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.316}
{"timestamp": "2026-05-07T14:27:47.060395+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "fb4e87aa6f434a88ba8d8087ff5f67f9", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.101}
{"timestamp": "2026-05-07T14:27:51.667932+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "957925777b26488db351784a22ac3db4", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.96}
{"timestamp": "2026-05-07T14:27:56.221649+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6099fbc7c36f46a3ac0e0ab525078cc6", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.256}
{"timestamp": "2026-05-07T14:28:00.841422+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "18370eb11d1b4633b1d1da5ce94eb386", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.197}
{"timestamp": "2026-05-07T14:28:05.470900+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "df6a5762d69d4c9ab72ecc1e4ef1b9fd", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.737}
{"timestamp": "2026-05-07T14:28:10.192662+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "133b5eb0a9d44e718f2fd12534464740", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.998}
{"timestamp": "2026-05-07T14:28:17.645790+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "94d5e0340c414c0e83150504fbcbfe3b", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.991}
{"timestamp": "2026-05-07T14:28:22.374557+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "7f9c6b6831f94073ad82bceb053f62a9", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.011}
{"timestamp": "2026-05-07T14:28:26.960328+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "29b18e389b6e444499f369b8c5a6d890", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.12}
{"timestamp": "2026-05-07T14:28:31.500525+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "54457c0807694c60b4e38f7829c6315f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.682}
{"timestamp": "2026-05-07T14:28:36.037202+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "952b8155068a4847b52ef7d7d8ad7f66", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.063}
{"timestamp": "2026-05-07T14:28:40.647856+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "3903a10bd155487197b5f2fc3fa2c7d0", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.871}
{"timestamp": "2026-05-07T14:28:48.115288+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "145865fca5eb47d29f75179904d5daf9", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.106}
{"timestamp": "2026-05-07T14:28:52.745520+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "1ae89938be594eeab5d1ec0882ec472b", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.215}
{"timestamp": "2026-05-07T14:28:57.288494+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6da70ecf58bf4c168ef4f467af261a67", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.157}
{"timestamp": "2026-05-07T14:29:01.911004+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "df02e021db2e4da6a8da2b931fed21a8", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.656}
{"timestamp": "2026-05-07T14:29:06.533989+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "1d005de5502648db947667f37fdbd2f2", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.986}
{"timestamp": "2026-05-07T14:29:11.160502+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "9a09abc99ba24833a41a0534e4c5e3ce", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.899}
{"timestamp": "2026-05-07T14:29:15.837650+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "86afdd14638044d58442083f2207653a", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.547}
{"timestamp": "2026-05-07T14:29:23.306396+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "8779042ce0344a4a87909cc6e4d8f2ca", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.197}
{"timestamp": "2026-05-07T14:29:28.041785+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b71ec19fefc849e7a34eb31e4a113bd3", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.294}
{"timestamp": "2026-05-07T14:29:32.700474+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "1455e702052e4196ad4932a2f646e247", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.558}
{"timestamp": "2026-05-07T14:29:37.285431+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "84121ae801cc454eade96e60813c40f5", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.081}
{"timestamp": "2026-05-07T14:29:41.918196+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "214a4ec9cbce4dab8b64d76a9bb024fd", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.947}
{"timestamp": "2026-05-07T14:29:46.593002+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "d987038eee844e778d3450f47d0ce023", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.009}
{"timestamp": "2026-05-07T14:29:53.747302+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "3533556416a74ca080285a6f23ac8493", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.033}
{"timestamp": "2026-05-07T14:29:58.397460+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "838a84dc4cdf4dfab5e12afe1c63a22e", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.352}
{"timestamp": "2026-05-07T14:30:03.060135+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6e8e5e1cc99d40ae9c7a299366914c9d", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.289}
{"timestamp": "2026-05-07T14:30:07.683473+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "3b591258b5bd45f9af3e470247ff3ebc", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.488}
{"timestamp": "2026-05-07T14:30:12.280133+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ffb09b3b73004c68a82cb9aa6c6a6e5a", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 7.187}
{"timestamp": "2026-05-07T14:30:16.915585+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "f3daac339c6a40a4aeaa8d893fc87179", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.036}
{"timestamp": "2026-05-07T14:30:21.587172+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "0983b6063fad493ab932edb4e1297ed5", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.526}
{"timestamp": "2026-05-07T14:30:28.881208+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "5bf61561c29448c8a72212745f80c1e7", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.275}
{"timestamp": "2026-05-07T14:30:33.553777+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "712d5820278a47caad60430672eca1e2", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.82}
{"timestamp": "2026-05-07T14:30:38.119985+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "adc395d45b5d4c46b5f0bc611b361727", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.177}
{"timestamp": "2026-05-07T14:30:42.690848+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "599d9dc39d8b4293a1b90fa35e9d1806", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.329}
{"timestamp": "2026-05-07T14:30:47.337743+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "33650cc4dfcb44a48f460dfad54acdb6", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 5.498}
{"timestamp": "2026-05-07T14:30:51.994314+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "49539b0acb364c379f6c9096282c3487", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.321}
{"timestamp": "2026-05-07T14:30:59.326213+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ac7115f7b82643b18f64a9f639282259", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.296}
{"timestamp": "2026-05-07T14:31:03.981204+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "d4ee181e5aa34e099cc081cb4471e3f9", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.704}
{"timestamp": "2026-05-07T14:31:08.615460+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "4cff519d242d49fba1ea6628fc8c7d42", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.805}
{"timestamp": "2026-05-07T14:31:13.193255+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a3550d4d3ff1410b9e8a14539228b007", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.829}
{"timestamp": "2026-05-07T14:31:17.982511+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "e77df705c7414b68bb60cafb1542d17e", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 10.739}
{"timestamp": "2026-05-07T14:31:22.643340+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "0eead31e69ff45c6a52df0ab7e1fc3d6", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.844}
{"timestamp": "2026-05-07T14:31:27.297489+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "f6fbfec5c66144718a9d21541fa530d0", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.164}
{"timestamp": "2026-05-07T14:31:34.572316+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "483992c23b3349f2b19d71156aa59dc0", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.993}
{"timestamp": "2026-05-07T14:31:39.240848+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "c0e2b15cbd274df3b090388d154825de", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.93}
{"timestamp": "2026-05-07T14:31:43.914601+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "fd3df044821b4849a868396e82e3c0d0", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.129}
{"timestamp": "2026-05-07T14:31:48.452072+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "2efafbdf5b3d464f8757a3a6c9310ba1", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 6.785}
{"timestamp": "2026-05-07T14:31:53.080187+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ac92c648f2244a31b249b2eb5af986a3", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.613}
{"timestamp": "2026-05-07T14:31:57.762549+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "79b173a6e991426bba54f33ccbd16f87", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.38}
{"timestamp": "2026-05-07T14:32:05.075346+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "3e232c1550da43dea087f2e696bbb284", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.203}
{"timestamp": "2026-05-07T14:32:09.976348+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "762211425d2949d79e95521f38bb911c", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.832}
{"timestamp": "2026-05-07T14:32:14.548232+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ffed88d74d3141cbb53156850db0fc79", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 7.65}
{"timestamp": "2026-05-07T14:32:19.114323+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "3bacf2b0f1b643f28f56477b138e45ec", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.653}
{"timestamp": "2026-05-07T14:32:23.737058+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "e4101af877d74c7fb13fa9f38e0ac67b", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.233}
{"timestamp": "2026-05-07T14:32:28.382908+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "c16ea6d6ef114da98969e2f96c3a99d1", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.229}
{"timestamp": "2026-05-07T14:32:33.065110+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "7151277190e9455f990adb07f98c167e", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.645}
{"timestamp": "2026-05-07T14:32:40.426506+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "cdf13206429042378e16133e88e126bb", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.48}
{"timestamp": "2026-05-07T14:32:45.172529+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "92b34842c93a46d8a74d53b6ccbc920f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.05}
{"timestamp": "2026-05-07T14:32:49.716822+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "369d19f6f7ea411ca1dfef514498be8a", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.178}
{"timestamp": "2026-05-07T14:32:54.251695+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b7cd038e009b4787979460f004b1bde5", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.831}
{"timestamp": "2026-05-07T14:32:58.788641+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "1254f91aff414ebe967fafd83f4b5724", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.66}
{"timestamp": "2026-05-07T14:33:03.472685+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "e28a48256cf14de99426ba4dd8bdb3cd", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.188}
{"timestamp": "2026-05-07T14:33:10.883087+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "e0c3b1a10c9f4e4983a3bd7e47db5ff7", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.25}
{"timestamp": "2026-05-07T14:33:15.529962+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "32aa009b664748e2a24012c9cb0a0835", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.589}
{"timestamp": "2026-05-07T14:33:20.155567+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ae9509a8da3f42c9b1074e0c1f1b699d", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.656}
{"timestamp": "2026-05-07T14:33:24.706286+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "0fe79348ec18478ebd736fe4ec2416f3", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.881}
{"timestamp": "2026-05-07T14:33:29.363130+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "8d69236310e54254a26581825479c1af", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.928}
{"timestamp": "2026-05-07T14:33:34.010791+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "2f0e2aefc3a04c8e9935bfd1b1c6c2ef", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.212}
{"timestamp": "2026-05-07T14:33:41.356966+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "705883ae39f1426c947829379f7ba568", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 7.252}
{"timestamp": "2026-05-07T14:33:46.053940+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "c028a08897394f6786db93dd093fcc56", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.843}
{"timestamp": "2026-05-07T14:33:50.672774+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b942dfea1e4a4b1993262794dbc53eaa", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.762}
{"timestamp": "2026-05-07T14:33:55.269231+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "0c043caa6df44ea19dccc4f511906b1b", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.699}
{"timestamp": "2026-05-07T14:33:59.805336+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "c3048b79a7534064bc2bf19d846dd77f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.422}
{"timestamp": "2026-05-07T14:34:04.417325+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "9ce2414d2d9e4c408012926cb3f0c849", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.32}
{"timestamp": "2026-05-07T14:34:09.034135+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "9c084fe1f80845228c06a9cd959577b5", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.29}
{"timestamp": "2026-05-07T14:34:16.542209+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "355a5a3874a3400891953ce33f09206f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.684}
{"timestamp": "2026-05-07T14:34:21.298302+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6a8e2b0f2f124e899c1864b237b819d0", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.827}
{"timestamp": "2026-05-07T14:34:25.846033+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "8f64ded80b1c4dc1b423054d52d490da", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.301}
{"timestamp": "2026-05-07T14:34:30.412529+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ae9f254397ca4b2ab468387bb50e17e6", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.508}
{"timestamp": "2026-05-07T14:34:35.024513+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "096ae7e3414f424981ac32f43f3c4907", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.904}
{"timestamp": "2026-05-07T14:34:39.673046+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "619debff066d459abefbdcc3918ff687", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 5.489}
{"timestamp": "2026-05-07T14:34:47.008955+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "9ee8673970084b9f895969370ebb8bc0", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 6.731}
{"timestamp": "2026-05-07T14:34:51.715792+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "4661936560b24574becbb3409da626ab", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.898}
{"timestamp": "2026-05-07T14:34:56.407087+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "d172f13178994492ba9a08b4105e07fa", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.804}
{"timestamp": "2026-05-07T14:35:00.946906+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b42c9b8065064056bb5663762972b5e7", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.279}
{"timestamp": "2026-05-07T14:35:05.483940+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "0a8f7752eb534c88bb1eafe802e44741", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.429}
{"timestamp": "2026-05-07T14:35:10.024270+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b1df05a9e97c41848c0e2bb5b8b2dde3", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.285}
{"timestamp": "2026-05-07T14:35:14.716927+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a2fe0fc90d0b400f92fd8d3b0606d593", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.442}
{"timestamp": "2026-05-07T14:35:22.138148+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "bc547b9a9ae44662b6d2a8f9d04be880", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 8.181}
{"timestamp": "2026-05-07T14:35:26.774735+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "f94a6cfa987148fab49037e70612d8b2", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.682}
{"timestamp": "2026-05-07T14:35:31.390338+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "894d050d21c0407dae0e425c1f464037", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.471}
{"timestamp": "2026-05-07T14:35:35.951398+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b3e82705ae2d4be8a0615def25ff9875", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 15.299}
{"timestamp": "2026-05-07T14:35:40.605648+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "1c3c870edc824e89867b50c56529960c", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.119}
{"timestamp": "2026-05-07T14:35:45.247639+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a1bc6775da4c483282bfb3edb485f2be", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.961}
{"timestamp": "2026-05-07T14:35:52.572184+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "f3d5a79d62ed49c1874854ff20de8604", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.349}
{"timestamp": "2026-05-07T14:35:57.245658+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "99364ffc5b814fd48c9fc77d1571cbde", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.731}
{"timestamp": "2026-05-07T14:36:01.879367+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "4a34cc8ea44a4d1db8cc3bcf943f4288", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.235}
{"timestamp": "2026-05-07T14:36:06.492583+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "55bf9ce609d1454f841b14d559f4f7d5", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.551}
{"timestamp": "2026-05-07T14:36:11.135159+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a7594129d3de4d8f81f6b178a0984a1f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 40.722}
{"timestamp": "2026-05-07T14:36:15.781219+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "f78bf6d638b5410384384059356ad0d3", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.987}
{"timestamp": "2026-05-07T14:36:20.442408+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "4bf7761a6f0543bcb012cfa6d5915c62", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.013}
{"timestamp": "2026-05-07T14:36:27.704779+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b4ba000cbcdf4e848ffa495de31c587f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.936}
{"timestamp": "2026-05-07T14:36:32.367457+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "9b5d932d0fbf4cfc8ee48adc8feeeb67", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.931}
{"timestamp": "2026-05-07T14:36:37.006397+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a8876f729c554ec393cf107fd2409963", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.009}
{"timestamp": "2026-05-07T14:36:41.623523+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "7ac697fde7804675aea6da4f90c8d1f1", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.801}
{"timestamp": "2026-05-07T14:36:46.195958+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "79af649cae854a8eadf2a047fba876a2", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.395}
{"timestamp": "2026-05-07T14:36:50.858294+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "144253f2593c4c27a4984a6e89e73dcc", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.369}
{"timestamp": "2026-05-07T14:36:58.156162+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "7eed5e1df04740209060a4f587d49bee", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.485}
{"timestamp": "2026-05-07T14:37:03.036244+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "890a583bf2654daeaa01782ae3055fc8", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 18.368}
{"timestamp": "2026-05-07T14:37:07.692552+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "4b50238e1f564abc8b66f543ece263f5", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.784}
{"timestamp": "2026-05-07T14:37:12.235128+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a4855df50e17422d9e9b27fe132f5e46", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.359}
{"timestamp": "2026-05-07T14:37:16.871127+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a814e3e1140345c4a3b5c51aa2da9195", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.619}
{"timestamp": "2026-05-07T14:37:21.512708+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ec952a3f571d4b9fbb29897c5e122bfe", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.721}
{"timestamp": "2026-05-07T14:37:26.202342+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "147ce5e8b95e4c59914d3cfd9e3c8874", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.442}
{"timestamp": "2026-05-07T14:37:33.569586+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ab54a561bbca4adf9adeb135e7d2ea5e", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.101}
{"timestamp": "2026-05-07T14:37:38.226936+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b4758ecbe20449f0a3a388ea494a7182", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.029}
{"timestamp": "2026-05-07T14:37:42.857464+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "e8cd4723575b455d975fa72d1bf5f9c2", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.663}
{"timestamp": "2026-05-07T14:37:47.440353+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "c1ffbee0e20f4d22befd3464c18e8d50", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.369}
{"timestamp": "2026-05-07T14:37:52.021130+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "57ecd1f0211a4783a4dd8d6bd04f241c", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.737}
{"timestamp": "2026-05-07T14:37:56.630778+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "b104dbec09834d398c0080732bcacf03", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.534}
{"timestamp": "2026-05-07T14:38:04.061317+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "bf0bdbbcc8f04fed8b18e144fb0f3c9f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.382}
{"timestamp": "2026-05-07T14:38:08.776084+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "fda81675fa1143c99650ebe49e8ed4f3", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 26.217}
{"timestamp": "2026-05-07T14:38:13.339682+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "f7ab406d5953495e8715282f19c63523", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.833}
{"timestamp": "2026-05-07T14:38:17.931258+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a2c8c420898543e7ada6ee73956d6487", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 13.138}
{"timestamp": "2026-05-07T14:38:22.569795+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "28d2e34047384ec29432fcf5b4b26d77", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.543}
{"timestamp": "2026-05-07T14:38:27.231079+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "9a1819f28bbf4822b0194779e914c6ed", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 15.949}
{"timestamp": "2026-05-07T14:38:31.888254+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "d277ff85f8ea48969dbfd81d04f62141", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.131}
{"timestamp": "2026-05-07T14:38:39.378962+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "4787faa491f445b78b3d4e6b1712f60f", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.865}
{"timestamp": "2026-05-07T14:38:44.083936+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "53071a1b1d3f4102880a63ba5a40caea", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.839}
{"timestamp": "2026-05-07T14:38:48.668367+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ca7b14be112743e3ae6cee86ae6dc454", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.921}
{"timestamp": "2026-05-07T14:38:53.257679+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "9c238867712e4de1b5b7fa584fdce1f9", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.951}
{"timestamp": "2026-05-07T14:38:57.860394+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "a66da214a1004e3ab460c139c67f603d", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 2.755}
{"timestamp": "2026-05-07T14:39:02.522669+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "420094589be742b7820d02ab05d89083", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.072}
{"timestamp": "2026-05-07T14:39:09.760101+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "fa4996bc65e74052ba76bfd97ea05c70", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.82}
{"timestamp": "2026-05-07T14:39:14.456964+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "eee00bd7f2e040158146367de340ab3e", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.418}
{"timestamp": "2026-05-07T14:39:19.098788+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6066a7b615e34f4abd18996778561353", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.368}
{"timestamp": "2026-05-07T14:39:23.642960+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "43bc7f10d16644c8a50a9f8f8f28a4ca", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 5.723}
{"timestamp": "2026-05-07T14:39:28.230438+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "85c23ce2b64f44588d18d25e94291d5c", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.628}
{"timestamp": "2026-05-07T14:39:32.847334+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "63a4394abfe4423ebbcd97e54b90c950", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 15.339}
{"timestamp": "2026-05-07T14:39:37.610662+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "dda2364cf564421e82bf99f61258a76d", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.038}
{"timestamp": "2026-05-07T14:39:44.990410+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "957c4b03cc7040ecb4fcce6c69d1480e", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.883}
{"timestamp": "2026-05-07T14:39:49.616952+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "06b87990410642e5aefc9b933bf665a0", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.745}
{"timestamp": "2026-05-07T14:39:54.201183+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6a889b7b7ae44f299d6b3028702f02a0", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.762}
{"timestamp": "2026-05-07T14:39:58.742903+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ad37e3467ba649b3b9729ce2d4368a34", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.508}
{"timestamp": "2026-05-07T14:40:03.428882+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "e79d171b1a074afebf6967954880b72d", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 6.129}
{"timestamp": "2026-05-07T14:40:08.085791+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "bdee5906c9a14ebcaea463ccc9cee5d7", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 4.928}
{"timestamp": "2026-05-07T14:40:15.428325+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "5b1f77c27cef42df8b19d585a0688f59", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 7.357}
{"timestamp": "2026-05-07T14:40:20.156526+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "e7988ae7267c4f7ab5deaf16c41e3ead", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 3.547}
{"timestamp": "2026-05-07T14:40:24.773310+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "6a56c32bebe345be98f273f1cc7fd8f0", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 5.408}
{"timestamp": "2026-05-07T14:40:29.397910+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "18aebc81018a4c2a8df5824f73888b30", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 14.454}
{"timestamp": "2026-05-07T14:40:34.006400+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "9cab73d247f248b195ca43123d82244d", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 6.901}
{"timestamp": "2026-05-07T14:40:38.663036+00:00", "level": "INFO", "logger": "violawake.request", "message": 
"request.complete", "request_id": "ce79466ce47e4b38ad7734d71a05b121", "method": "GET", "path": 
"/api/training/status/49", "route": "/api/training/status/{job_id}", "status_code": 200, "duration_ms": 7.434}



exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$matches = docker logs wakeword-backend-1 --since "2026-05-07T14:20:00Z" 2>&1 | Where-Object { $_ -match '"'\"/api/training/status/49\"' }; "'$objs = @($matches | ForEach-Object { $_ | ConvertFrom-Json }); "count=$($objs.Count)"; if ($objs.Count -gt 0) { "first=$($objs[0].timestamp)"; "last=$($objs[$objs.Count-1].timestamp)"; $objs | Group-Object { ([DateTimeOffset]$_.timestamp).UtcDateTime.ToString('"'HH:mm') } | ForEach-Object { \"minute="'$($_.Name) count=$($_.Count)" } }' in J:\CLAUDE\PROJECTS\Wakeword
 succeeded in 584ms:
count=179
first=2026-05-07T14:25:40.281611+00:00
last=2026-05-07T14:40:38.663036+00:00
minute=14:25 count=5
minute=14:26 count=12
minute=14:27 count=11
minute=14:28 count=12
minute=14:29 count=12
minute=14:30 count=12
minute=14:31 count=12
minute=14:32 count=12
minute=14:33 count=12
minute=14:34 count=11
minute=14:35 count=12
minute=14:36 count=12
minute=14:37 count=12
minute=14:38 count=12
minute=14:39 count=12
minute=14:40 count=8

exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command "docker logs wakeword-backend-1 --since \"2026-05-07T14:20:00Z\" 2>&1 | Select-String -Pattern 'Queued training job 49|Training job 49 failed|job_id\": 49|\"job_id\":49|Training job 49 completed|Training job 49 cancelled'" in J:\CLAUDE\PROJECTS\Wakeword
2026-05-07T16:09:30.570615Z ERROR codex_core::tools::router: error=Exit code: 1
Wall time: 1.4 seconds
Output:

{"timestamp": "2026-05-07T14:25:40.229591+00:00", "level": "INFO", "logger": "violawake.jobs", "message": "Queued 
training job 49 for user 36 (priority=0)", "request_id": "359fbf7f17b34c60bc4d13266edd7426"}
{"timestamp": "2026-05-07T15:14:49.995941+00:00", "level": "ERROR", "logger": "violawake.training", "message": 
"Training job failed", "request_id": "-", "source": "training", "error_kind": "unexpected", "error_reason": "bug", 
"error_type": "ConversionError", "error_message": "Failed to convert the exported program to an ONNX model. 
\u001b[96mThis is step 3/3\u001b[0m of exporting the model to ONNX. Next steps:\n- If there is a missing ONNX 
function, implement it and register it to the registry.\n- If there is an internal error during ONNX conversion, debug 
the error and submit a PR to PyTorch.\n- Create an error report with `torch.onnx.export(..., report=True)`, and save 
the ExportedProgram as a pt2 file. Create an issue in the PyTorch GitHub repository against the 
\u001b[96m*onnx*\u001b[0m component. Attach the error report and the pt2 model.\n\n## Exception summary\n\n<class 
'torch.onnx._internal.exporter._errors.DispatchError'>: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\u2b06\ufe0f\n<class 'torch.onnx._internal.exporter._errors.ConversionError'>: Error when 
translating node %adaptive_max_pool2d : [num_users=1] = 
call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = (%unsqueeze, [1, 1]), kwargs = {}). See the 
stack trace for more information.\n\n(Refer to the full stack trace above for more information.)", "job_id": 49, 
"wake_word": "viola_e2e_1778163936", "exception": "Traceback (most recent call last):\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 816, in _translate_fx_graph\n 
   _handle_call_function_node_with_lowering(\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 598, in 
_handle_call_function_node_with_lowering\n    raise 
_errors.DispatchError(\ntorch.onnx._internal.exporter._errors.DispatchError: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent 
call last):\n  File \"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1509, in 
export\n    onnx_program = _exported_program_to_onnx_program(\n                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n 
 File \"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1123, in 
_exported_program_to_onnx_program\n    values = _translate_fx_graph(\n             ^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 842, in _translate_fx_graph\n 
   raise _errors.ConversionError(\ntorch.onnx._internal.exporter._errors.ConversionError: Error when translating node 
%adaptive_max_pool2d : [num_users=1] = call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = 
(%unsqueeze, [1, 1]), kwargs = {}). See the stack trace for more information.\n\nThe above exception was the direct 
cause of the following exception:\n\nTraceback (most recent call last):\n  File 
\"/app/app/services/training_service.py\", line 304, in run_training_job_sync\n    _train_temporal_cnn(\n  File 
\"/usr/local/lib/python3.11/site-packages/violawake_sdk/tools/train.py\", line 1572, in _train_temporal_cnn\n    
export_temporal_onnx(model, str(output_path), seq_len=seq_len, embedding_dim=EMBEDDING_DIM)\n  File 
\"/usr/local/lib/python3.11/site-packages/violawake_sdk/training/temporal_model.py\", line 271, in 
export_temporal_onnx\n    torch.onnx.export(\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/__init__.py\", line 291, in export\n    return 
_compat.export_compat(\n           ^^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_compat.py\", line 161, in export_compat\n    
onnx_program = _core.export(\n                   ^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_flags.py\", line 27, in wrapper\n    return 
func(*args, **kwargs)\n           ^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1551, in export\n    raise 
_errors.ConversionError(\ntorch.onnx._internal.exporter._errors.ConversionError: Failed to convert the exported 
program to an ONNX model. \u001b[96mThis is step 3/3\u001b[0m of exporting the model to ONNX. Next steps:\n- If there 
is a missing ONNX function, implement it and register it to the registry.\n- If there is an internal error during ONNX 
conversion, debug the error and submit a PR to PyTorch.\n- Create an error report with `torch.onnx.export(..., 
report=True)`, and save the ExportedProgram as a pt2 file. Create an issue in the PyTorch GitHub repository against 
the \u001b[96m*onnx*\u001b[0m component. Attach the error report and the pt2 model.\n\n## Exception summary\n\n<class 
'torch.onnx._internal.exporter._errors.DispatchError'>: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\u2b06\ufe0f\n<class 'torch.onnx._internal.exporter._errors.ConversionError'>: Error when 
translating node %adaptive_max_pool2d : [num_users=1] = 
call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = (%unsqueeze, [1, 1]), kwargs = {}). See the 
stack trace for more information.\n\n(Refer to the full stack trace above for more information.)"}
{"timestamp": "2026-05-07T15:14:50.055445+00:00", "level": "ERROR", "logger": "violawake.jobs", "message": "Training 
job failed", "request_id": "-", "source": "job_queue", "error_kind": "unexpected", "error_reason": "bug", 
"error_type": "ConversionError", "error_message": "Failed to convert the exported program to an ONNX model. 
\u001b[96mThis is step 3/3\u001b[0m of exporting the model to ONNX. Next steps:\n- If there is a missing ONNX 
function, implement it and register it to the registry.\n- If there is an internal error during ONNX conversion, debug 
the error and submit a PR to PyTorch.\n- Create an error report with `torch.onnx.export(..., report=True)`, and save 
the ExportedProgram as a pt2 file. Create an issue in the PyTorch GitHub repository against the 
\u001b[96m*onnx*\u001b[0m component. Attach the error report and the pt2 model.\n\n## Exception summary\n\n<class 
'torch.onnx._internal.exporter._errors.DispatchError'>: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\u2b06\ufe0f\n<class 'torch.onnx._internal.exporter._errors.ConversionError'>: Error when 
translating node %adaptive_max_pool2d : [num_users=1] = 
call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = (%unsqueeze, [1, 1]), kwargs = {}). See the 
stack trace for more information.\n\n(Refer to the full stack trace above for more information.)", "job_id": 49, 
"exception": "Traceback (most recent call last):\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 816, in _translate_fx_graph\n 
   _handle_call_function_node_with_lowering(\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 598, in 
_handle_call_function_node_with_lowering\n    raise 
_errors.DispatchError(\ntorch.onnx._internal.exporter._errors.DispatchError: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent 
call last):\n  File \"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1509, in 
export\n    onnx_program = _exported_program_to_onnx_program(\n                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n 
 File \"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1123, in 
_exported_program_to_onnx_program\n    values = _translate_fx_graph(\n             ^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 842, in _translate_fx_graph\n 
   raise _errors.ConversionError(\ntorch.onnx._internal.exporter._errors.ConversionError: Error when translating node 
%adaptive_max_pool2d : [num_users=1] = call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = 
(%unsqueeze, [1, 1]), kwargs = {}). See the stack trace for more information.\n\nThe above exception was the direct 
cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/app/app/job_queue.py\", line 719, 
in _execute_job\n    artifact = await asyncio.to_thread(\n               ^^^^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/asyncio/threads.py\", line 25, in to_thread\n    return await loop.run_in_executor(None, 
func_call)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/concurrent/futures/thread.py\", line 58, in run\n    result = self.fn(*self.args, 
**self.kwargs)\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/app/app/services/training_service.py\", 
line 304, in run_training_job_sync\n    _train_temporal_cnn(\n  File 
\"/usr/local/lib/python3.11/site-packages/violawake_sdk/tools/train.py\", line 1572, in _train_temporal_cnn\n    
export_temporal_onnx(model, str(output_path), seq_len=seq_len, embedding_dim=EMBEDDING_DIM)\n  File 
\"/usr/local/lib/python3.11/site-packages/violawake_sdk/training/temporal_model.py\", line 271, in 
export_temporal_onnx\n    torch.onnx.export(\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/__init__.py\", line 291, in export\n    return 
_compat.export_compat(\n           ^^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_compat.py\", line 161, in export_compat\n    
onnx_program = _core.export(\n                   ^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_flags.py\", line 27, in wrapper\n    return 
func(*args, **kwargs)\n           ^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1551, in export\n    raise 
_errors.ConversionError(\ntorch.onnx._internal.exporter._errors.ConversionError: Failed to convert the exported 
program to an ONNX model. \u001b[96mThis is step 3/3\u001b[0m of exporting the model to ONNX. Next steps:\n- If there 
is a missing ONNX function, implement it and register it to the registry.\n- If there is an internal error during ONNX 
conversion, debug the error and submit a PR to PyTorch.\n- Create an error report with `torch.onnx.export(..., 
report=True)`, and save the ExportedProgram as a pt2 file. Create an issue in the PyTorch GitHub repository against 
the \u001b[96m*onnx*\u001b[0m component. Attach the error report and the pt2 model.\n\n## Exception summary\n\n<class 
'torch.onnx._internal.exporter._errors.DispatchError'>: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\u2b06\ufe0f\n<class 'torch.onnx._internal.exporter._errors.ConversionError'>: Error when 
translating node %adaptive_max_pool2d : [num_users=1] = 
call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = (%unsqueeze, [1, 1]), kwargs = {}). See the 
stack trace for more information.\n\n(Refer to the full stack trace above for more information.)"}



 exited 1 in 1407ms:

{"timestamp": "2026-05-07T14:25:40.229591+00:00", "level": "INFO", "logger": "violawake.jobs", "message": "Queued 
training job 49 for user 36 (priority=0)", "request_id": "359fbf7f17b34c60bc4d13266edd7426"}
{"timestamp": "2026-05-07T15:14:49.995941+00:00", "level": "ERROR", "logger": "violawake.training", "message": 
"Training job failed", "request_id": "-", "source": "training", "error_kind": "unexpected", "error_reason": "bug", 
"error_type": "ConversionError", "error_message": "Failed to convert the exported program to an ONNX model. 
\u001b[96mThis is step 3/3\u001b[0m of exporting the model to ONNX. Next steps:\n- If there is a missing ONNX 
function, implement it and register it to the registry.\n- If there is an internal error during ONNX conversion, debug 
the error and submit a PR to PyTorch.\n- Create an error report with `torch.onnx.export(..., report=True)`, and save 
the ExportedProgram as a pt2 file. Create an issue in the PyTorch GitHub repository against the 
\u001b[96m*onnx*\u001b[0m component. Attach the error report and the pt2 model.\n\n## Exception summary\n\n<class 
'torch.onnx._internal.exporter._errors.DispatchError'>: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\u2b06\ufe0f\n<class 'torch.onnx._internal.exporter._errors.ConversionError'>: Error when 
translating node %adaptive_max_pool2d : [num_users=1] = 
call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = (%unsqueeze, [1, 1]), kwargs = {}). See the 
stack trace for more information.\n\n(Refer to the full stack trace above for more information.)", "job_id": 49, 
"wake_word": "viola_e2e_1778163936", "exception": "Traceback (most recent call last):\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 816, in _translate_fx_graph\n 
   _handle_call_function_node_with_lowering(\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 598, in 
_handle_call_function_node_with_lowering\n    raise 
_errors.DispatchError(\ntorch.onnx._internal.exporter._errors.DispatchError: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent 
call last):\n  File \"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1509, in 
export\n    onnx_program = _exported_program_to_onnx_program(\n                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n 
 File \"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1123, in 
_exported_program_to_onnx_program\n    values = _translate_fx_graph(\n             ^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 842, in _translate_fx_graph\n 
   raise _errors.ConversionError(\ntorch.onnx._internal.exporter._errors.ConversionError: Error when translating node 
%adaptive_max_pool2d : [num_users=1] = call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = 
(%unsqueeze, [1, 1]), kwargs = {}). See the stack trace for more information.\n\nThe above exception was the direct 
cause of the following exception:\n\nTraceback (most recent call last):\n  File 
\"/app/app/services/training_service.py\", line 304, in run_training_job_sync\n    _train_temporal_cnn(\n  File 
\"/usr/local/lib/python3.11/site-packages/violawake_sdk/tools/train.py\", line 1572, in _train_temporal_cnn\n    
export_temporal_onnx(model, str(output_path), seq_len=seq_len, embedding_dim=EMBEDDING_DIM)\n  File 
\"/usr/local/lib/python3.11/site-packages/violawake_sdk/training/temporal_model.py\", line 271, in 
export_temporal_onnx\n    torch.onnx.export(\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/__init__.py\", line 291, in export\n    return 
_compat.export_compat(\n           ^^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_compat.py\", line 161, in export_compat\n    
onnx_program = _core.export(\n                   ^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_flags.py\", line 27, in wrapper\n    return 
func(*args, **kwargs)\n           ^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1551, in export\n    raise 
_errors.ConversionError(\ntorch.onnx._internal.exporter._errors.ConversionError: Failed to convert the exported 
program to an ONNX model. \u001b[96mThis is step 3/3\u001b[0m of exporting the model to ONNX. Next steps:\n- If there 
is a missing ONNX function, implement it and register it to the registry.\n- If there is an internal error during ONNX 
conversion, debug the error and submit a PR to PyTorch.\n- Create an error report with `torch.onnx.export(..., 
report=True)`, and save the ExportedProgram as a pt2 file. Create an issue in the PyTorch GitHub repository against 
the \u001b[96m*onnx*\u001b[0m component. Attach the error report and the pt2 model.\n\n## Exception summary\n\n<class 
'torch.onnx._internal.exporter._errors.DispatchError'>: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\u2b06\ufe0f\n<class 'torch.onnx._internal.exporter._errors.ConversionError'>: Error when 
translating node %adaptive_max_pool2d : [num_users=1] = 
call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = (%unsqueeze, [1, 1]), kwargs = {}). See the 
stack trace for more information.\n\n(Refer to the full stack trace above for more information.)"}
{"timestamp": "2026-05-07T15:14:50.055445+00:00", "level": "ERROR", "logger": "violawake.jobs", "message": "Training 
job failed", "request_id": "-", "source": "job_queue", "error_kind": "unexpected", "error_reason": "bug", 
"error_type": "ConversionError", "error_message": "Failed to convert the exported program to an ONNX model. 
\u001b[96mThis is step 3/3\u001b[0m of exporting the model to ONNX. Next steps:\n- If there is a missing ONNX 
function, implement it and register it to the registry.\n- If there is an internal error during ONNX conversion, debug 
the error and submit a PR to PyTorch.\n- Create an error report with `torch.onnx.export(..., report=True)`, and save 
the ExportedProgram as a pt2 file. Create an issue in the PyTorch GitHub repository against the 
\u001b[96m*onnx*\u001b[0m component. Attach the error report and the pt2 model.\n\n## Exception summary\n\n<class 
'torch.onnx._internal.exporter._errors.DispatchError'>: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\u2b06\ufe0f\n<class 'torch.onnx._internal.exporter._errors.ConversionError'>: Error when 
translating node %adaptive_max_pool2d : [num_users=1] = 
call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = (%unsqueeze, [1, 1]), kwargs = {}). See the 
stack trace for more information.\n\n(Refer to the full stack trace above for more information.)", "job_id": 49, 
"exception": "Traceback (most recent call last):\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 816, in _translate_fx_graph\n 
   _handle_call_function_node_with_lowering(\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 598, in 
_handle_call_function_node_with_lowering\n    raise 
_errors.DispatchError(\ntorch.onnx._internal.exporter._errors.DispatchError: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent 
call last):\n  File \"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1509, in 
export\n    onnx_program = _exported_program_to_onnx_program(\n                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n 
 File \"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1123, in 
_exported_program_to_onnx_program\n    values = _translate_fx_graph(\n             ^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 842, in _translate_fx_graph\n 
   raise _errors.ConversionError(\ntorch.onnx._internal.exporter._errors.ConversionError: Error when translating node 
%adaptive_max_pool2d : [num_users=1] = call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = 
(%unsqueeze, [1, 1]), kwargs = {}). See the stack trace for more information.\n\nThe above exception was the direct 
cause of the following exception:\n\nTraceback (most recent call last):\n  File \"/app/app/job_queue.py\", line 719, 
in _execute_job\n    artifact = await asyncio.to_thread(\n               ^^^^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/asyncio/threads.py\", line 25, in to_thread\n    return await loop.run_in_executor(None, 
func_call)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/concurrent/futures/thread.py\", line 58, in run\n    result = self.fn(*self.args, 
**self.kwargs)\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/app/app/services/training_service.py\", 
line 304, in run_training_job_sync\n    _train_temporal_cnn(\n  File 
\"/usr/local/lib/python3.11/site-packages/violawake_sdk/tools/train.py\", line 1572, in _train_temporal_cnn\n    
export_temporal_onnx(model, str(output_path), seq_len=seq_len, embedding_dim=EMBEDDING_DIM)\n  File 
\"/usr/local/lib/python3.11/site-packages/violawake_sdk/training/temporal_model.py\", line 271, in 
export_temporal_onnx\n    torch.onnx.export(\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/__init__.py\", line 291, in export\n    return 
_compat.export_compat(\n           ^^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_compat.py\", line 161, in export_compat\n    
onnx_program = _core.export(\n                   ^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_flags.py\", line 27, in wrapper\n    return 
func(*args, **kwargs)\n           ^^^^^^^^^^^^^^^^^^^^^\n  File 
\"/usr/local/lib/python3.11/site-packages/torch/onnx/_internal/exporter/_core.py\", line 1551, in export\n    raise 
_errors.ConversionError(\ntorch.onnx._internal.exporter._errors.ConversionError: Failed to convert the exported 
program to an ONNX model. \u001b[96mThis is step 3/3\u001b[0m of exporting the model to ONNX. Next steps:\n- If there 
is a missing ONNX function, implement it and register it to the registry.\n- If there is an internal error during ONNX 
conversion, debug the error and submit a PR to PyTorch.\n- Create an error report with `torch.onnx.export(..., 
report=True)`, and save the ExportedProgram as a pt2 file. Create an issue in the PyTorch GitHub repository against 
the \u001b[96m*onnx*\u001b[0m component. Attach the error report and the pt2 model.\n\n## Exception summary\n\n<class 
'torch.onnx._internal.exporter._errors.DispatchError'>: No ONNX function found for 
<OpOverload(op='aten.adaptive_max_pool2d', overload='default')>. Failure message: No decompositions registered for the 
real-valued input\n\u2b06\ufe0f\n<class 'torch.onnx._internal.exporter._errors.ConversionError'>: Error when 
translating node %adaptive_max_pool2d : [num_users=1] = 
call_function[target=torch.ops.aten.adaptive_max_pool2d.default](args = (%unsqueeze, [1, 1]), kwargs = {}). See the 
stack trace for more information.\n\n(Refer to the full stack trace above for more information.)"}



exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command "docker exec wakeword-postgres-1 psql -U violawake -d violawake -c \"SELECT 'users' AS table, count(*) FROM users UNION ALL SELECT 'recordings', count(*) FROM recordings UNION ALL SELECT 'training_jobs', count(*) FROM training_jobs UNION ALL SELECT 'trained_models', count(*) FROM trained_models UNION ALL SELECT 'usage_records', count(*) FROM usage_records UNION ALL SELECT 'subscriptions', count(*) FROM subscriptions ORDER BY table;\"" in J:\CLAUDE\PROJECTS\Wakeword
2026-05-07T16:09:40.304867Z ERROR codex_core::tools::router: error=Exit code: 1
Wall time: 0.4 seconds
Output:
ERROR:  syntax error at or near "table"
LINE 1: ...'subscriptions', count(*) FROM subscriptions ORDER BY table;
                                                                 ^

 exited 1 in 392ms:
ERROR:  syntax error at or near "table"
LINE 1: ...'subscriptions', count(*) FROM subscriptions ORDER BY table;
                                                                 ^

exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command "docker exec wakeword-postgres-1 psql -U violawake -d violawake -c \"SELECT 'users' AS table_name, count(*) FROM users UNION ALL SELECT 'recordings', count(*) FROM recordings UNION ALL SELECT 'training_jobs', count(*) FROM training_jobs UNION ALL SELECT 'trained_models', count(*) FROM trained_models UNION ALL SELECT 'usage_records', count(*) FROM usage_records UNION ALL SELECT 'subscriptions', count(*) FROM subscriptions ORDER BY table_name;\"" in J:\CLAUDE\PROJECTS\Wakeword
 succeeded in 420ms:
   table_name   | count 
----------------+-------
 recordings     |   270
 subscriptions  |    17
 trained_models |     0
 training_jobs  |     0
 usage_records  |    15
 users          |    36
(6 rows)


exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command "docker exec wakeword-backend-1 python -c \"import sqlite3; c=sqlite3.connect('/app/data/job_queue.db'); c.row_factory=sqlite3.Row; rows=c.execute('SELECT id,user_id,wake_word,status,progress_pct,created_at,started_at,completed_at,substr(error,1,90) AS error_prefix FROM jobs ORDER BY id DESC LIMIT 5').fetchall(); [print(dict(r)) for r in rows]\"" in J:\CLAUDE\PROJECTS\Wakeword
 succeeded in 519ms:
{'id': 49, 'user_id': 36, 'wake_word': 'viola_e2e_1778163936', 'status': 'failed', 'progress_pct': 67.38, 'created_at': '2026-05-07T14:25:40.207868+00:00', 'started_at': '2026-05-07T14:46:41.807761+00:00', 'completed_at': '2026-05-07T15:14:50.022310+00:00', 'error_prefix': 'Failed to convert the exported program to an ONNX model. \x1b[96mThis is step 3/3\x1b[0m of expo'}
{'id': 48, 'user_id': 35, 'wake_word': 'viola_e2e_1778162842', 'status': 'cancelled', 'progress_pct': 8.0, 'created_at': '2026-05-07T14:07:25.666739+00:00', 'started_at': '2026-05-07T14:24:18.559165+00:00', 'completed_at': None, 'error_prefix': None}
{'id': 47, 'user_id': 34, 'wake_word': 'viola_e2e_1778161616', 'status': 'cancelled', 'progress_pct': 0.0, 'created_at': '2026-05-07T13:47:00.407168+00:00', 'started_at': None, 'completed_at': None, 'error_prefix': None}
{'id': 46, 'user_id': 33, 'wake_word': 'viola_e2e_1778159462', 'status': 'cancelled', 'progress_pct': 0.0, 'created_at': '2026-05-07T13:11:06.570616+00:00', 'started_at': None, 'completed_at': None, 'error_prefix': None}
{'id': 45, 'user_id': 32, 'wake_word': 'viola_e2e_1778157681', 'status': 'cancelled', 'progress_pct': 0.0, 'created_at': '2026-05-07T12:41:25.009687+00:00', 'started_at': None, 'completed_at': None, 'error_prefix': None}

  ✓ Locate status endpoint and relevant backend files
  ✓ Trace write paths for SQLite and Postgres job state
  ✓ Audit Alembic migrations and model mappings
  ✓ Query live Postgres and SQLite schema
  ✓ Check git history since 54f20b4
  → Synthesize source-of-truth verdict
exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command 'git status --short' in J:\CLAUDE\PROJECTS\Wakeword
 succeeded in 240ms:
 M console/backend/requirements.txt
?? .codex_inv1.txt
?? .codex_inv2.txt
?? .codex_inv3.txt
?? .codex_log_a.txt
?? .codex_log_alpha.txt
?? .codex_log_b.txt
?? .codex_log_c.txt
?? .codex_log_corpus.txt
?? .codex_log_delta.txt
?? .codex_log_inv1.txt
?? .codex_log_inv2.txt
?? .codex_log_inv3.txt
?? .codex_prompt_a.txt
?? .codex_prompt_alpha.txt
?? .codex_prompt_b.txt
?? .codex_prompt_c.txt
?? .codex_prompt_corpus.txt
?? .codex_prompt_delta.txt

exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command '$i=0; Get-Content '"'C:\\Users\\jihad\\.codex\\skills\\code-nav\\SKILL.md' | ForEach-Object { "'$i++; if ($i -le 13) { '"'{0,4}: {1}' -f "'$i, $_ } }' in J:\CLAUDE\PROJECTS\Wakeword
 succeeded in 2116ms:
   1: ---
   2: name: code-nav
   3: description: Fast symbol lookup with `tools/code_nav.py`. Use before broad `rg` or file reads when you need definitions, references, callers, or file structure.
   4: ---
   5: 
   6: # Code Navigation
   7: 
   8: Use this skill from the NOVVIOLA repo root.
   9: 
  10: ## Workflow
  11: 
  12: 1. Resolve a definition before broad search:
  13:    `python tools/code_nav.py definition <symbol>`

exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command "docker exec wakeword-backend-1 python -c \"import sqlite3; c=sqlite3.connect('/app/data/job_queue.db'); print(list(c.execute('SELECT status, COUNT(*), SUM(CASE WHEN model_id IS NOT NULL THEN 1 ELSE 0 END) FROM jobs GROUP BY status ORDER BY status'))); print('completed_model_ids', list(c.execute('SELECT id, model_id, d_prime, created_at, completed_at FROM jobs WHERE status=\\'completed\\' ORDER BY id LIMIT 20')))\"" in J:\CLAUDE\PROJECTS\Wakeword
 succeeded in 360ms:
[('cancelled', 7, 0), ('completed', 17, 17), ('failed', 25, 0)]
completed_model_ids [(16, 15, None, '2026-03-28T20:55:53.078831+00:00', '2026-03-28T23:17:05.466411+00:00'), (17, 13, None, '2026-03-28T20:56:15.118412+00:00', '2026-03-28T23:17:05.373959+00:00'), (19, 17, None, '2026-03-28T21:25:34.018595+00:00', '2026-03-28T23:17:20.904154+00:00'), (20, 16, None, '2026-03-28T21:26:00.088880+00:00', '2026-03-28T23:17:20.821948+00:00'), (21, 19, None, '2026-03-28T21:26:03.771233+00:00', '2026-03-28T23:17:21.136832+00:00'), (22, 18, None, '2026-03-28T21:28:33.083002+00:00', '2026-03-28T23:17:20.934164+00:00'), (23, 21, None, '2026-03-28T21:29:06.687568+00:00', '2026-03-28T23:17:36.976447+00:00'), (24, 20, None, '2026-03-28T21:31:38.974285+00:00', '2026-03-28T23:17:36.786008+00:00'), (25, 22, None, '2026-03-28T21:32:06.428065+00:00', '2026-03-28T23:17:37.240602+00:00'), (26, 23, None, '2026-03-28T21:36:28.711133+00:00', '2026-03-28T23:17:37.594875+00:00'), (27, 25, None, '2026-03-28T21:36:57.619347+00:00', '2026-03-28T23:17:53.117919+00:00'), (28, 24, None, '2026-03-28T21:37:55.244961+00:00', '2026-03-28T23:17:52.692051+00:00'), (29, 26, None, '2026-03-28T21:38:32.366321+00:00', '2026-03-28T23:17:53.181430+00:00'), (30, 27, None, '2026-03-28T21:55:41.693683+00:00', '2026-03-28T23:17:53.502608+00:00'), (31, 28, None, '2026-03-28T21:56:04.099932+00:00', '2026-03-28T23:18:06.770173+00:00'), (32, 29, None, '2026-03-29T00:03:12.563620+00:00', '2026-03-29T00:03:28.603074+00:00'), (34, 30, None, '2026-03-29T22:51:43.678962+00:00', '2026-03-29T22:51:58.191290+00:00')]

exec
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -Command "docker exec wakeword-postgres-1 psql -U violawake -d violawake -c \"SELECT 'training_jobs_id_seq' AS seq, last_value, is_called FROM training_jobs_id_seq UNION ALL SELECT 'trained_models_id_seq', last_value, is_called FROM trained_models_id_seq UNION ALL SELECT 'users_id_seq', last_value, is_called FROM users_id_seq;\"" in J:\CLAUDE\PROJECTS\Wakeword
 succeeded in 896ms:
          seq          | last_value | is_called 
-----------------------+------------+-----------
 training_jobs_id_seq  |          1 | f
 trained_models_id_seq |          1 | f
 users_id_seq          |         37 | t
(3 rows)


codex
**Verdict**

`/api/training/status/{id}` uses SQLite `/app/data/job_queue.db`, not Postgres `training_jobs`. In [training.py](J:/CLAUDE/PROJECTS/Wakeword/console/backend/app/routes/training.py:55), the endpoint calls `get_owned_job_or_404`; in [routes/jobs.py](J:/CLAUDE/PROJECTS/Wakeword/console/backend/app/routes/jobs.py:123), that calls `JobQueue.get_job`; in [job_queue.py](J:/CLAUDE/PROJECTS/Wakeword/console/backend/app/job_queue.py:352), `get_job` runs `SELECT * FROM jobs WHERE id = ?` against the aiosqlite queue DB at `settings.data_dir / "job_queue.db"`.

Postgres `training_jobs` is empty because the current queue path never populates it. `submit_job` inserts into SQLite `jobs`, progress/failure updates update SQLite `jobs`, and successful completion only creates a Postgres `TrainedModel` row, not a `TrainingJob` row. `training_service.run_training_job_sync` does not write Postgres at all; it only emits callbacks and returns an artifact. The live Postgres sequence confirms this: `training_jobs_id_seq` and `trained_models_id_seq` both have `last_value=1, is_called=false`, so this Postgres instance has never inserted either table. No Alembic upgrade migration drops/truncates/wipes `training_jobs`; it is only created in the initial migration, and drops appear only in downgrades.

Live DB checks:
`trained_models = 0`, `training_jobs = 0`, Alembic head is `d4e5f6a7b8c9`, and Postgres has the expected 10 tables. SQLite `jobs` has `49` rows: `17 completed`, `25 failed`, `7 cancelled`. Job `49` is `failed`, `progress_pct=67.38`, created `2026-05-07T14:25:40Z`, started `14:46:41Z`, failed `15:14:50Z`, with the ONNX `adaptive_max_pool2d` conversion error.

The “queued progress=0.0 for 15 minutes” part is explained by timing, not Postgres fallback. Backend logs show `179` polls of `/api/training/status/49`, first at `14:25:40Z` and last at `14:40:38Z`. That was before the job started at `14:46:41Z` and long before it failed at `15:14:50Z`. So during those polls, SQLite really would have returned pending, which the legacy API maps to `queued`.

Real situation: job status source of truth is the SQLite queue DB; Postgres `training_jobs` is a dead/legacy ORM table in the current training path. The two-DB architecture is a real inconsistency risk and is already documented in `docs/TRAINING_PIPELINE_AUDIT_2026-05-07.md`, but the specific job 49 “queued while failed” observation is not caused by the API reading empty Postgres. The poller stopped before SQLite recorded the failure; after `15:14:50Z`, the current endpoint should return `failed` for job 49.

I made no file changes. `git status` still shows the pre-existing dirty state: modified `console/backend/requirements.txt` plus the existing untracked `.codex_*` files.


SUCCESS: The process with PID 73648 (child process of PID 66188) has been terminated.
SUCCESS: The process with PID 66188 (child process of PID 74228) has been terminated.
tokens used
123,586
**Verdict**

`/api/training/status/{id}` uses SQLite `/app/data/job_queue.db`, not Postgres `training_jobs`. In [training.py](J:/CLAUDE/PROJECTS/Wakeword/console/backend/app/routes/training.py:55), the endpoint calls `get_owned_job_or_404`; in [routes/jobs.py](J:/CLAUDE/PROJECTS/Wakeword/console/backend/app/routes/jobs.py:123), that calls `JobQueue.get_job`; in [job_queue.py](J:/CLAUDE/PROJECTS/Wakeword/console/backend/app/job_queue.py:352), `get_job` runs `SELECT * FROM jobs WHERE id = ?` against the aiosqlite queue DB at `settings.data_dir / "job_queue.db"`.

Postgres `training_jobs` is empty because the current queue path never populates it. `submit_job` inserts into SQLite `jobs`, progress/failure updates update SQLite `jobs`, and successful completion only creates a Postgres `TrainedModel` row, not a `TrainingJob` row. `training_service.run_training_job_sync` does not write Postgres at all; it only emits callbacks and returns an artifact. The live Postgres sequence confirms this: `training_jobs_id_seq` and `trained_models_id_seq` both have `last_value=1, is_called=false`, so this Postgres instance has never inserted either table. No Alembic upgrade migration drops/truncates/wipes `training_jobs`; it is only created in the initial migration, and drops appear only in downgrades.

Live DB checks:
`trained_models = 0`, `training_jobs = 0`, Alembic head is `d4e5f6a7b8c9`, and Postgres has the expected 10 tables. SQLite `jobs` has `49` rows: `17 completed`, `25 failed`, `7 cancelled`. Job `49` is `failed`, `progress_pct=67.38`, created `2026-05-07T14:25:40Z`, started `14:46:41Z`, failed `15:14:50Z`, with the ONNX `adaptive_max_pool2d` conversion error.

The “queued progress=0.0 for 15 minutes” part is explained by timing, not Postgres fallback. Backend logs show `179` polls of `/api/training/status/49`, first at `14:25:40Z` and last at `14:40:38Z`. That was before the job started at `14:46:41Z` and long before it failed at `15:14:50Z`. So during those polls, SQLite really would have returned pending, which the legacy API maps to `queued`.

Real situation: job status source of truth is the SQLite queue DB; Postgres `training_jobs` is a dead/legacy ORM table in the current training path. The two-DB architecture is a real inconsistency risk and is already documented in `docs/TRAINING_PIPELINE_AUDIT_2026-05-07.md`, but the specific job 49 “queued while failed” observation is not caused by the API reading empty Postgres. The poller stopped before SQLite recorded the failure; after `15:14:50Z`, the current endpoint should return `failed` for job 49.

I made no file changes. `git status` still shows the pre-existing dirty state: modified `console/backend/requirements.txt` plus the existing untracked `.codex_*` files.


