From f1541701fb79938a008180891958e26b6e0e7afe Mon Sep 17 00:00:00 2001 From: Jamie Pine Date: Mon, 16 Mar 2026 22:44:28 -0700 Subject: [PATCH 1/9] add model selection and expanded language support to /transcribe endpoint Closes #233 --- app/src/lib/api/client.ts | 10 +++++++++- app/src/lib/api/types.ts | 3 +++ app/src/lib/hooks/useTranscription.ts | 12 ++++++++++-- backend/backends/__init__.py | 1 + backend/backends/mlx_backend.py | 6 ++++-- backend/backends/pytorch_backend.py | 6 ++++-- backend/models.py | 3 ++- backend/routes/transcription.py | 16 +++++++++++++--- 8 files changed, 46 insertions(+), 11 deletions(-) diff --git a/app/src/lib/api/client.ts b/app/src/lib/api/client.ts index c6691ab5..036af3df 100644 --- a/app/src/lib/api/client.ts +++ b/app/src/lib/api/client.ts @@ -32,6 +32,7 @@ import type { TranscriptionResponse, VoiceProfileCreate, VoiceProfileResponse, + WhisperModelSize, } from './types'; class ApiClient { @@ -318,12 +319,19 @@ class ApiClient { } // Transcription - async transcribeAudio(file: File, language?: LanguageCode): Promise { + async transcribeAudio( + file: File, + language?: LanguageCode, + model?: WhisperModelSize, + ): Promise { const formData = new FormData(); formData.append('file', file); if (language) { formData.append('language', language); } + if (model) { + formData.append('model', model); + } const url = `${this.getBaseUrl()}/transcribe`; const response = await fetch(url, { diff --git a/app/src/lib/api/types.ts b/app/src/lib/api/types.ts index 49e90918..daae2a95 100644 --- a/app/src/lib/api/types.ts +++ b/app/src/lib/api/types.ts @@ -99,8 +99,11 @@ export interface HistoryListResponse { total: number; } +export type WhisperModelSize = 'base' | 'small' | 'medium' | 'large' | 'turbo'; + export interface TranscriptionRequest { language?: LanguageCode; + model?: WhisperModelSize; } export interface TranscriptionResponse { diff --git a/app/src/lib/hooks/useTranscription.ts b/app/src/lib/hooks/useTranscription.ts index 0b80722f..641b02df 100644 --- a/app/src/lib/hooks/useTranscription.ts +++ b/app/src/lib/hooks/useTranscription.ts @@ -1,10 +1,18 @@ import { useMutation } from '@tanstack/react-query'; import { apiClient } from '@/lib/api/client'; +import type { WhisperModelSize } from '@/lib/api/types'; import type { LanguageCode } from '@/lib/constants/languages'; export function useTranscription() { return useMutation({ - mutationFn: ({ file, language }: { file: File; language?: LanguageCode }) => - apiClient.transcribeAudio(file, language), + mutationFn: ({ + file, + language, + model, + }: { + file: File; + language?: LanguageCode; + model?: WhisperModelSize; + }) => apiClient.transcribeAudio(file, language, model), }); } diff --git a/backend/backends/__init__.py b/backend/backends/__init__.py index cc35eabe..6f20f3de 100644 --- a/backend/backends/__init__.py +++ b/backend/backends/__init__.py @@ -134,6 +134,7 @@ async def transcribe( self, audio_path: str, language: Optional[str] = None, + model_size: Optional[str] = None, ) -> str: """ Transcribe audio to text. diff --git a/backend/backends/mlx_backend.py b/backend/backends/mlx_backend.py index e4a1ea97..92405dbf 100644 --- a/backend/backends/mlx_backend.py +++ b/backend/backends/mlx_backend.py @@ -345,18 +345,20 @@ async def transcribe( self, audio_path: str, language: Optional[str] = None, + model_size: Optional[str] = None, ) -> str: """ Transcribe audio to text. Args: audio_path: Path to audio file - language: Optional language hint (en or zh) + language: Optional language hint + model_size: Optional model size override Returns: Transcribed text """ - await self.load_model_async(None) + await self.load_model_async(model_size) def _transcribe_sync(): """Run synchronous transcription in thread pool.""" diff --git a/backend/backends/pytorch_backend.py b/backend/backends/pytorch_backend.py index 8f4a7a58..8ed4ab9c 100644 --- a/backend/backends/pytorch_backend.py +++ b/backend/backends/pytorch_backend.py @@ -306,18 +306,20 @@ async def transcribe( self, audio_path: str, language: Optional[str] = None, + model_size: Optional[str] = None, ) -> str: """ Transcribe audio to text. Args: audio_path: Path to audio file - language: Optional language hint (en or zh) + language: Optional language hint + model_size: Optional model size override Returns: Transcribed text """ - await self.load_model_async(None) + await self.load_model_async(model_size) def _transcribe_sync(): """Run synchronous transcription in thread pool.""" diff --git a/backend/models.py b/backend/models.py index ef8e196d..3308b3bc 100644 --- a/backend/models.py +++ b/backend/models.py @@ -149,7 +149,8 @@ class HistoryListResponse(BaseModel): class TranscriptionRequest(BaseModel): """Request model for audio transcription.""" - language: Optional[str] = Field(None, pattern="^(en|zh)$") + language: Optional[str] = Field(None, pattern="^(en|zh|ja|ko|de|fr|ru|pt|es|it)$") + model: Optional[str] = Field(None, pattern="^(base|small|medium|large|turbo)$") class TranscriptionResponse(BaseModel): diff --git a/backend/routes/transcription.py b/backend/routes/transcription.py index 90cb1c95..dc949132 100644 --- a/backend/routes/transcription.py +++ b/backend/routes/transcription.py @@ -20,6 +20,7 @@ async def transcribe_audio( file: UploadFile = File(...), language: str | None = Form(None), + model: str | None = Form(None), ): """Transcribe audio file to text.""" with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as tmp: @@ -29,14 +30,23 @@ async def transcribe_audio( try: from ..utils.audio import load_audio + from ..backends import WHISPER_HF_REPOS audio, sr = await asyncio.to_thread(load_audio, tmp_path) duration = len(audio) / sr whisper_model = transcribe.get_whisper_model() - model_size = whisper_model.model_size + model_size = model if model else whisper_model.model_size - if not whisper_model.is_loaded() and not whisper_model._is_model_cached(model_size): + valid_sizes = list(WHISPER_HF_REPOS.keys()) + if model_size not in valid_sizes: + raise HTTPException( + status_code=400, + detail=f"Invalid model size '{model_size}'. Must be one of: {', '.join(valid_sizes)}", + ) + + already_loaded = whisper_model.is_loaded() and whisper_model.model_size == model_size + if not already_loaded and not whisper_model._is_model_cached(model_size): progress_model_name = f"whisper-{model_size}" task_manager = get_task_manager() @@ -59,7 +69,7 @@ async def download_whisper_background(): }, ) - text = await whisper_model.transcribe(tmp_path, language) + text = await whisper_model.transcribe(tmp_path, language, model_size) return models.TranscriptionResponse( text=text, From 664178f0cfd50990844bf6eddd6af6a96d1337d5 Mon Sep 17 00:00:00 2001 From: Jamie Pine Date: Mon, 16 Mar 2026 22:47:01 -0700 Subject: [PATCH 2/9] fix error detail serialization producing [object Object] in error messages Closes #290 --- app/src/lib/api/client.ts | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/app/src/lib/api/client.ts b/app/src/lib/api/client.ts index 036af3df..98f98182 100644 --- a/app/src/lib/api/client.ts +++ b/app/src/lib/api/client.ts @@ -35,6 +35,21 @@ import type { WhisperModelSize, } from './types'; +function formatErrorDetail(detail: unknown, fallback: string): string { + if (typeof detail === 'string') return detail; + if (Array.isArray(detail)) { + return detail + .map((e: Record) => e.msg || e.message || JSON.stringify(e)) + .join('; '); + } + if (detail && typeof detail === 'object') { + const obj = detail as Record; + if (typeof obj.message === 'string') return obj.message; + return JSON.stringify(detail); + } + return fallback; +} + class ApiClient { private getBaseUrl(): string { const serverUrl = useServerStore.getState().serverUrl; @@ -55,7 +70,7 @@ class ApiClient { const error = await response.json().catch(() => ({ detail: response.statusText, })); - throw new Error(error.detail || `HTTP error! status: ${response.status}`); + throw new Error(formatErrorDetail(error.detail, `HTTP error! status: ${response.status}`)); } return response.json(); @@ -114,7 +129,7 @@ class ApiClient { const error = await response.json().catch(() => ({ detail: response.statusText, })); - throw new Error(error.detail || `HTTP error! status: ${response.status}`); + throw new Error(formatErrorDetail(error.detail, `HTTP error! status: ${response.status}`)); } return response.json(); @@ -148,7 +163,7 @@ class ApiClient { const error = await response.json().catch(() => ({ detail: response.statusText, })); - throw new Error(error.detail || `HTTP error! status: ${response.status}`); + throw new Error(formatErrorDetail(error.detail, `HTTP error! status: ${response.status}`)); } return response.blob(); @@ -168,7 +183,7 @@ class ApiClient { const error = await response.json().catch(() => ({ detail: response.statusText, })); - throw new Error(error.detail || `HTTP error! status: ${response.status}`); + throw new Error(formatErrorDetail(error.detail, `HTTP error! status: ${response.status}`)); } return response.json(); @@ -188,7 +203,7 @@ class ApiClient { const error = await response.json().catch(() => ({ detail: response.statusText, })); - throw new Error(error.detail || `HTTP error! status: ${response.status}`); + throw new Error(formatErrorDetail(error.detail, `HTTP error! status: ${response.status}`)); } return response.json(); @@ -258,7 +273,7 @@ class ApiClient { const error = await response.json().catch(() => ({ detail: response.statusText, })); - throw new Error(error.detail || `HTTP error! status: ${response.status}`); + throw new Error(formatErrorDetail(error.detail, `HTTP error! status: ${response.status}`)); } return response.blob(); @@ -272,7 +287,7 @@ class ApiClient { const error = await response.json().catch(() => ({ detail: response.statusText, })); - throw new Error(error.detail || `HTTP error! status: ${response.status}`); + throw new Error(formatErrorDetail(error.detail, `HTTP error! status: ${response.status}`)); } return response.blob(); @@ -298,7 +313,7 @@ class ApiClient { const error = await response.json().catch(() => ({ detail: response.statusText, })); - throw new Error(error.detail || `HTTP error! status: ${response.status}`); + throw new Error(formatErrorDetail(error.detail, `HTTP error! status: ${response.status}`)); } return response.json(); @@ -343,7 +358,7 @@ class ApiClient { const error = await response.json().catch(() => ({ detail: response.statusText, })); - throw new Error(error.detail || `HTTP error! status: ${response.status}`); + throw new Error(formatErrorDetail(error.detail, `HTTP error! status: ${response.status}`)); } return response.json(); @@ -616,7 +631,7 @@ class ApiClient { const error = await response.json().catch(() => ({ detail: response.statusText, })); - throw new Error(error.detail || `HTTP error! status: ${response.status}`); + throw new Error(formatErrorDetail(error.detail, `HTTP error! status: ${response.status}`)); } return response.blob(); @@ -713,7 +728,7 @@ class ApiClient { const error = await response.json().catch(() => ({ detail: response.statusText, })); - throw new Error(error.detail || `HTTP error! status: ${response.status}`); + throw new Error(formatErrorDetail(error.detail, `HTTP error! status: ${response.status}`)); } return response.blob(); From 606da1c8940795921a7cb9a447eedc5762d8a23e Mon Sep 17 00:00:00 2001 From: Jamie Pine Date: Mon, 16 Mar 2026 22:54:11 -0700 Subject: [PATCH 3/9] fix generation list not updating on completion Use refetchQueries instead of invalidateQueries for more reliable history refresh. Add history refetch to SSE onerror handler so dropped connections don't leave the list stale. Reset page to 0 in HistoryTable when a pending generation completes. Closes #231 --- app/src/components/History/HistoryTable.tsx | 17 ++++++++++++++++- app/src/lib/hooks/useGenerationProgress.ts | 11 ++++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/app/src/components/History/HistoryTable.tsx b/app/src/components/History/HistoryTable.tsx index 65f201d7..e88c7701 100644 --- a/app/src/components/History/HistoryTable.tsx +++ b/app/src/components/History/HistoryTable.tsx @@ -153,7 +153,9 @@ export function HistoryTable() { } }, [historyData, page]); - // Reset to page 0 when deletions or imports occur + // Reset to page 0 when deletions, imports, or generation completions occur + const pendingCount = useGenerationStore((state) => state.pendingGenerationIds.size); + const prevPendingCountRef = useRef(pendingCount); useEffect(() => { if (deleteGeneration.isSuccess || importGeneration.isSuccess) { setPage(0); @@ -161,6 +163,19 @@ export function HistoryTable() { } }, [deleteGeneration.isSuccess, importGeneration.isSuccess]); + useEffect(() => { + // A generation finished (pending count decreased) — scroll back to show it + if ( + prevPendingCountRef.current > 0 && + pendingCount < prevPendingCountRef.current && + page !== 0 + ) { + setPage(0); + setAllHistory([]); + } + prevPendingCountRef.current = pendingCount; + }, [pendingCount, page]); + // Intersection Observer for infinite scroll useEffect(() => { const loadMoreEl = loadMoreRef.current; diff --git a/app/src/lib/hooks/useGenerationProgress.ts b/app/src/lib/hooks/useGenerationProgress.ts index 17d9e0cd..4c6e9143 100644 --- a/app/src/lib/hooks/useGenerationProgress.ts +++ b/app/src/lib/hooks/useGenerationProgress.ts @@ -75,8 +75,8 @@ export function useGenerationProgress() { currentSources.delete(id); removePendingGeneration(id); - // Refresh history to pick up the completed generation - queryClient.invalidateQueries({ queryKey: ['history'] }); + // Refetch history to pick up the completed generation + queryClient.refetchQueries({ queryKey: ['history'] }); // If this generation was queued for a story, add it now const storyId = removePendingStoryAdd(id); @@ -120,7 +120,7 @@ export function useGenerationProgress() { removePendingGeneration(id); removePendingStoryAdd(id); - queryClient.invalidateQueries({ queryKey: ['history'] }); + queryClient.refetchQueries({ queryKey: ['history'] }); toast({ title: data.status === 'not_found' ? 'Generation not found' : 'Generation failed', @@ -134,11 +134,12 @@ export function useGenerationProgress() { }; source.onerror = () => { - // EventSource auto-reconnects, but if we get repeated errors - // just clean up + // SSE connection dropped — clean up and refresh history so any + // completed/failed generation still appears in the list source.close(); currentSources.delete(id); removePendingGeneration(id); + queryClient.refetchQueries({ queryKey: ['history'] }); }; currentSources.set(id, source); From 01800f196ffb20494412aeb370932cd4de3807e0 Mon Sep 17 00:00:00 2001 From: Jamie Pine Date: Mon, 16 Mar 2026 23:13:50 -0700 Subject: [PATCH 4/9] upgrade pip before installing deps in Docker build Fixes hash mismatch when pip resolves Qwen3-TTS transitive deps. Closes #286 --- Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Dockerfile b/Dockerfile index 4705f98c..20da9e1a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -31,6 +31,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ && rm -rf /var/lib/apt/lists/* +RUN pip install --no-cache-dir --upgrade pip + COPY backend/requirements.txt . RUN pip install --no-cache-dir --prefix=/install -r requirements.txt RUN pip install --no-cache-dir --prefix=/install \ From f9e1aa153d76b5cd85634f053f3c898e2182b999 Mon Sep 17 00:00:00 2001 From: Jamie Pine Date: Mon, 16 Mar 2026 23:17:09 -0700 Subject: [PATCH 5/9] handle client disconnects in SSE and streaming endpoints Wrap SSE generators with BrokenPipeError/ConnectionResetError handling so client disconnects during generation status polling, download progress, or audio streaming don't produce unhandled Errno 32 errors. Closes #248 --- backend/routes/generations.py | 53 ++++++++++++++++++++--------------- backend/utils/progress.py | 2 ++ 2 files changed, 33 insertions(+), 22 deletions(-) diff --git a/backend/routes/generations.py b/backend/routes/generations.py index 160b0aa1..8541b659 100644 --- a/backend/routes/generations.py +++ b/backend/routes/generations.py @@ -1,12 +1,15 @@ """TTS generation endpoints.""" import asyncio +import logging import uuid from fastapi import APIRouter, Depends, HTTPException from fastapi.responses import StreamingResponse from sqlalchemy.orm import Session +logger = logging.getLogger(__name__) + from .. import models from ..services import history, profiles, tts from ..database import Generation as DBGeneration, VoiceProfile as DBVoiceProfile, get_db @@ -181,25 +184,28 @@ async def get_generation_status(generation_id: str, db: Session = Depends(get_db import json async def event_stream(): - while True: - db.expire_all() - gen = db.query(DBGeneration).filter_by(id=generation_id).first() - if not gen: - yield f"data: {json.dumps({'status': 'not_found', 'id': generation_id})}\n\n" - return - - payload = { - "id": gen.id, - "status": gen.status or "completed", - "duration": gen.duration, - "error": gen.error, - } - yield f"data: {json.dumps(payload)}\n\n" - - if (gen.status or "completed") in ("completed", "failed"): - return - - await asyncio.sleep(1) + try: + while True: + db.expire_all() + gen = db.query(DBGeneration).filter_by(id=generation_id).first() + if not gen: + yield f"data: {json.dumps({'status': 'not_found', 'id': generation_id})}\n\n" + return + + payload = { + "id": gen.id, + "status": gen.status or "completed", + "duration": gen.duration, + "error": gen.error, + } + yield f"data: {json.dumps(payload)}\n\n" + + if (gen.status or "completed") in ("completed", "failed"): + return + + await asyncio.sleep(1) + except (BrokenPipeError, ConnectionResetError, asyncio.CancelledError): + logger.debug("SSE client disconnected for generation %s", generation_id) return StreamingResponse( event_stream(), @@ -265,9 +271,12 @@ async def stream_speech( wav_bytes = tts.audio_to_wav_bytes(audio, sample_rate) async def _wav_stream(): - chunk_size = 64 * 1024 - for i in range(0, len(wav_bytes), chunk_size): - yield wav_bytes[i : i + chunk_size] + try: + chunk_size = 64 * 1024 + for i in range(0, len(wav_bytes), chunk_size): + yield wav_bytes[i : i + chunk_size] + except (BrokenPipeError, ConnectionResetError, asyncio.CancelledError): + logger.debug("Client disconnected during audio stream") return StreamingResponse( _wav_stream(), diff --git a/backend/utils/progress.py b/backend/utils/progress.py index 418a88c7..56977ebd 100644 --- a/backend/utils/progress.py +++ b/backend/utils/progress.py @@ -246,6 +246,8 @@ async def subscribe(self, model_name: str): # Send heartbeat yield ": heartbeat\n\n" continue + except (BrokenPipeError, ConnectionResetError, asyncio.CancelledError): + logger.debug(f"SSE client disconnected from {model_name}") finally: # Remove from listeners if model_name in self._listeners: From b1069b4521caa9082a415b0c64abd2d42e98dd8c Mon Sep 17 00:00:00 2001 From: Jamie Pine Date: Mon, 16 Mar 2026 23:23:55 -0700 Subject: [PATCH 6/9] upgrade CUDA backend build from cu121 to cu126 cu121 only ships kernels up to SM 9.0 (Ada Lovelace). RTX 50-series (Blackwell, SM 12.0) and RTX 6000 Pro need cu126 which includes SM 12.0 support while remaining backward compatible with older GPUs. Closes #289 --- .github/workflows/release.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8165de0f..cdbec47a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -189,10 +189,10 @@ jobs: pip install -r backend/requirements.txt pip install --no-deps chatterbox-tts - - name: Install PyTorch with CUDA 12.1 + - name: Install PyTorch with CUDA 12.6 run: | - pip install torch --index-url https://download.pytorch.org/whl/cu121 --force-reinstall --no-deps - pip install torchaudio --index-url https://download.pytorch.org/whl/cu121 + pip install torch --index-url https://download.pytorch.org/whl/cu126 --force-reinstall --no-deps + pip install torchaudio --index-url https://download.pytorch.org/whl/cu126 - name: Verify CUDA support in torch run: | From d35e6f0cc54c2abfe91701d5d8fdcfdb7bbe7180 Mon Sep 17 00:00:00 2001 From: Jamie Pine Date: Mon, 16 Mar 2026 23:29:18 -0700 Subject: [PATCH 7/9] fix sample upload blocking the event loop and causing server timeouts Move audio validation and saving to thread pool so librosa/ffmpeg decoding doesn't block the async event loop. Combine validate + load into a single pass to avoid decoding the file twice. Add 50 MB upload limit and chunked reads to prevent unbounded memory allocation. Closes #278 --- backend/routes/profiles.py | 16 ++++++++++++++-- backend/services/profiles.py | 12 ++++++++---- backend/utils/audio.py | 30 ++++++++++++++++++++++++------ 3 files changed, 46 insertions(+), 12 deletions(-) diff --git a/backend/routes/profiles.py b/backend/routes/profiles.py index 6b7b4509..5b2257e0 100644 --- a/backend/routes/profiles.py +++ b/backend/routes/profiles.py @@ -102,6 +102,10 @@ async def delete_profile( return {"message": "Profile deleted successfully"} +SAMPLE_MAX_FILE_SIZE = 50 * 1024 * 1024 # 50 MB +SAMPLE_UPLOAD_CHUNK_SIZE = 1024 * 1024 # 1 MB + + @router.post("/profiles/{profile_id}/samples", response_model=models.ProfileSampleResponse) async def add_profile_sample( profile_id: str, @@ -115,8 +119,16 @@ async def add_profile_sample( file_suffix = _uploaded_ext if _uploaded_ext in _allowed_audio_exts else ".wav" with tempfile.NamedTemporaryFile(suffix=file_suffix, delete=False) as tmp: - content = await file.read() - tmp.write(content) + total_size = 0 + while chunk := await file.read(SAMPLE_UPLOAD_CHUNK_SIZE): + total_size += len(chunk) + if total_size > SAMPLE_MAX_FILE_SIZE: + Path(tmp.name).unlink(missing_ok=True) + raise HTTPException( + status_code=413, + detail=f"File too large (max {SAMPLE_MAX_FILE_SIZE // (1024 * 1024)} MB)", + ) + tmp.write(chunk) tmp_path = tmp.name try: diff --git a/backend/services/profiles.py b/backend/services/profiles.py index 46180f3c..d20c142d 100644 --- a/backend/services/profiles.py +++ b/backend/services/profiles.py @@ -22,7 +22,7 @@ Generation as DBGeneration, ) from ..models import EffectConfig -from ..utils.audio import validate_reference_audio, load_audio, save_audio +from ..utils.audio import validate_reference_audio, validate_and_load_reference_audio, load_audio, save_audio from ..utils.images import validate_image, process_avatar from ..utils.cache import _get_cache_dir, clear_profile_cache from .tts import get_tts_model @@ -117,11 +117,16 @@ async def add_profile_sample( Returns: Created sample """ + import asyncio + profile = db.query(DBVoiceProfile).filter_by(id=profile_id).first() if not profile: raise ValueError(f"Profile {profile_id} not found") - is_valid, error_msg = validate_reference_audio(audio_path) + # Validate and load audio in a single pass, off the event loop + is_valid, error_msg, audio, sr = await asyncio.to_thread( + validate_and_load_reference_audio, audio_path + ) if not is_valid: raise ValueError(f"Invalid reference audio: {error_msg}") @@ -130,8 +135,7 @@ async def add_profile_sample( profile_dir.mkdir(parents=True, exist_ok=True) dest_path = profile_dir / f"{sample_id}.wav" - audio, sr = load_audio(audio_path) - save_audio(audio, str(dest_path), sr) + await asyncio.to_thread(save_audio, audio, str(dest_path), sr) db_sample = DBProfileSample( id=sample_id, diff --git a/backend/utils/audio.py b/backend/utils/audio.py index 2c6de760..2016992c 100644 --- a/backend/utils/audio.py +++ b/backend/utils/audio.py @@ -217,22 +217,40 @@ def validate_reference_audio( Returns: Tuple of (is_valid, error_message) """ + result = validate_and_load_reference_audio( + audio_path, min_duration, max_duration, min_rms + ) + return (result[0], result[1]) + + +def validate_and_load_reference_audio( + audio_path: str, + min_duration: float = 2.0, + max_duration: float = 30.0, + min_rms: float = 0.01, +) -> Tuple[bool, Optional[str], Optional[np.ndarray], Optional[int]]: + """ + Validate and load reference audio in a single pass. + + Returns: + Tuple of (is_valid, error_message, audio_array, sample_rate) + """ try: audio, sr = load_audio(audio_path) duration = len(audio) / sr if duration < min_duration: - return False, f"Audio too short (minimum {min_duration} seconds)" + return False, f"Audio too short (minimum {min_duration} seconds)", None, None if duration > max_duration: - return False, f"Audio too long (maximum {max_duration} seconds)" + return False, f"Audio too long (maximum {max_duration} seconds)", None, None rms = np.sqrt(np.mean(audio**2)) if rms < min_rms: - return False, "Audio is too quiet or silent" + return False, "Audio is too quiet or silent", None, None if np.abs(audio).max() > 0.99: - return False, "Audio is clipping (reduce input gain)" + return False, "Audio is clipping (reduce input gain)", None, None - return True, None + return True, None, audio, sr except Exception as e: - return False, f"Error validating audio: {str(e)}" + return False, f"Error validating audio: {str(e)}", None, None From a672ac5279609f939bb26e4e45be8b419d5c6a83 Mon Sep 17 00:00:00 2001 From: Jamie Pine Date: Tue, 17 Mar 2026 00:07:19 -0700 Subject: [PATCH 8/9] remove voicebox.icns from tracking and add to gitignore --- .gitignore | 1 + tauri/src-tauri/gen/voicebox.icns | Bin 87844 -> 0 bytes 2 files changed, 1 insertion(+) delete mode 100644 tauri/src-tauri/gen/voicebox.icns diff --git a/.gitignore b/.gitignore index 5f87d802..515c059b 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,7 @@ logs/ app/openapi.json tauri/src-tauri/binaries/* tauri/src-tauri/gen/Assets.car +tauri/src-tauri/gen/voicebox.icns # Temporary tmp/ diff --git a/tauri/src-tauri/gen/voicebox.icns b/tauri/src-tauri/gen/voicebox.icns deleted file mode 100644 index e4492f52e5f14be03ad0275e9bb8ad4fcacd99cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87844 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 TAG1MX00000NkvXXu0mjfwVQVR From df50b8a9255905ff379528218e50965bf365e3ba Mon Sep 17 00:00:00 2001 From: Jamie Pine Date: Tue, 17 Mar 2026 00:07:45 -0700 Subject: [PATCH 9/9] add --force-reinstall --no-deps to torchaudio CUDA install --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cdbec47a..2b0cf254 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -192,7 +192,7 @@ jobs: - name: Install PyTorch with CUDA 12.6 run: | pip install torch --index-url https://download.pytorch.org/whl/cu126 --force-reinstall --no-deps - pip install torchaudio --index-url https://download.pytorch.org/whl/cu126 + pip install torchaudio --index-url https://download.pytorch.org/whl/cu126 --force-reinstall --no-deps - name: Verify CUDA support in torch run: |