From 5e7e20c704b8ae63991c6d89745620e3521b1688 Mon Sep 17 00:00:00 2001 From: ivan-digital Date: Sat, 4 Jul 2026 10:02:51 +0200 Subject: [PATCH 1/6] Use TTS capability descriptors --- src-tauri/src/lib.rs | 219 ++++++++++++++++++++++++++- src/components/ScriptEditor.test.tsx | 78 +++++++++- src/components/ScriptEditor.tsx | 75 +++++---- src/components/TopBar.tsx | 41 +++-- src/i18n/messages.ts | 4 + src/ipc/commands.ts | 21 ++- src/state/projectStore.test.ts | 55 +++++++ src/state/projectStore.ts | 34 +++-- src/types/project.ts | 6 +- 9 files changed, 470 insertions(+), 63 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index a526d43..04babf1 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -407,10 +407,70 @@ impl TtsEngine { } } + fn model_name(self) -> &'static str { + match self { + Self::VoxCPM2 => "voxcpm2-mlx-int8", + Self::CosyVoice => "cosyvoice-3-0.5b-mlx-bf16", + Self::Qwen3 => "qwen3-tts-1.7b-mlx-bf16", + Self::Chatterbox => "chatterbox-multilingual-mlx-fp16", + Self::OmniVoice => "omnivoice-mlx-int8", + Self::IndicMio => "indic-mio-mlx-fp16", + Self::FishAudio => "fish-audio-s2-pro-mlx-fp16", + } + } + + fn model_id(self) -> &'static str { + match self { + Self::VoxCPM2 => "aufklarer/VoxCPM2-MLX-int8", + Self::CosyVoice => "aufklarer/CosyVoice3-0.5B-MLX-bf16", + Self::Qwen3 => "aufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-bf16", + Self::Chatterbox => "aufklarer/Chatterbox-Multilingual-MLX-fp16", + Self::OmniVoice => "aufklarer/OmniVoice-MLX-int8", + Self::IndicMio => "aufklarer/Indic-Mio-MLX-fp16", + Self::FishAudio => "aufklarer/Fish-Audio-S2-Pro-MLX-fp16", + } + } + + fn model_size(self) -> &'static str { + match self { + Self::CosyVoice => "0.5B", + Self::Qwen3 => "1.7B", + Self::Chatterbox => "0.5B", + Self::OmniVoice => "0.5B", + Self::IndicMio => "0.6B", + Self::VoxCPM2 => "1.7B", + Self::FishAudio => "S2 Pro", + } + } + + fn languages(self) -> &'static [&'static str] { + match self { + Self::Qwen3 => &["zh", "en", "ja", "ko", "de", "fr", "ru", "pt", "es", "it"], + Self::Chatterbox => &[ + "ar", "da", "de", "el", "en", "es", "fi", "fr", "he", "hi", "it", "ja", "ko", "ms", + "nl", "no", "pl", "pt", "ru", "sv", "sw", "tr", "zh", + ], + Self::OmniVoice => &[ + "en", "hi", "ru", "es", "fr", "de", "it", "pt", "zh", "ja", "ko", + ], + Self::IndicMio => &["hi", "en"], + Self::FishAudio => &["hi", "en"], + Self::VoxCPM2 | Self::CosyVoice => &["en", "zh"], + } + } + + fn voice_profile_modes(self) -> &'static [&'static str] { + &["reference-clone"] + } + fn requires_reference_transcript(self) -> bool { matches!(self, Self::CosyVoice | Self::Qwen3 | Self::FishAudio) } + fn requires_reference_audio(self) -> bool { + true + } + /// Whether synthesis needs a caller-chosen language. Chatterbox prepends a /// `[lang]` token, so the Studio shows a language picker for it; the other /// engines infer language from the text. @@ -420,6 +480,7 @@ impl TtsEngine { /// How the engine applies inline emotion markers — drives the editor hint: /// - `instruction`: marker → an engine-specific style instruction. + /// - `controlled-vocabulary`: marker → fixed engine vocabulary only. /// - `intensity`: marker → an expressiveness level only (Chatterbox; not a /// specific emotion). /// - `suffix-tag`: marker is appended as an engine-specific suffix tag. @@ -427,13 +488,105 @@ impl TtsEngine { /// - `none`: markers are stripped and ignored. fn style_mode(self) -> &'static str { match self { - Self::VoxCPM2 | Self::CosyVoice | Self::OmniVoice => "instruction", + Self::VoxCPM2 | Self::CosyVoice => "instruction", + Self::OmniVoice => "controlled-vocabulary", Self::Chatterbox => "intensity", Self::IndicMio => "suffix-tag", Self::FishAudio => "bracket-tag", Self::Qwen3 => "none", } } + + fn supports_instruct(self) -> bool { + matches!(self, Self::VoxCPM2 | Self::CosyVoice) + } + + fn supported_markers(self) -> &'static [&'static str] { + match self { + Self::VoxCPM2 | Self::CosyVoice => &[ + "soft", + "warm", + "whispering", + "intense", + "excited", + "happy", + "calm", + "serious", + "surprised", + "sad", + "angry", + "dramatic", + "laughs", + ], + Self::OmniVoice => &[ + "whispering", + "excited", + "happy", + "calm", + "serious", + "sad", + "angry", + ], + Self::Chatterbox => &[ + "soft", + "warm", + "whispering", + "intense", + "excited", + "happy", + "calm", + "serious", + "surprised", + "sad", + "angry", + "dramatic", + "laughs", + ], + Self::IndicMio => &["happy", "sad", "angry", "disgust", "fear", "surprise"], + Self::FishAudio => &[ + "pause", + "emphasis", + "laughing", + "excited", + "angry", + "whisper", + "screaming", + "shouting", + "surprised", + "sad", + ], + Self::Qwen3 => &[], + } + } + + fn needs_trim(self) -> bool { + trim_long_form_chunk_edges(self) + } + + fn sample_rate(self) -> u32 { + match self { + Self::VoxCPM2 => 48_000, + Self::FishAudio => 44_100, + Self::CosyVoice | Self::Qwen3 | Self::Chatterbox | Self::OmniVoice | Self::IndicMio => { + 24_000 + } + } + } + + fn use_policy(self) -> &'static str { + match self { + Self::FishAudio => "research-only", + _ => "commercial-safe", + } + } + + fn readiness(self) -> &'static str { + match self { + Self::Qwen3 => "legacy-fallback", + Self::FishAudio => "benchmark", + _ => "production", + } + } } fn normalize_sidecar_language(engine: TtsEngine, language: Option<&str>) -> Option { @@ -441,12 +594,12 @@ fn normalize_sidecar_language(engine: TtsEngine, language: Option<&str>) -> Opti match engine { // The UI keeps BCP-47-ish ids because Chatterbox expects `[hi]`, but // OmniVoice gives cleaner Hindi output with the spelled language item. - TtsEngine::OmniVoice | TtsEngine::IndicMio => trimmed.map(|value| { - match value.to_ascii_lowercase().as_str() { + TtsEngine::OmniVoice | TtsEngine::IndicMio => { + trimmed.map(|value| match value.to_ascii_lowercase().as_str() { "hi" | "hin" => "hindi".to_string(), _ => value.to_string(), - } - }), + }) + } _ => trimmed.map(str::to_string), } } @@ -502,21 +655,55 @@ struct TtsEngineInfo { id: TtsEngine, #[serde(rename = "displayName")] display_name: &'static str, + #[serde(rename = "modelName")] + model_name: &'static str, + #[serde(rename = "modelId")] + model_id: &'static str, + #[serde(rename = "modelSize")] + model_size: &'static str, + languages: &'static [&'static str], + #[serde(rename = "voiceProfileModes")] + voice_profile_modes: &'static [&'static str], + #[serde(rename = "requiresReferenceAudio")] + requires_reference_audio: bool, #[serde(rename = "requiresReferenceTranscript")] requires_reference_transcript: bool, #[serde(rename = "requiresLanguage")] requires_language: bool, #[serde(rename = "styleMode")] style_mode: &'static str, + #[serde(rename = "supportsInstruct")] + supports_instruct: bool, + #[serde(rename = "supportedMarkers")] + supported_markers: &'static [&'static str], + #[serde(rename = "needsTrim")] + needs_trim: bool, + #[serde(rename = "sampleRate")] + sample_rate: u32, + #[serde(rename = "usePolicy")] + use_policy: &'static str, + readiness: &'static str, } fn tts_engine_info(engine: TtsEngine) -> TtsEngineInfo { TtsEngineInfo { id: engine, display_name: engine.display_name(), + model_name: engine.model_name(), + model_id: engine.model_id(), + model_size: engine.model_size(), + languages: engine.languages(), + voice_profile_modes: engine.voice_profile_modes(), + requires_reference_audio: engine.requires_reference_audio(), requires_reference_transcript: engine.requires_reference_transcript(), requires_language: engine.requires_language(), style_mode: engine.style_mode(), + supports_instruct: engine.supports_instruct(), + supported_markers: engine.supported_markers(), + needs_trim: engine.needs_trim(), + sample_rate: engine.sample_rate(), + use_policy: engine.use_policy(), + readiness: engine.readiness(), } } @@ -2917,9 +3104,31 @@ mod tests { assert_eq!(TtsEngine::VoxCPM2.style_mode(), "instruction"); assert_eq!(TtsEngine::IndicMio.style_mode(), "suffix-tag"); assert_eq!(TtsEngine::FishAudio.style_mode(), "bracket-tag"); + assert_eq!(TtsEngine::OmniVoice.style_mode(), "controlled-vocabulary"); assert_eq!(TtsEngine::Qwen3.style_mode(), "none"); } + #[test] + fn tts_engine_info_exposes_model_capabilities() { + let qwen = tts_engine_info(TtsEngine::Qwen3); + assert_eq!(qwen.model_name, "qwen3-tts-1.7b-mlx-bf16"); + assert_eq!(qwen.model_id, "aufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-bf16"); + assert_eq!(qwen.voice_profile_modes, &["reference-clone"]); + assert!(qwen.requires_reference_audio); + assert!(qwen.requires_reference_transcript); + assert!(!qwen.supports_instruct); + assert_eq!(qwen.style_mode, "none"); + assert!(qwen.languages.contains(&"en")); + assert!(qwen.languages.contains(&"ru")); + assert!(qwen.supported_markers.is_empty()); + + let fish = tts_engine_info(TtsEngine::FishAudio); + assert_eq!(fish.style_mode, "bracket-tag"); + assert!(fish.supported_markers.contains(&"excited")); + assert_eq!(fish.use_policy, "research-only"); + assert!(!fish.needs_trim); + } + #[test] fn sidecar_language_normalization_preserves_chatterbox_hi() { assert_eq!( diff --git a/src/components/ScriptEditor.test.tsx b/src/components/ScriptEditor.test.tsx index 07244be..c886c4e 100644 --- a/src/components/ScriptEditor.test.tsx +++ b/src/components/ScriptEditor.test.tsx @@ -3,6 +3,28 @@ import { fireEvent, render, screen } from "@testing-library/react"; import { ScriptEditor } from "./ScriptEditor"; import { EMOTION_TAGS } from "../types/project"; import { useProjectStore } from "../state/projectStore"; +import type { TtsEngineInfo } from "../ipc/commands"; + +function engineInfo(patch: Partial & Pick): TtsEngineInfo { + return { + modelName: patch.id, + modelId: `test/${patch.id}`, + modelSize: "test", + languages: ["en"], + voiceProfileModes: ["reference-clone"], + requiresReferenceAudio: true, + requiresReferenceTranscript: false, + requiresLanguage: false, + styleMode: "instruction", + supportsInstruct: true, + supportedMarkers: [...EMOTION_TAGS], + needsTrim: true, + sampleRate: 24_000, + usePolicy: "commercial-safe", + readiness: "production", + ...patch, + }; +} describe("ScriptEditor", () => { beforeEach(() => { @@ -55,13 +77,15 @@ describe("ScriptEditor", () => { engine: "indic-mio", language: "hi", engines: [ - { + engineInfo({ id: "indic-mio", displayName: "Indic-Mio", requiresReferenceTranscript: false, requiresLanguage: false, styleMode: "suffix-tag", - }, + supportsInstruct: false, + supportedMarkers: ["happy", "sad", "angry"], + }), ], status: "ready", }, @@ -78,13 +102,15 @@ describe("ScriptEditor", () => { engine: "fish-audio", language: "en", engines: [ - { + engineInfo({ id: "fish-audio", displayName: "Fish Audio S2 Pro", requiresReferenceTranscript: true, requiresLanguage: false, styleMode: "bracket-tag", - }, + supportsInstruct: false, + supportedMarkers: ["sad", "excited"], + }), ], status: "ready", }, @@ -94,4 +120,48 @@ describe("ScriptEditor", () => { fireEvent.click(screen.getByRole("button", { name: "excited" })); expect(onChange).toHaveBeenCalledWith("[excited] नमस्ते"); }); + + it("uses the engine-provided marker palette", () => { + useProjectStore.setState({ + model: { + engine: "fish-audio", + language: "en", + engines: [ + engineInfo({ + id: "fish-audio", + displayName: "Fish Audio S2 Pro", + styleMode: "bracket-tag", + supportedMarkers: ["whisper", "excited"], + }), + ], + status: "ready", + }, + }); + render( {}} />); + expect(screen.getAllByRole("button").map((button) => button.textContent)).toEqual([ + "whisper", + "excited", + ]); + }); + + it("does not render marker buttons when the active engine ignores markers", () => { + useProjectStore.setState({ + model: { + engine: "qwen3", + language: "en", + engines: [ + engineInfo({ + id: "qwen3", + displayName: "Qwen3-TTS", + styleMode: "none", + supportsInstruct: false, + supportedMarkers: [], + }), + ], + status: "ready", + }, + }); + render( {}} />); + expect(screen.queryAllByRole("button")).toHaveLength(0); + }); }); diff --git a/src/components/ScriptEditor.tsx b/src/components/ScriptEditor.tsx index 545f15c..d49f13b 100644 --- a/src/components/ScriptEditor.tsx +++ b/src/components/ScriptEditor.tsx @@ -1,5 +1,5 @@ import { useRef } from "react"; -import { EMOTION_TAGS, EmotionTag } from "../types/project"; +import { EMOTION_TAGS } from "../types/project"; import { useProjectStore } from "../state/projectStore"; import { Textarea } from "./ui/textarea"; import { Button } from "./ui/button"; @@ -10,20 +10,6 @@ interface ScriptEditorProps { onChange: (value: string) => void; } -const INDIC_MIO_TAGS = ["happy", "sad", "angry", "disgust", "fear", "surprise"] as const; -const FISH_AUDIO_TAGS = [ - "pause", - "emphasis", - "laughing", - "excited", - "angry", - "whisper", - "screaming", - "shouting", - "surprised", - "sad", -] as const; - // Match `(tag)` or `...` wrappers at the start of a line so we can // swap them out cleanly. Permissive on tag character set to allow custom // emotion descriptors like `(slow and dreamy)`. @@ -46,16 +32,43 @@ function stripEmotionTag(text: string): string { return out.replace(TRAILING_XML_SUFFIX, "").replace(TRAILING_BRACKET_SUFFIX, ""); } +function rawMarkerValue(marker: string): string { + const value = marker.trim(); + if ( + (value.startsWith("<") && value.endsWith(">")) || + (value.startsWith("[") && value.endsWith("]")) || + (value.startsWith("(") && value.endsWith(")")) + ) { + return value.slice(1, -1).trim().toLowerCase(); + } + return value.toLowerCase(); +} + +function suffixMarker(marker: string): string { + const value = marker.trim(); + return value.startsWith("<") && value.endsWith(">") ? value : `<${value}>`; +} + +function bracketMarker(marker: string): string { + const value = marker.trim(); + return value.startsWith("[") && value.endsWith("]") ? value : `[${value}]`; +} + export function ScriptEditor({ value, onChange }: ScriptEditorProps) { const { messages: m } = useI18n(); const ref = useRef(null); - const styleMode = useProjectStore( - (s) => s.model.engines.find((e) => e.id === s.model.engine)?.styleMode ?? "instruction", + const engineInfo = useProjectStore( + (s) => s.model.engines.find((e) => e.id === s.model.engine), ); + const styleMode = engineInfo?.styleMode ?? "instruction"; const markersIgnored = styleMode === "none"; const suffixMode = styleMode === "suffix-tag"; const bracketMode = styleMode === "bracket-tag"; - const markerTags = suffixMode ? INDIC_MIO_TAGS : bracketMode ? FISH_AUDIO_TAGS : EMOTION_TAGS; + const markerTags = markersIgnored + ? [] + : engineInfo?.supportedMarkers.length + ? engineInfo.supportedMarkers + : [...EMOTION_TAGS]; const rawCurrentTag = suffixMode ? value.match(TRAILING_XML_SUFFIX)?.[1] : bracketMode @@ -65,6 +78,8 @@ export function ScriptEditor({ value, onChange }: ScriptEditorProps) { const styleHint = styleMode === "intensity" ? m.script.styleHints.intensity + : styleMode === "controlled-vocabulary" + ? m.script.styleHints.controlledVocabulary : styleMode === "suffix-tag" ? m.script.styleHints.suffixTag : styleMode === "bracket-tag" @@ -73,19 +88,18 @@ export function ScriptEditor({ value, onChange }: ScriptEditorProps) { ? m.script.styleHints.none : m.script.styleHints.instruction; - function applyTag( - tag: EmotionTag | (typeof INDIC_MIO_TAGS)[number] | (typeof FISH_AUDIO_TAGS)[number], - ) { + function applyTag(tag: string) { const body = stripEmotionTag(value).trim(); - if (currentTag === tag) { + const rawTag = rawMarkerValue(tag); + if (currentTag === rawTag) { // Toggle off: clicking the active tag removes it. onChange(body); } else if (suffixMode) { - onChange(`${body} <${tag}>`.trim()); + onChange(`${body} ${suffixMarker(tag)}`.trim()); } else if (bracketMode) { - onChange(`[${tag}] ${body}`.trim()); + onChange(`${bracketMarker(tag)} ${body}`.trim()); } else { - onChange(`(${tag}) ${body}`); + onChange(`(${rawTag}) ${body}`); } requestAnimationFrame(() => ref.current?.focus()); } @@ -104,8 +118,13 @@ export function ScriptEditor({ value, onChange }: ScriptEditorProps) { />
{markerTags.map((tag) => { - const active = currentTag === tag; - const markerLabel = suffixMode ? `<${tag}>` : bracketMode ? `[${tag}]` : `(${tag})`; + const rawTag = rawMarkerValue(tag); + const active = currentTag === rawTag; + const markerLabel = suffixMode + ? suffixMarker(tag) + : bracketMode + ? bracketMarker(tag) + : `(${rawTag})`; return ( ); })} diff --git a/src/components/TopBar.tsx b/src/components/TopBar.tsx index 63c5b96..f6fabed 100644 --- a/src/components/TopBar.tsx +++ b/src/components/TopBar.tsx @@ -142,17 +142,31 @@ function ModelChip({ ); } -/** Languages a per-language engine (Chatterbox) can synthesize today. */ -const TTS_LANGUAGES: { id: string; label: string }[] = [ - { id: "en", label: "English" }, - { id: "ar", label: "العربية" }, - { id: "hi", label: "हिन्दी" }, - { id: "de", label: "Deutsch" }, - { id: "es", label: "Español" }, - { id: "fr", label: "Français" }, - { id: "it", label: "Italiano" }, - { id: "pt", label: "Português" }, -]; +const TTS_LANGUAGE_LABELS: Record = { + ar: "العربية", + da: "Dansk", + de: "Deutsch", + el: "Ελληνικά", + en: "English", + es: "Español", + fi: "Suomi", + fr: "Français", + he: "עברית", + hi: "हिन्दी", + it: "Italiano", + ja: "日本語", + ko: "한국어", + ms: "Bahasa Melayu", + nl: "Nederlands", + no: "Norsk", + pl: "Polski", + pt: "Português", + ru: "Русский", + sv: "Svenska", + sw: "Kiswahili", + tr: "Türkçe", + zh: "中文", +}; export function TopBar() { const { locale, messages: t } = useI18n(); @@ -177,6 +191,9 @@ export function TopBar() { const modelStatus = model.status; const engineInfo = model.engines.find((candidate) => candidate.id === model.engine); const engineName = engineInfo?.displayName ?? "VoxCPM2"; + const languageOptions = (engineInfo?.languages.length ? engineInfo.languages : ["en"]).map( + (id) => ({ id, label: TTS_LANGUAGE_LABELS[id] ?? id }), + ); const synthDisabled = synthBusy || modelStatus !== "ready" || !hasContent; const engineSwitchDisabled = synthBusy; const synthMode: "missing" | "all" = missingCount > 0 ? "missing" : "all"; @@ -345,7 +362,7 @@ export function TopBar() { - {TTS_LANGUAGES.map((lang) => ( + {languageOptions.map((lang) => ( {lang.label} diff --git a/src/i18n/messages.ts b/src/i18n/messages.ts index 51697c3..08b6673 100644 --- a/src/i18n/messages.ts +++ b/src/i18n/messages.ts @@ -249,6 +249,8 @@ const en = { setMarker: (marker: string) => `Set this line's tone to ${marker}`, styleHints: { instruction: "Markers steer this line's tone.", + controlledVocabulary: + "This engine only accepts a fixed style vocabulary; emotion markers are approximations.", intensity: "Chatterbox applies markers as intensity only — more vs. less expressive, not a specific emotion.", suffixTag: @@ -468,6 +470,8 @@ const ru: typeof en = { setMarker: (marker) => `Задать интонацию ${marker}`, styleHints: { instruction: "Маркеры управляют интонацией этой реплики.", + controlledVocabulary: + "Этот движок принимает только фиксированный словарь стилей; эмоции передаются приблизительно.", intensity: "Chatterbox применяет маркеры только как уровень выразительности, а не как конкретную эмоцию.", suffixTag: diff --git a/src/ipc/commands.ts b/src/ipc/commands.ts index f1d4742..5ee11d7 100644 --- a/src/ipc/commands.ts +++ b/src/ipc/commands.ts @@ -24,6 +24,12 @@ export type TtsEngineId = export interface TtsEngineInfo { id: TtsEngineId; displayName: string; + modelName: string; + modelId: string; + modelSize: string; + languages: string[]; + voiceProfileModes: Array<"reference-clone" | "preset-voice" | "designed-voice">; + requiresReferenceAudio: boolean; requiresReferenceTranscript: boolean; /** When true the engine needs a caller-chosen language (e.g. Chatterbox's * `[lang]` token); the UI surfaces a language picker. */ @@ -31,11 +37,24 @@ export interface TtsEngineInfo { /** How inline emotion markers are applied, so the editor can set honest * expectations: * - `instruction`: marker → a natural-language style instruction (real tone). + * - `controlled-vocabulary`: marker → fixed model vocabulary (limited tone). * - `intensity`: marker → an expressiveness level only (not a specific emotion). * - `suffix-tag`: marker → an engine-specific suffix tag such as ``. * - `bracket-tag`: marker → an engine-specific suffix tag such as `[excited]`. * - `none`: markers are ignored. */ - styleMode: "instruction" | "intensity" | "suffix-tag" | "bracket-tag" | "none"; + styleMode: + | "instruction" + | "controlled-vocabulary" + | "intensity" + | "suffix-tag" + | "bracket-tag" + | "none"; + supportsInstruct: boolean; + supportedMarkers: string[]; + needsTrim: boolean; + sampleRate: number; + usePolicy: "commercial-safe" | "research-only" | "needs-review" | string; + readiness: "production" | "legacy-fallback" | "benchmark" | "experimental" | string; } export function availableTtsEngines(): Promise { diff --git a/src/state/projectStore.test.ts b/src/state/projectStore.test.ts index 784e55b..0365a13 100644 --- a/src/state/projectStore.test.ts +++ b/src/state/projectStore.test.ts @@ -1,6 +1,33 @@ import { beforeEach, describe, expect, it } from "vitest"; import { newClip, useProjectStore } from "./projectStore"; import { emptyProject, type SpeakerTrack, type VideoTrack } from "../types/project"; +import type { TtsEngineInfo } from "../ipc/commands"; + +function engineInfo( + id: TtsEngineInfo["id"], + patch: Partial = {}, +): TtsEngineInfo { + return { + id, + displayName: id, + modelName: id, + modelId: `test/${id}`, + modelSize: "test", + languages: ["en"], + voiceProfileModes: ["reference-clone"], + requiresReferenceAudio: true, + requiresReferenceTranscript: false, + requiresLanguage: false, + styleMode: "instruction", + supportsInstruct: true, + supportedMarkers: [], + needsTrim: true, + sampleRate: 24_000, + usePolicy: "commercial-safe", + readiness: "production", + ...patch, + }; +} function speakerTrack(name = "Speaker 1"): SpeakerTrack { return { @@ -32,6 +59,34 @@ describe("projectStore model defaults", () => { it("starts on CosyVoice so macOS loads it by default", () => { expect(useProjectStore.getState().model.engine).toBe("cosyvoice"); }); + + it("normalizes the current language when engine descriptors arrive", () => { + useProjectStore.setState((s) => ({ + model: { ...s.model, engine: "chatterbox", language: "xx" }, + })); + useProjectStore + .getState() + .setAvailableTtsEngines([ + engineInfo("chatterbox", { languages: ["hi", "en"], requiresLanguage: true }), + ]); + expect(useProjectStore.getState().model.language).toBe("hi"); + }); + + it("uses the selected engine's first language when switching engines", () => { + useProjectStore.setState((s) => ({ + model: { + ...s.model, + engine: "cosyvoice", + language: "ru", + engines: [ + engineInfo("cosyvoice", { languages: ["en", "zh"] }), + engineInfo("chatterbox", { languages: ["hi", "en"], requiresLanguage: true }), + ], + }, + })); + useProjectStore.getState().setTtsEngine("chatterbox"); + expect(useProjectStore.getState().model.language).toBe("hi"); + }); }); describe("projectStore.addTrack / removeTrack", () => { diff --git a/src/state/projectStore.ts b/src/state/projectStore.ts index 955625c..c733902 100644 --- a/src/state/projectStore.ts +++ b/src/state/projectStore.ts @@ -205,18 +205,34 @@ export const useProjectStore = create((set) => ({ : s, ), setTtsEngine: (engine) => - set((s) => ({ - model: { - ...s.model, - engine, - language: engine === "indic-mio" ? "hi" : s.model.language, - error: undefined, - }, - })), + set((s) => { + const nextEngine = s.model.engines.find((candidate) => candidate.id === engine); + const languages = nextEngine?.languages ?? []; + const language = languages.length && !languages.includes(s.model.language) + ? languages[0] + : engine === "indic-mio" + ? "hi" + : s.model.language; + return { + model: { + ...s.model, + engine, + language, + error: undefined, + }, + }; + }), setTtsLanguage: (language) => set((s) => ({ model: { ...s.model, language, error: undefined } })), setAvailableTtsEngines: (engines) => - set((s) => ({ model: { ...s.model, engines } })), + set((s) => { + const active = engines.find((candidate) => candidate.id === s.model.engine); + const languages = active?.languages ?? []; + const language = languages.length && !languages.includes(s.model.language) + ? languages[0] + : s.model.language; + return { model: { ...s.model, engines, language } }; + }), demoProgress: null, setDemoProgress: (p) => set(() => ({ demoProgress: p })), diff --git a/src/types/project.ts b/src/types/project.ts index 654acbf..9cb4829 100644 --- a/src/types/project.ts +++ b/src/types/project.ts @@ -1,7 +1,5 @@ -// Tag names recognised by the sidecar's emotionInstructs map. Wrap a line -// with one of these (XML-style `` or leading parenthetical -// `(tag) …`) and the sidecar passes the matching natural-language style -// instruction to VoxCPM2's `instruct` channel. +// Default marker names for instruction-style engines. Engine descriptors can +// provide a narrower marker palette for suffix/bracket/vocabulary models. export const EMOTION_TAGS = [ "soft", "warm", From 2f6768df97255bb7cd1cb7e4a9df882af7d976a4 Mon Sep 17 00:00:00 2001 From: ivan-digital Date: Sat, 4 Jul 2026 10:13:10 +0200 Subject: [PATCH 2/6] Move TTS capability registry into Studio --- src-tauri/src/lib.rs | 558 ++++++++++++++++++++++++------------------- 1 file changed, 306 insertions(+), 252 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 04babf1..1a38d81 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -382,100 +382,286 @@ enum TtsEngine { FishAudio, } -impl TtsEngine { - fn sidecar_command(self) -> &'static str { - match self { - Self::VoxCPM2 => "synthesize_voxcpm2", - Self::CosyVoice => "synthesize_cosyvoice", - Self::Qwen3 => "synthesize_icl", - Self::Chatterbox => "synthesize_chatterbox", - Self::OmniVoice => "synthesize_omnivoice", - Self::IndicMio => "synthesize_indic_mio", - Self::FishAudio => "synthesize_fish_audio", - } - } - - fn display_name(self) -> &'static str { - match self { - Self::VoxCPM2 => "VoxCPM2", - Self::CosyVoice => "CosyVoice 3", - Self::Qwen3 => "Qwen3-TTS", - Self::Chatterbox => "Chatterbox", - Self::OmniVoice => "OmniVoice", - Self::IndicMio => "Indic-Mio", - Self::FishAudio => "Fish Audio S2 Pro", - } - } - - fn model_name(self) -> &'static str { - match self { - Self::VoxCPM2 => "voxcpm2-mlx-int8", - Self::CosyVoice => "cosyvoice-3-0.5b-mlx-bf16", - Self::Qwen3 => "qwen3-tts-1.7b-mlx-bf16", - Self::Chatterbox => "chatterbox-multilingual-mlx-fp16", - Self::OmniVoice => "omnivoice-mlx-int8", - Self::IndicMio => "indic-mio-mlx-fp16", - Self::FishAudio => "fish-audio-s2-pro-mlx-fp16", - } - } +#[derive(Clone, Copy, Serialize)] +struct TtsEngineInfo { + id: TtsEngine, + #[serde(rename = "displayName")] + display_name: &'static str, + #[serde(rename = "modelName")] + model_name: &'static str, + #[serde(rename = "modelId")] + model_id: &'static str, + #[serde(rename = "modelSize")] + model_size: &'static str, + languages: &'static [&'static str], + #[serde(rename = "voiceProfileModes")] + voice_profile_modes: &'static [&'static str], + #[serde(rename = "requiresReferenceAudio")] + requires_reference_audio: bool, + #[serde(rename = "requiresReferenceTranscript")] + requires_reference_transcript: bool, + #[serde(rename = "requiresLanguage")] + requires_language: bool, + #[serde(rename = "styleMode")] + style_mode: &'static str, + #[serde(rename = "supportsInstruct")] + supports_instruct: bool, + #[serde(rename = "supportedMarkers")] + supported_markers: &'static [&'static str], + #[serde(rename = "needsTrim")] + needs_trim: bool, + #[serde(rename = "sampleRate")] + sample_rate: u32, + #[serde(rename = "usePolicy")] + use_policy: &'static str, + readiness: &'static str, +} - fn model_id(self) -> &'static str { - match self { - Self::VoxCPM2 => "aufklarer/VoxCPM2-MLX-int8", - Self::CosyVoice => "aufklarer/CosyVoice3-0.5B-MLX-bf16", - Self::Qwen3 => "aufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-bf16", - Self::Chatterbox => "aufklarer/Chatterbox-Multilingual-MLX-fp16", - Self::OmniVoice => "aufklarer/OmniVoice-MLX-int8", - Self::IndicMio => "aufklarer/Indic-Mio-MLX-fp16", - Self::FishAudio => "aufklarer/Fish-Audio-S2-Pro-MLX-fp16", - } - } +#[derive(Clone, Copy)] +struct TtsEngineRegistryEntry { + info: TtsEngineInfo, + sidecar_command: &'static str, + macos_only: bool, +} + +const REFERENCE_CLONE_PROFILE: &[&str] = &["reference-clone"]; +const EN_ZH_LANGUAGES: &[&str] = &["en", "zh"]; +const QWEN_TTS_LANGUAGES: &[&str] = &["zh", "en", "ja", "ko", "de", "fr", "ru", "pt", "es", "it"]; +const CHATTERBOX_LANGUAGES: &[&str] = &[ + "ar", "da", "de", "el", "en", "es", "fi", "fr", "he", "hi", "it", "ja", "ko", "ms", "nl", "no", + "pl", "pt", "ru", "sv", "sw", "tr", "zh", +]; +const OMNIVOICE_LANGUAGES: &[&str] = &[ + "en", "hi", "ru", "es", "fr", "de", "it", "pt", "zh", "ja", "ko", +]; +const HI_EN_LANGUAGES: &[&str] = &["hi", "en"]; +const INSTRUCTION_MARKERS: &[&str] = &[ + "soft", + "warm", + "whispering", + "intense", + "excited", + "happy", + "calm", + "serious", + "surprised", + "sad", + "angry", + "dramatic", + "laughs", +]; +const OMNIVOICE_MARKERS: &[&str] = &[ + "whispering", + "excited", + "happy", + "calm", + "serious", + "sad", + "angry", +]; +const INDIC_MIO_MARKERS: &[&str] = &["happy", "sad", "angry", "disgust", "fear", "surprise"]; +const FISH_AUDIO_MARKERS: &[&str] = &[ + "pause", + "emphasis", + "laughing", + "excited", + "angry", + "whisper", + "screaming", + "shouting", + "surprised", + "sad", +]; + +const TTS_ENGINE_REGISTRY: &[TtsEngineRegistryEntry] = &[ + TtsEngineRegistryEntry { + info: TtsEngineInfo { + id: TtsEngine::VoxCPM2, + display_name: "VoxCPM2", + model_name: "voxcpm2-mlx-int8", + model_id: "aufklarer/VoxCPM2-MLX-int8", + model_size: "1.7B", + languages: EN_ZH_LANGUAGES, + voice_profile_modes: REFERENCE_CLONE_PROFILE, + requires_reference_audio: true, + requires_reference_transcript: false, + requires_language: false, + style_mode: "instruction", + supports_instruct: true, + supported_markers: INSTRUCTION_MARKERS, + needs_trim: true, + sample_rate: 48_000, + use_policy: "commercial-safe", + readiness: "production", + }, + sidecar_command: "synthesize_voxcpm2", + macos_only: false, + }, + TtsEngineRegistryEntry { + info: TtsEngineInfo { + id: TtsEngine::CosyVoice, + display_name: "CosyVoice 3", + model_name: "cosyvoice-3-0.5b-mlx-bf16", + model_id: "aufklarer/CosyVoice3-0.5B-MLX-bf16", + model_size: "0.5B", + languages: EN_ZH_LANGUAGES, + voice_profile_modes: REFERENCE_CLONE_PROFILE, + requires_reference_audio: true, + requires_reference_transcript: true, + requires_language: false, + style_mode: "instruction", + supports_instruct: true, + supported_markers: INSTRUCTION_MARKERS, + needs_trim: true, + sample_rate: 24_000, + use_policy: "commercial-safe", + readiness: "production", + }, + sidecar_command: "synthesize_cosyvoice", + macos_only: true, + }, + TtsEngineRegistryEntry { + info: TtsEngineInfo { + id: TtsEngine::Qwen3, + display_name: "Qwen3-TTS", + model_name: "qwen3-tts-1.7b-mlx-bf16", + model_id: "aufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-bf16", + model_size: "1.7B", + languages: QWEN_TTS_LANGUAGES, + voice_profile_modes: REFERENCE_CLONE_PROFILE, + requires_reference_audio: true, + requires_reference_transcript: true, + requires_language: false, + style_mode: "none", + supports_instruct: false, + supported_markers: &[], + needs_trim: true, + sample_rate: 24_000, + use_policy: "commercial-safe", + readiness: "legacy-fallback", + }, + sidecar_command: "synthesize_icl", + macos_only: true, + }, + TtsEngineRegistryEntry { + info: TtsEngineInfo { + id: TtsEngine::Chatterbox, + display_name: "Chatterbox", + model_name: "chatterbox-multilingual-mlx-fp16", + model_id: "aufklarer/Chatterbox-Multilingual-MLX-fp16", + model_size: "0.5B", + languages: CHATTERBOX_LANGUAGES, + voice_profile_modes: REFERENCE_CLONE_PROFILE, + requires_reference_audio: true, + requires_reference_transcript: false, + requires_language: true, + style_mode: "intensity", + supports_instruct: false, + supported_markers: INSTRUCTION_MARKERS, + needs_trim: true, + sample_rate: 24_000, + use_policy: "commercial-safe", + readiness: "production", + }, + sidecar_command: "synthesize_chatterbox", + macos_only: true, + }, + TtsEngineRegistryEntry { + info: TtsEngineInfo { + id: TtsEngine::OmniVoice, + display_name: "OmniVoice", + model_name: "omnivoice-mlx-int8", + model_id: "aufklarer/OmniVoice-MLX-int8", + model_size: "0.5B", + languages: OMNIVOICE_LANGUAGES, + voice_profile_modes: REFERENCE_CLONE_PROFILE, + requires_reference_audio: true, + requires_reference_transcript: false, + requires_language: true, + style_mode: "controlled-vocabulary", + supports_instruct: false, + supported_markers: OMNIVOICE_MARKERS, + needs_trim: true, + sample_rate: 24_000, + use_policy: "commercial-safe", + readiness: "production", + }, + sidecar_command: "synthesize_omnivoice", + macos_only: true, + }, + TtsEngineRegistryEntry { + info: TtsEngineInfo { + id: TtsEngine::IndicMio, + display_name: "Indic-Mio", + model_name: "indic-mio-mlx-fp16", + model_id: "aufklarer/Indic-Mio-MLX-fp16", + model_size: "0.6B", + languages: HI_EN_LANGUAGES, + voice_profile_modes: REFERENCE_CLONE_PROFILE, + requires_reference_audio: true, + requires_reference_transcript: false, + requires_language: false, + style_mode: "suffix-tag", + supports_instruct: false, + supported_markers: INDIC_MIO_MARKERS, + needs_trim: true, + sample_rate: 24_000, + use_policy: "commercial-safe", + readiness: "production", + }, + sidecar_command: "synthesize_indic_mio", + macos_only: true, + }, + TtsEngineRegistryEntry { + info: TtsEngineInfo { + id: TtsEngine::FishAudio, + display_name: "Fish Audio S2 Pro", + model_name: "fish-audio-s2-pro-mlx-fp16", + model_id: "aufklarer/Fish-Audio-S2-Pro-MLX-fp16", + model_size: "S2 Pro", + languages: HI_EN_LANGUAGES, + voice_profile_modes: REFERENCE_CLONE_PROFILE, + requires_reference_audio: true, + requires_reference_transcript: true, + requires_language: false, + style_mode: "bracket-tag", + supports_instruct: false, + supported_markers: FISH_AUDIO_MARKERS, + needs_trim: false, + sample_rate: 44_100, + use_policy: "research-only", + readiness: "benchmark", + }, + sidecar_command: "synthesize_fish_audio", + macos_only: true, + }, +]; - fn model_size(self) -> &'static str { - match self { - Self::CosyVoice => "0.5B", - Self::Qwen3 => "1.7B", - Self::Chatterbox => "0.5B", - Self::OmniVoice => "0.5B", - Self::IndicMio => "0.6B", - Self::VoxCPM2 => "1.7B", - Self::FishAudio => "S2 Pro", - } +impl TtsEngine { + fn registry_entry(self) -> &'static TtsEngineRegistryEntry { + TTS_ENGINE_REGISTRY + .iter() + .find(|entry| entry.info.id == self) + .expect("TtsEngine missing from TTS_ENGINE_REGISTRY") } - fn languages(self) -> &'static [&'static str] { - match self { - Self::Qwen3 => &["zh", "en", "ja", "ko", "de", "fr", "ru", "pt", "es", "it"], - Self::Chatterbox => &[ - "ar", "da", "de", "el", "en", "es", "fi", "fr", "he", "hi", "it", "ja", "ko", "ms", - "nl", "no", "pl", "pt", "ru", "sv", "sw", "tr", "zh", - ], - Self::OmniVoice => &[ - "en", "hi", "ru", "es", "fr", "de", "it", "pt", "zh", "ja", "ko", - ], - Self::IndicMio => &["hi", "en"], - Self::FishAudio => &["hi", "en"], - Self::VoxCPM2 | Self::CosyVoice => &["en", "zh"], - } + fn sidecar_command(self) -> &'static str { + self.registry_entry().sidecar_command } - fn voice_profile_modes(self) -> &'static [&'static str] { - &["reference-clone"] + fn display_name(self) -> &'static str { + self.registry_entry().info.display_name } fn requires_reference_transcript(self) -> bool { - matches!(self, Self::CosyVoice | Self::Qwen3 | Self::FishAudio) - } - - fn requires_reference_audio(self) -> bool { - true + self.registry_entry().info.requires_reference_transcript } /// Whether synthesis needs a caller-chosen language. Chatterbox prepends a /// `[lang]` token, so the Studio shows a language picker for it; the other /// engines infer language from the text. fn requires_language(self) -> bool { - matches!(self, Self::Chatterbox | Self::OmniVoice) + self.registry_entry().info.requires_language } /// How the engine applies inline emotion markers — drives the editor hint: @@ -487,105 +673,7 @@ impl TtsEngine { /// - `bracket-tag`: marker is appended as an engine-specific bracket tag. /// - `none`: markers are stripped and ignored. fn style_mode(self) -> &'static str { - match self { - Self::VoxCPM2 | Self::CosyVoice => "instruction", - Self::OmniVoice => "controlled-vocabulary", - Self::Chatterbox => "intensity", - Self::IndicMio => "suffix-tag", - Self::FishAudio => "bracket-tag", - Self::Qwen3 => "none", - } - } - - fn supports_instruct(self) -> bool { - matches!(self, Self::VoxCPM2 | Self::CosyVoice) - } - - fn supported_markers(self) -> &'static [&'static str] { - match self { - Self::VoxCPM2 | Self::CosyVoice => &[ - "soft", - "warm", - "whispering", - "intense", - "excited", - "happy", - "calm", - "serious", - "surprised", - "sad", - "angry", - "dramatic", - "laughs", - ], - Self::OmniVoice => &[ - "whispering", - "excited", - "happy", - "calm", - "serious", - "sad", - "angry", - ], - Self::Chatterbox => &[ - "soft", - "warm", - "whispering", - "intense", - "excited", - "happy", - "calm", - "serious", - "surprised", - "sad", - "angry", - "dramatic", - "laughs", - ], - Self::IndicMio => &["happy", "sad", "angry", "disgust", "fear", "surprise"], - Self::FishAudio => &[ - "pause", - "emphasis", - "laughing", - "excited", - "angry", - "whisper", - "screaming", - "shouting", - "surprised", - "sad", - ], - Self::Qwen3 => &[], - } - } - - fn needs_trim(self) -> bool { - trim_long_form_chunk_edges(self) - } - - fn sample_rate(self) -> u32 { - match self { - Self::VoxCPM2 => 48_000, - Self::FishAudio => 44_100, - Self::CosyVoice | Self::Qwen3 | Self::Chatterbox | Self::OmniVoice | Self::IndicMio => { - 24_000 - } - } - } - - fn use_policy(self) -> &'static str { - match self { - Self::FishAudio => "research-only", - _ => "commercial-safe", - } - } - - fn readiness(self) -> &'static str { - match self { - Self::Qwen3 => "legacy-fallback", - Self::FishAudio => "benchmark", - _ => "production", - } + self.registry_entry().info.style_mode } } @@ -605,15 +693,8 @@ fn normalize_sidecar_language(engine: TtsEngine, language: Option<&str>) -> Opti } fn engine_is_supported(engine: TtsEngine) -> bool { - match engine { - TtsEngine::VoxCPM2 => true, - TtsEngine::CosyVoice => cfg!(target_os = "macos"), - TtsEngine::Qwen3 => cfg!(target_os = "macos"), - TtsEngine::Chatterbox => cfg!(target_os = "macos"), - TtsEngine::OmniVoice => cfg!(target_os = "macos"), - TtsEngine::IndicMio => cfg!(target_os = "macos"), - TtsEngine::FishAudio => cfg!(target_os = "macos"), - } + let entry = engine.registry_entry(); + !entry.macos_only || cfg!(target_os = "macos") } fn ensure_engine_supported(engine: TtsEngine) -> Result<(), String> { @@ -650,75 +731,17 @@ fn humanize_sidecar_error(engine: TtsEngine, error: String) -> String { error } -#[derive(Serialize)] -struct TtsEngineInfo { - id: TtsEngine, - #[serde(rename = "displayName")] - display_name: &'static str, - #[serde(rename = "modelName")] - model_name: &'static str, - #[serde(rename = "modelId")] - model_id: &'static str, - #[serde(rename = "modelSize")] - model_size: &'static str, - languages: &'static [&'static str], - #[serde(rename = "voiceProfileModes")] - voice_profile_modes: &'static [&'static str], - #[serde(rename = "requiresReferenceAudio")] - requires_reference_audio: bool, - #[serde(rename = "requiresReferenceTranscript")] - requires_reference_transcript: bool, - #[serde(rename = "requiresLanguage")] - requires_language: bool, - #[serde(rename = "styleMode")] - style_mode: &'static str, - #[serde(rename = "supportsInstruct")] - supports_instruct: bool, - #[serde(rename = "supportedMarkers")] - supported_markers: &'static [&'static str], - #[serde(rename = "needsTrim")] - needs_trim: bool, - #[serde(rename = "sampleRate")] - sample_rate: u32, - #[serde(rename = "usePolicy")] - use_policy: &'static str, - readiness: &'static str, -} - fn tts_engine_info(engine: TtsEngine) -> TtsEngineInfo { - TtsEngineInfo { - id: engine, - display_name: engine.display_name(), - model_name: engine.model_name(), - model_id: engine.model_id(), - model_size: engine.model_size(), - languages: engine.languages(), - voice_profile_modes: engine.voice_profile_modes(), - requires_reference_audio: engine.requires_reference_audio(), - requires_reference_transcript: engine.requires_reference_transcript(), - requires_language: engine.requires_language(), - style_mode: engine.style_mode(), - supports_instruct: engine.supports_instruct(), - supported_markers: engine.supported_markers(), - needs_trim: engine.needs_trim(), - sample_rate: engine.sample_rate(), - use_policy: engine.use_policy(), - readiness: engine.readiness(), - } + engine.registry_entry().info } #[tauri::command] async fn available_tts_engines() -> Vec { - let mut engines = vec![tts_engine_info(TtsEngine::VoxCPM2)]; - if cfg!(target_os = "macos") { - engines.push(tts_engine_info(TtsEngine::CosyVoice)); - engines.push(tts_engine_info(TtsEngine::Qwen3)); - engines.push(tts_engine_info(TtsEngine::Chatterbox)); - engines.push(tts_engine_info(TtsEngine::OmniVoice)); - engines.push(tts_engine_info(TtsEngine::IndicMio)); - engines.push(tts_engine_info(TtsEngine::FishAudio)); - } - engines + TTS_ENGINE_REGISTRY + .iter() + .filter(|entry| engine_is_supported(entry.info.id)) + .map(|entry| entry.info) + .collect() } #[tauri::command] @@ -1448,7 +1471,7 @@ const MAX_CHUNK_WORDS: usize = 14; const CHUNK_GAP_SEC: f64 = 0.28; fn trim_long_form_chunk_edges(engine: TtsEngine) -> bool { - !matches!(engine, TtsEngine::FishAudio) + engine.registry_entry().info.needs_trim } /// Trim leading/trailing low-energy tails from a rendered chunk. The model @@ -3129,6 +3152,37 @@ mod tests { assert!(!fish.needs_trim); } + #[test] + fn studio_registry_keeps_qwen_on_bf16() { + let ids: Vec = TTS_ENGINE_REGISTRY + .iter() + .map(|entry| entry.info.id) + .collect(); + assert_eq!( + ids, + vec![ + TtsEngine::VoxCPM2, + TtsEngine::CosyVoice, + TtsEngine::Qwen3, + TtsEngine::Chatterbox, + TtsEngine::OmniVoice, + TtsEngine::IndicMio, + TtsEngine::FishAudio, + ] + ); + + let qwen = TtsEngine::Qwen3.registry_entry(); + assert_eq!(qwen.info.model_name, "qwen3-tts-1.7b-mlx-bf16"); + assert_eq!( + qwen.info.model_id, + "aufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-bf16" + ); + assert!(!qwen.info.model_name.contains("8bit")); + assert!(!qwen.info.model_id.contains("8bit")); + assert!(!qwen.info.model_name.contains("0.6b")); + assert_eq!(qwen.info.style_mode, "none"); + } + #[test] fn sidecar_language_normalization_preserves_chatterbox_hi() { assert_eq!( From b28f2c6455ce013d2b9bfe1216a35aac55eabbea Mon Sep 17 00:00:00 2001 From: ivan-digital Date: Sun, 5 Jul 2026 12:29:06 +0200 Subject: [PATCH 3/6] Finish registry rollout: dictation, synthesis hardening, demo voices MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ship the remaining pieces on top of the capability registry: Dictation: Parakeet ASR through the sidecar (transcribe_parakeet), a save-and-transcribe IPC path with its own cache dir, an ASR model registry, and a DictationPanel front end. Model plumbing: pass the registry-selected modelId through init_model and the synthesize commands so holders reload when the artifact changes; default VoxCPM2 to the bf16 bundle; registry-driven per-engine seed ladders, token budgets, and language normalization. Synthesis output conditioning: every engine's WAV now gets a silent lead-in, edge fades, and a post-roll (conditionAudioEdges). Qwen3 ICL and OmniVoice additionally open some renders (reference-dependent) with a short low-level codec artifact before the first word — quiet hiss on the Marek reference, a low hum on Anna — followed by a silence gap. trimLeadingJunk removes it via energy-island analysis: leading islands that are short, early, gap-separated, and either ≥20 dB below the loudest island or 8-20 dB below with a pure low-frequency ZCR signature. Clean renders pass through bit-exact. A fixed pre-trim could not work here: the residue runs past 150 ms on affected renders while unaffected ones start voiced within 25 ms. Indic-Mio markers: map the Studio's inline emotion markers onto the model's closed suffix-tag vocabulary. The model reads unknown parentheticals aloud, so unmapped markers are dropped rather than passed through. Demo: lazy clip seeding with stable cache ids; exact bundled reference transcripts (a stale Anna transcript leaked prompt words into takes); Qwen goes single-shot at a fixed seed; the Hindi demo gains a second, female FLEURS speaker (the existing reference is the male recording of its sentence) with lines alternating across both voices. Tests: sidecar e2e for onset cleanliness on both affected engines and marker handling on Indic-Mio (ignored, model-backed), fast protocol tests for engine mismatch and missing fields, and frontend unit tests for the new synth, clip-audio, media-src, and language helpers. --- core-sidecar/CMakeLists.txt | 1 + core-sidecar/src/main.cpp | 175 ++++ model-registry.json | 460 +++++++++ scripts/tts_roundtrip_matrix.py | 804 +++++++++++++++ src-tauri/Cargo.lock | 1 + src-tauri/Cargo.toml | 1 + src-tauri/resources/voices/hindi_fleurs.wav | Bin 0 -> 122924 bytes .../resources/voices/hindi_fleurs_female.wav | Bin 0 -> 282284 bytes src-tauri/src/lib.rs | 942 ++++++++++++------ src-tauri/tests/sidecar.rs | 272 ++++- src/components/DictationPanel.tsx | 408 ++++++++ src/components/Inspector.tsx | 14 +- src/components/LeftRail.tsx | 19 +- src/components/ProjectsMenu.tsx | 44 +- src/components/ScriptEditor.test.tsx | 2 + src/components/TopBar.tsx | 70 +- src/hooks/useAudioScheduler.ts | 8 +- src/hooks/useSynthesizeAll.test.tsx | 101 ++ src/hooks/useSynthesizeAll.ts | 10 +- src/i18n/messages.ts | 65 ++ src/ipc/commands.ts | 60 +- src/lib/clipAudio.test.ts | 57 ++ src/lib/clipAudio.ts | 6 + src/lib/languageLabels.test.ts | 48 + src/lib/languageLabels.ts | 36 + src/lib/mediaSrc.test.ts | 18 + src/lib/mediaSrc.ts | 8 + src/state/demoProject.ts | 157 ++- src/state/projectStore.test.ts | 41 + src/state/projectStore.ts | 32 +- swift-sidecar/Package.swift | 2 + .../Sources/soniqo-tts-sidecar/main.swift | 383 +++++-- 32 files changed, 3788 insertions(+), 457 deletions(-) create mode 100644 model-registry.json create mode 100644 scripts/tts_roundtrip_matrix.py create mode 100644 src-tauri/resources/voices/hindi_fleurs.wav create mode 100644 src-tauri/resources/voices/hindi_fleurs_female.wav create mode 100644 src/components/DictationPanel.tsx create mode 100644 src/hooks/useSynthesizeAll.test.tsx create mode 100644 src/lib/clipAudio.test.ts create mode 100644 src/lib/languageLabels.test.ts create mode 100644 src/lib/languageLabels.ts create mode 100644 src/lib/mediaSrc.test.ts create mode 100644 src/lib/mediaSrc.ts diff --git a/core-sidecar/CMakeLists.txt b/core-sidecar/CMakeLists.txt index 25c2577..e87d62a 100644 --- a/core-sidecar/CMakeLists.txt +++ b/core-sidecar/CMakeLists.txt @@ -68,6 +68,7 @@ find_package(CURL REQUIRED) add_executable(speech-core-tts-sidecar src/main.cpp src/audio_decode.cpp src/sidecar_text.cpp src/sidecar_sysinfo.cpp) target_include_directories(speech-core-tts-sidecar PRIVATE "${SPEECH_CORE_DIR}/include" + "${SPEECH_CORE_DIR}/src/models/litert" # Vendored LiteRT C API headers — needed since the transcribe command uses # speech-core's C++ LiteRT wrappers directly (litert_engine.h). "${SPEECH_CORE_DIR}/third_party/litert" diff --git a/core-sidecar/src/main.cpp b/core-sidecar/src/main.cpp index d527a9c..402ea2c 100644 --- a/core-sidecar/src/main.cpp +++ b/core-sidecar/src/main.cpp @@ -20,16 +20,20 @@ // transcribe — ASR a rendered take (Omnilingual CTC-300M) so the // host can grade it against the target text and // retry bad takes. Model dir comes per-request. +// transcribe_parakeet — user dictation / transcription with Parakeet TDT v3. #include #include #include +#include #include +#include "hf_download.h" #include "audio_decode.h" #include "sidecar_text.h" #include "sidecar_sysinfo.h" +#include #include #include #include @@ -40,6 +44,7 @@ #include #include #include +#include #include #include #include @@ -138,6 +143,38 @@ static fs::path clips_cache_dir() { return dir; } +static std::string model_cache_root() { + if (const char* c = std::getenv("SONIQO_MODEL_CACHE_DIR"); c && *c) return c; + if (const char* c = std::getenv("SPEECH_CORE_CACHE_DIR"); c && *c) return c; +#if defined(_WIN32) + if (const char* la = std::getenv("LOCALAPPDATA"); la && *la) + return std::string(la) + "/speech-core"; +#elif defined(__APPLE__) + if (const char* h = std::getenv("HOME"); h && *h) + return std::string(h) + "/Library/Caches/speech-core"; +#else + if (const char* x = std::getenv("XDG_CACHE_HOME"); x && *x) + return std::string(x) + "/speech-core"; + if (const char* h = std::getenv("HOME"); h && *h) + return std::string(h) + "/.cache/speech-core"; +#endif + return "./speech-core-cache"; +} + +static std::string sanitize_repo_id(const std::string& id) { + std::string s; + for (char c : id) { + if (c == '/' || c == '\\') s += "__"; + else s += c; + } + return s; +} + +static std::string format_mb(uint64_t bytes) { + const uint64_t mb = 1024ull * 1024ull; + return std::to_string((bytes + mb - 1) / mb) + " MB"; +} + // --------------------------------------------------------------------------- // VoxCPM2 model state (one warm handle across calls) // --------------------------------------------------------------------------- @@ -343,6 +380,142 @@ static void handle_transcribe(const json::Dict& req, const std::string& id) { "\"text\":\"" + json_escape(res.text) + "\"}}"); } +// transcribe_parakeet — user-facing dictation/transcription. Uses the same +// logical Parakeet TDT v3 family as the macOS sidecar, backed by the LiteRT +// INT8 bundle on Windows/Linux. The bundle is downloaded on first use unless +// SONIQO_PARAKEET_BUNDLE_DIR points at a pre-provisioned directory. +static std::unique_ptr g_parakeet; +static std::string g_parakeet_dir; +static std::string g_parakeet_model_id; + +static void on_parakeet_download_progress(const std::string& file, int idx, int count, + uint64_t downloaded, uint64_t total) { + static std::string last_file; + static int last_pct = -1; + if (last_file != file) { + last_file = file; + last_pct = -1; + } + const double file_fraction = total ? static_cast(downloaded) / total : 0.0; + const double overall = count > 0 + ? ((static_cast(idx) + file_fraction) / static_cast(count)) * 100.0 + : file_fraction * 100.0; + const int pct = static_cast(overall + 0.5); + if (pct != last_pct && (pct % 5 == 0 || pct == 100)) { + last_pct = pct; + std::string detail = "Downloading Parakeet"; + if (total) detail += " " + format_mb(downloaded) + " / " + format_mb(total); + log_err("[sidecar] parakeet " + std::to_string(pct) + "% " + detail); + } +} + +static bool parakeet_bundle_exists(const std::string& dir) { + return fs::exists(fs::path(dir) / "parakeet-encoder.tflite") && + fs::exists(fs::path(dir) / "parakeet-decoder-joint.tflite") && + fs::exists(fs::path(dir) / "vocab.json"); +} + +static std::string ensure_parakeet_bundle(std::string& model_id_out) { + std::string dir = env_or("SONIQO_PARAKEET_BUNDLE_DIR", ""); + if (!dir.empty()) { + if (!parakeet_bundle_exists(dir)) { + throw std::runtime_error( + "Parakeet bundle not found at " + dir + + " (expected parakeet-encoder.tflite, parakeet-decoder-joint.tflite, vocab.json)"); + } + model_id_out = env_or("SONIQO_PARAKEET_MODEL_ID", + "soniqo/Parakeet-TDT-0.6B-v3-LiteRT-INT8"); + return dir; + } + + if (!speech_core::hf::download_supported()) { + throw std::runtime_error( + "SONIQO_PARAKEET_BUNDLE_DIR is unset and this speech-core build has no " + "model-download support (rebuild with -DSPEECH_CORE_WITH_HF_DOWNLOAD=ON)"); + } + + const std::string model_id = env_or("SONIQO_PARAKEET_MODEL_ID", + "soniqo/Parakeet-TDT-0.6B-v3-LiteRT-INT8"); + const std::string dir_out = model_cache_root() + "/" + sanitize_repo_id(model_id); + if (parakeet_bundle_exists(dir_out)) { + model_id_out = model_id; + return dir_out; + } + const std::vector files = { + "parakeet-encoder.tflite", + "parakeet-decoder-joint.tflite", + "vocab.json", + "config.json", + }; + log_err("[sidecar] ensuring Parakeet ASR bundle " + model_id + " …"); + speech_core::hf::download_bundle( + model_id, "main", files, dir_out, on_parakeet_download_progress); + if (!parakeet_bundle_exists(dir_out)) { + throw std::runtime_error("Parakeet bundle incomplete after download: " + dir_out); + } + model_id_out = model_id; + return dir_out; +} + +static std::string ensure_parakeet_model() { + try { + std::string model_id; + const std::string dir = ensure_parakeet_bundle(model_id); + if (g_parakeet && g_parakeet_dir == dir) return ""; + log_err("[sidecar] loading Parakeet LiteRT bundle from " + dir); + g_parakeet = std::make_unique( + dir + "/parakeet-encoder.tflite", + dir + "/parakeet-decoder-joint.tflite", + dir + "/vocab.json", + /*hw_accel=*/false); + g_parakeet_dir = dir; + g_parakeet_model_id = model_id; + log_err("[sidecar] parakeet ready"); + return ""; + } catch (const std::exception& e) { + g_parakeet.reset(); + return std::string("Parakeet ASR load failed: ") + e.what(); + } +} + +static void handle_transcribe_parakeet(const json::Dict& req, const std::string& id) { + const std::string audio_path = get(req, "audioPath"); + if (audio_path.empty()) { + emit_error(id, "transcribe_parakeet requires audioPath"); + return; + } + + const auto started = std::chrono::steady_clock::now(); + std::vector audio; + int rate = 0; + if (!load_audio_mono(audio_path, audio, rate) || audio.empty()) { + emit_error(id, "could not decode audio: " + audio_path); + return; + } + std::vector a16 = (rate == 16000) + ? std::move(audio) + : speech_core::Resampler::resample(audio.data(), audio.size(), rate, 16000); + + if (std::string err = ensure_parakeet_model(); !err.empty()) { + emit_error(id, err); + return; + } + auto res = g_parakeet->transcribe(a16.data(), a16.size(), 16000); + const double duration = static_cast(a16.size()) / 16000.0; + const double elapsed = std::chrono::duration( + std::chrono::steady_clock::now() - started).count(); + char numeric[160]; + std::snprintf(numeric, sizeof(numeric), + "\"sampleRate\":16000,\"durationSec\":%.6f,\"elapsedSec\":%.6f", + duration, elapsed); + emit_line("{\"id\":\"" + json_escape(id) + "\",\"ok\":true,\"result\":{" + + "\"text\":\"" + json_escape(res.text) + "\"," + + "\"language\":\"" + json_escape(res.language) + "\"," + + "\"modelName\":\"parakeet-tdt-v3-0.6b-int8\"," + + "\"modelId\":\"" + json_escape(g_parakeet_model_id) + "\"," + + numeric + "}}"); +} + static void handle_synthesize(const json::Dict& req, const std::string& id) { const std::string ref_path = get(req, "referenceAudioPath"); const std::string text = get(req, "text"); @@ -485,6 +658,8 @@ int main() { handle_probe(req, id); } else if (command == "transcribe") { handle_transcribe(req, id); + } else if (command == "transcribe_parakeet") { + handle_transcribe_parakeet(req, id); } else { emit_error(id, "unknown command: " + command); } diff --git a/model-registry.json b/model-registry.json new file mode 100644 index 0000000..9c19570 --- /dev/null +++ b/model-registry.json @@ -0,0 +1,460 @@ +{ + "version": 1, + "ttsEngines": [ + { + "id": "voxcpm2", + "displayName": "VoxCPM2", + "modelName": "voxcpm2-mlx-bf16", + "modelId": "aufklarer/VoxCPM2-MLX-bf16", + "modelSize": "1.7B", + "runtime": "MLX", + "precision": "bf16", + "languages": [ + "ar", + "my", + "zh", + "da", + "nl", + "en", + "fi", + "fr", + "de", + "el", + "he", + "hi", + "id", + "it", + "ja", + "km", + "ko", + "lo", + "ms", + "no", + "pl", + "pt", + "ru", + "es", + "sw", + "sv", + "tl", + "th", + "tr", + "vi" + ], + "voiceProfileModes": ["reference-clone"], + "requiresReferenceAudio": true, + "requiresReferenceTranscript": false, + "requiresLanguage": false, + "styleMode": "instruction", + "supportsInstruct": true, + "supportedMarkers": [ + "soft", + "warm", + "whispering", + "intense", + "excited", + "happy", + "calm", + "serious", + "surprised", + "sad", + "angry", + "dramatic", + "laughs" + ], + "needsTrim": true, + "sampleRate": 48000, + "usePolicy": "commercial-safe", + "readiness": "production", + "sidecarCommand": "synthesize_voxcpm2", + "macosOnly": false, + "platformOverrides": { + "linux": { + "modelName": "voxcpm2-litert-fp16", + "modelId": "soniqo/VoxCPM2-LiteRT", + "runtime": "LiteRT", + "precision": "fp16" + }, + "windows": { + "modelName": "voxcpm2-litert-fp16", + "modelId": "soniqo/VoxCPM2-LiteRT", + "runtime": "LiteRT", + "precision": "fp16" + } + } + }, + { + "id": "cosyvoice", + "displayName": "CosyVoice 3", + "modelName": "cosyvoice-3-0.5b-mlx-bf16", + "modelId": "aufklarer/CosyVoice3-0.5B-MLX-bf16", + "modelSize": "0.5B", + "runtime": "MLX", + "precision": "bf16", + "languages": ["en", "zh", "ja", "ko", "de", "es", "fr", "it", "ru"], + "voiceProfileModes": ["reference-clone"], + "requiresReferenceAudio": true, + "requiresReferenceTranscript": true, + "requiresLanguage": true, + "styleMode": "instruction", + "supportsInstruct": true, + "supportedMarkers": [ + "soft", + "warm", + "whispering", + "intense", + "excited", + "happy", + "calm", + "serious", + "surprised", + "sad", + "angry", + "dramatic", + "laughs" + ], + "needsTrim": true, + "sampleRate": 24000, + "usePolicy": "commercial-safe", + "readiness": "production", + "sidecarCommand": "synthesize_cosyvoice", + "macosOnly": true + }, + { + "id": "qwen3", + "displayName": "Qwen3-TTS", + "modelName": "qwen3-tts-1.7b-mlx-bf16", + "modelId": "aufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-bf16", + "modelSize": "1.7B", + "runtime": "MLX", + "precision": "bf16", + "languages": ["zh", "en", "ja", "ko", "de", "fr", "ru", "pt", "es", "it"], + "voiceProfileModes": ["reference-clone"], + "requiresReferenceAudio": true, + "requiresReferenceTranscript": true, + "requiresLanguage": true, + "styleMode": "none", + "supportsInstruct": false, + "supportedMarkers": [], + "needsTrim": true, + "sampleRate": 24000, + "usePolicy": "commercial-safe", + "readiness": "legacy-fallback", + "sidecarCommand": "synthesize_icl", + "macosOnly": true + }, + { + "id": "chatterbox", + "displayName": "Chatterbox", + "modelName": "chatterbox-multilingual-mlx-fp16", + "modelId": "aufklarer/Chatterbox-Multilingual-MLX-fp16", + "modelSize": "0.5B", + "runtime": "MLX", + "precision": "fp16", + "languages": [ + "ar", + "da", + "de", + "el", + "en", + "es", + "fi", + "fr", + "hi", + "it", + "ja", + "ko", + "ms", + "nl", + "no", + "pl", + "pt", + "ru", + "sv", + "sw", + "tr", + "zh" + ], + "benchmarkLanguages": [ + "ar", + "da", + "de", + "el", + "en", + "es", + "fi", + "fr", + "hi", + "it", + "ja", + "ko", + "ms", + "nl", + "no", + "pl", + "pt", + "ru", + "sv", + "sw", + "tr", + "zh" + ], + "voiceProfileModes": ["reference-clone"], + "requiresReferenceAudio": true, + "requiresReferenceTranscript": false, + "requiresLanguage": true, + "styleMode": "intensity", + "supportsInstruct": false, + "supportedMarkers": [ + "soft", + "warm", + "whispering", + "intense", + "excited", + "happy", + "calm", + "serious", + "surprised", + "sad", + "angry", + "dramatic", + "laughs" + ], + "needsTrim": true, + "sampleRate": 24000, + "usePolicy": "commercial-safe", + "readiness": "production", + "sidecarCommand": "synthesize_chatterbox", + "macosOnly": true + }, + { + "id": "omnivoice", + "displayName": "OmniVoice", + "modelName": "omnivoice-mlx-fp16", + "modelId": "aufklarer/OmniVoice-MLX-fp16", + "modelSize": "0.5B", + "runtime": "MLX", + "precision": "fp16", + "languages": ["en", "hi", "ru", "es", "fr", "de", "it", "pt", "zh", "ja", "ko"], + "voiceProfileModes": ["reference-clone"], + "requiresReferenceAudio": true, + "requiresReferenceTranscript": false, + "requiresLanguage": true, + "styleMode": "controlled-vocabulary", + "supportsInstruct": false, + "supportedMarkers": [ + "whispering", + "excited", + "happy", + "calm", + "serious", + "sad", + "angry" + ], + "needsTrim": true, + "sampleRate": 24000, + "usePolicy": "commercial-safe", + "readiness": "production", + "sidecarCommand": "synthesize_omnivoice", + "macosOnly": true + }, + { + "id": "indic-mio", + "displayName": "Indic-Mio", + "modelName": "indic-mio-mlx-fp16", + "modelId": "aufklarer/Indic-Mio-MLX-fp16", + "modelSize": "0.6B", + "runtime": "MLX", + "precision": "fp16", + "languages": ["hi", "en"], + "voiceProfileModes": ["reference-clone"], + "requiresReferenceAudio": true, + "requiresReferenceTranscript": false, + "requiresLanguage": false, + "styleMode": "suffix-tag", + "supportsInstruct": false, + "supportedMarkers": ["happy", "sad", "angry", "disgust", "fear", "surprise"], + "needsTrim": true, + "sampleRate": 24000, + "usePolicy": "commercial-safe", + "readiness": "production", + "sidecarCommand": "synthesize_indic_mio", + "macosOnly": true + }, + { + "id": "fish-audio", + "displayName": "Fish Audio S2 Pro", + "modelName": "fish-audio-s2-pro-mlx-fp16", + "modelId": "aufklarer/Fish-Audio-S2-Pro-MLX-fp16", + "modelSize": "S2 Pro", + "runtime": "MLX", + "precision": "fp16", + "languages": [ + "ja", + "en", + "zh", + "ko", + "es", + "pt", + "ar", + "ru", + "fr", + "de", + "sv", + "it", + "tr", + "no", + "nl", + "cy", + "eu", + "ca", + "da", + "gl", + "ta", + "hu", + "fi", + "pl", + "et", + "hi", + "la", + "ur", + "th", + "vi", + "jw", + "bn", + "yo", + "xsl", + "cs", + "sw", + "nn", + "he", + "ms", + "uk", + "id", + "kk", + "bg", + "lv", + "my", + "tl", + "sk", + "ne", + "fa", + "af", + "el", + "bo", + "hr", + "ro", + "sn", + "mi", + "yi", + "am", + "be", + "km", + "is", + "az", + "sd", + "br", + "sq", + "ps", + "mn", + "ht", + "ml", + "sr", + "sa", + "te", + "ka", + "bs", + "pa", + "lt", + "kn", + "si", + "hy", + "mr", + "as", + "gu", + "fo" + ], + "benchmarkLanguages": [ + "ar", + "my", + "zh", + "da", + "nl", + "en", + "fi", + "fr", + "de", + "el", + "he", + "hi", + "id", + "it", + "ja", + "km", + "ko", + "ms", + "no", + "pl", + "pt", + "ru", + "es", + "sw", + "sv", + "tl", + "th", + "tr", + "vi" + ], + "voiceProfileModes": ["reference-clone"], + "requiresReferenceAudio": true, + "requiresReferenceTranscript": true, + "requiresLanguage": false, + "styleMode": "bracket-tag", + "supportsInstruct": false, + "supportedMarkers": [ + "pause", + "emphasis", + "laughing", + "excited", + "angry", + "whisper", + "screaming", + "shouting", + "surprised", + "sad" + ], + "needsTrim": false, + "sampleRate": 44100, + "usePolicy": "research-only", + "readiness": "benchmark", + "sidecarCommand": "synthesize_fish_audio", + "macosOnly": true + } + ], + "asrModels": [ + { + "id": "parakeet-tdt-v3", + "displayName": "Parakeet TDT v3", + "modelName": "parakeet-tdt-v3-0.6b-int8", + "modelId": "aufklarer/Parakeet-TDT-v3-CoreML-INT8-30s", + "modelSize": "0.6B", + "languages": ["en"], + "runtime": "coreml", + "sampleRate": 16000, + "maxSegmentSec": 30, + "streaming": true, + "readiness": "production", + "sidecarCommand": "transcribe_parakeet", + "platformOverrides": { + "linux": { + "modelId": "soniqo/Parakeet-TDT-0.6B-v3-LiteRT-INT8", + "runtime": "litert" + }, + "windows": { + "modelId": "soniqo/Parakeet-TDT-0.6B-v3-LiteRT-INT8", + "runtime": "litert" + } + } + } + ] +} diff --git a/scripts/tts_roundtrip_matrix.py b/scripts/tts_roundtrip_matrix.py new file mode 100644 index 0000000..76197c5 --- /dev/null +++ b/scripts/tts_roundtrip_matrix.py @@ -0,0 +1,804 @@ +#!/usr/bin/env python3 +"""Run a multilingual TTS -> ASR intelligibility matrix against the Swift sidecar. + +The matrix is intentionally a smoke benchmark: one short sentence per +model/language pair, synthesized through the sidecar protocol, transcribed by +the local `speech` CLI, then scored with token precision/recall and WER. +""" + +from __future__ import annotations + +import argparse +import csv +import datetime as dt +import json +import os +import queue +import re +import shutil +import subprocess +import sys +import threading +import time +import unicodedata +from collections import Counter, defaultdict +from dataclasses import dataclass, field +from pathlib import Path +from typing import Any + + +ROOT = Path(__file__).resolve().parents[1] +SIDECAR = ROOT / "swift-sidecar/.build/debug/soniqo-tts-sidecar" +REGISTRY_PATH = ROOT / "model-registry.json" +REF_TEXT = ( + "Hello. This is a clean reference voice spoken slowly and clearly for " + "speech synthesis testing." +) + +TEXTS: dict[str, str] = { + "ar": "اليوم نختبر ما إذا كان الكلام واضحا وسهل الفهم.", + "da": "I dag tester vi, om talen er klar og let at forstå.", + "de": "Heute testen wir, ob die Sprache klar und leicht zu verstehen ist.", + "el": "Σήμερα ελέγχουμε αν η ομιλία είναι καθαρή και εύκολη στην κατανόηση.", + "en": "Today we test whether the speech is clear and easy to understand.", + "es": "Hoy probamos si el habla es clara y fácil de entender.", + "fi": "Tänään testaamme, onko puhe selkeää ja helppoa ymmärtää.", + "fr": "Aujourd'hui, nous testons si la parole est claire et facile à comprendre.", + "he": "היום אנחנו בודקים אם הדיבור ברור וקל להבנה.", + "hi": "आज हम जाँचते हैं कि आवाज़ साफ़ और समझने में आसान है या नहीं।", + "id": "Hari ini kami menguji apakah ucapan jelas dan mudah dipahami.", + "it": "Oggi testiamo se il parlato è chiaro e facile da capire.", + "ja": "今日は音声が明瞭で理解しやすいかをテストします。", + "km": "ថ្ងៃនេះយើងសាកល្បងថាសំឡេងច្បាស់ និងងាយស្រួលយល់ឬអត់។", + "ko": "오늘 우리는 음성이 명확하고 이해하기 쉬운지 테스트합니다.", + "lo": "ມື້ນີ້ພວກເຮົາທົດສອບວ່າສຽງຊັດເຈນ ແລະ ເຂົ້າໃຈງ່າຍຫຼືບໍ່.", + "ms": "Hari ini kami menguji sama ada pertuturan jelas dan mudah difahami.", + "my": "ဒီနေ့ အသံက ရှင်းလင်းပြီး နားလည်ရလွယ်မလွယ် စမ်းသပ်ပါမယ်။", + "nl": "Vandaag testen we of de spraak duidelijk en gemakkelijk te begrijpen is.", + "no": "I dag tester vi om talen er klar og lett å forstå.", + "pl": "Dzisiaj sprawdzamy, czy mowa jest wyraźna i łatwa do zrozumienia.", + "pt": "Hoje testamos se a fala é clara e fácil de entender.", + "ru": "Сегодня мы проверяем, является ли речь четкой и легкой для понимания.", + "sv": "I dag testar vi om talet är tydligt och lätt att förstå.", + "sw": "Leo tunajaribu kama hotuba iko wazi na ni rahisi kuelewa.", + "th": "วันนี้เราทดสอบว่าเสียงพูดชัดเจนและเข้าใจง่ายหรือไม่", + "tl": "Ngayon sinusubukan natin kung malinaw at madaling maunawaan ang pagsasalita.", + "tr": "Bugün konuşmanın net ve kolay anlaşılır olup olmadığını test ediyoruz.", + "vi": "Hôm nay chúng tôi kiểm tra xem giọng nói có rõ ràng và dễ hiểu không.", + "zh": "今天我们测试语音是否清晰且容易理解。", +} + +COSY_LANGUAGE = { + "zh": "chinese", + "en": "english", + "ja": "japanese", + "ko": "korean", + "de": "german", + "es": "spanish", + "fr": "french", + "it": "italian", + "ru": "russian", +} + + +@dataclass(frozen=True) +class EngineSpec: + id: str + display_name: str + model_id: str + precision: str + runtime: str + command: str + languages: tuple[str, ...] + benchmark_languages: tuple[str, ...] + requires_language: bool + reference_text_required: bool + + +def registry_platform_key() -> str: + if sys.platform == "darwin": + return "macos" + if sys.platform.startswith("win"): + return "windows" + return "linux" + + +def load_engine_specs(path: Path = REGISTRY_PATH) -> dict[str, EngineSpec]: + registry = json.loads(path.read_text(encoding="utf-8")) + platform = registry_platform_key() + engines: dict[str, EngineSpec] = {} + for raw in registry.get("ttsEngines", []): + item = dict(raw) + if item.get("macosOnly") and platform != "macos": + continue + override = (item.get("platformOverrides") or {}).get(platform) or {} + item.update(override) + engines[item["id"]] = EngineSpec( + id=item["id"], + display_name=item["displayName"], + model_id=item["modelId"], + precision=item["precision"], + runtime=item["runtime"], + command=item["sidecarCommand"], + languages=tuple(item["languages"]), + benchmark_languages=tuple(item.get("benchmarkLanguages") or item["languages"]), + requires_language=bool(item["requiresLanguage"]), + reference_text_required=bool(item["requiresReferenceTranscript"]), + ) + return engines + + +ENGINES: dict[str, EngineSpec] = load_engine_specs() + + +@dataclass +class Case: + engine: EngineSpec + language: str + text: str + + @property + def key(self) -> str: + return f"{self.engine.id}__{self.language}" + + +@dataclass +class Attempt: + case: Case + seed: int + ok: bool = False + error: str = "" + audio_path: str = "" + duration_sec: float = 0.0 + synth_sec: float = 0.0 + sample_rate: int = 0 + transcript: str = "" + asr_sec: float = 0.0 + asr_rtf: float = 0.0 + precision: float = 0.0 + recall: float = 0.0 + wer: float = 1.0 + accuracy: float = 0.0 + pass_intelligibility: bool = False + verdict: str = "failed" + regression: str = "" + metadata: dict[str, Any] = field(default_factory=dict) + + @property + def stem(self) -> str: + return safe_name(f"{self.case.engine.id}__{self.case.language}__s{self.seed}") + + +def safe_name(value: str) -> str: + return re.sub(r"[^A-Za-z0-9_.-]+", "_", value) + + +def run(cmd: list[str], *, timeout: float | None = None) -> subprocess.CompletedProcess[str]: + return subprocess.run( + cmd, + text=True, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + timeout=timeout, + check=False, + ) + + +def ensure_reference(outdir: Path) -> Path: + ref_path = outdir / "ref-samantha.wav" + if ref_path.exists(): + return ref_path + cp = run( + [ + "say", + "-v", + "Samantha", + "-o", + str(ref_path), + "--file-format=WAVE", + "--data-format=LEI16@22050", + REF_TEXT, + ], + timeout=30, + ) + if cp.returncode != 0: + raise RuntimeError(f"failed to generate reference with say:\n{cp.stdout}") + return ref_path + + +class Sidecar: + def __init__(self, binary: Path, log_path: Path): + if not binary.exists(): + raise FileNotFoundError(f"sidecar binary not found: {binary}") + self.log_file = log_path.open("w", encoding="utf-8") + self.proc = subprocess.Popen( + [str(binary)], + cwd=str(ROOT), + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=self.log_file, + text=True, + bufsize=1, + ) + self._responses: queue.Queue[str] = queue.Queue() + self._reader = threading.Thread(target=self._read_stdout, daemon=True) + self._reader.start() + + def _read_stdout(self) -> None: + assert self.proc.stdout is not None + for line in self.proc.stdout: + self._responses.put(line) + + def request(self, payload: dict[str, Any], timeout: float) -> dict[str, Any]: + if self.proc.poll() is not None: + raise RuntimeError(f"sidecar exited with code {self.proc.returncode}") + assert self.proc.stdin is not None + self.proc.stdin.write(json.dumps(payload, ensure_ascii=False) + "\n") + self.proc.stdin.flush() + try: + line = self._responses.get(timeout=timeout) + except queue.Empty as exc: + raise TimeoutError(f"sidecar timeout for {payload.get('id')}") from exc + return json.loads(line) + + def close(self) -> None: + if self.proc.poll() is None: + self.proc.terminate() + try: + self.proc.wait(timeout=5) + except subprocess.TimeoutExpired: + self.proc.kill() + self.proc.wait(timeout=5) + self.log_file.close() + + +def target_word_count(text: str) -> int: + tokens = tokenize(text) + return max(1, len(tokens)) + + +def clamp(value: int, lo: int, hi: int) -> int: + return max(lo, min(hi, value)) + + +def language_payload(engine: EngineSpec, language: str, routing: str) -> str | None: + if routing == "production" and not engine.requires_language: + return None + if engine.id == "cosyvoice": + return COSY_LANGUAGE.get(language, language) + if engine.id in {"omnivoice", "indic-mio"} and language == "hi": + return "hindi" + if engine.id == "indic-mio" and language == "en": + return "english" + return language + + +def synthesize( + sidecar: Sidecar, + case: Case, + seed: int, + ref_path: Path, + audio_dir: Path, + routing: str, + timeout: float, +) -> Attempt: + attempt = Attempt(case=case, seed=seed) + lang_dir = audio_dir / case.language + lang_dir.mkdir(parents=True, exist_ok=True) + started = time.monotonic() + words = target_word_count(case.text) + max_tokens = clamp(words * 12 + 40, 60, 320) + min_stop_steps = clamp(words * 5 // 2, 8, max_tokens - 16) + payload: dict[str, Any] = { + "id": attempt.stem, + "command": case.engine.command, + "engine": case.engine.id, + "modelId": case.engine.model_id, + "text": case.text, + "voiceId": f"matrix-{case.engine.id}", + "referenceAudioPath": str(ref_path), + "seed": seed, + "cfgValue": 2.0, + "maxTokens": max_tokens, + "minStopSteps": min_stop_steps, + } + if case.engine.reference_text_required: + payload["referenceText"] = REF_TEXT + language = language_payload(case.engine, case.language, routing) + if language: + payload["language"] = language + attempt.metadata["languageSent"] = language or "" + attempt.metadata["maxTokens"] = max_tokens + attempt.metadata["minStopSteps"] = min_stop_steps + + try: + response = sidecar.request(payload, timeout=timeout) + except Exception as exc: # noqa: BLE001 - preserve error in report + attempt.error = str(exc) + attempt.synth_sec = time.monotonic() - started + return attempt + + attempt.synth_sec = time.monotonic() - started + if response.get("ok") is not True: + attempt.error = str(response.get("error") or "synthesis failed") + return attempt + result = response.get("result") or {} + src = result.get("audioPath") + if not src or not Path(src).exists(): + attempt.error = f"missing output audio: {src}" + return attempt + dest = lang_dir / f"{attempt.stem}.wav" + shutil.copyfile(src, dest) + attempt.audio_path = str(dest) + attempt.duration_sec = float(result.get("durationSec") or 0.0) + attempt.sample_rate = int(result.get("sampleRate") or 0) + attempt.ok = True + return attempt + + +def is_cjk_char(ch: str) -> bool: + code = ord(ch) + return ( + 0x3400 <= code <= 0x4DBF + or 0x4E00 <= code <= 0x9FFF + or 0x3040 <= code <= 0x30FF + or 0xAC00 <= code <= 0xD7AF + ) + + +def normalize_text(text: str) -> str: + text = unicodedata.normalize("NFKC", text).casefold() + out: list[str] = [] + for ch in text: + cat = unicodedata.category(ch) + if cat[0] in {"L", "N", "M"} or is_cjk_char(ch): + out.append(ch) + else: + out.append(" ") + return re.sub(r"\s+", " ", "".join(out)).strip() + + +def tokenize(text: str) -> list[str]: + normalized = normalize_text(text) + if not normalized: + return [] + cjk_count = sum(1 for ch in normalized if is_cjk_char(ch)) + if cjk_count >= max(2, len(normalized.replace(" ", "")) // 3): + return [ch for ch in normalized if not ch.isspace()] + return normalized.split() + + +def edit_distance(a: list[str], b: list[str]) -> int: + prev = list(range(len(b) + 1)) + for i, x in enumerate(a, 1): + cur = [i] + for j, y in enumerate(b, 1): + cur.append( + min( + prev[j] + 1, + cur[j - 1] + 1, + prev[j - 1] + (0 if x == y else 1), + ) + ) + prev = cur + return prev[-1] + + +def score(reference: str, hypothesis: str) -> tuple[float, float, float, float]: + ref = tokenize(reference) + hyp = tokenize(hypothesis) + if not ref: + return 0.0, 0.0, 1.0, 0.0 + overlap = sum((Counter(ref) & Counter(hyp)).values()) + precision = overlap / len(hyp) if hyp else 0.0 + recall = overlap / len(ref) + wer = edit_distance(ref, hyp) / len(ref) + accuracy = max(0.0, 1.0 - wer) + return precision, recall, wer, accuracy + + +def classify_intelligibility(attempt: Attempt) -> str: + if not attempt.ok or attempt.error or not attempt.transcript.strip(): + return "failed" + if attempt.precision >= 0.90 and attempt.recall >= 0.90 and attempt.wer <= 0.15: + return "exact" + if attempt.pass_intelligibility: + return "intelligible" + if attempt.precision >= 0.45 and attempt.recall >= 0.40 and attempt.accuracy >= 0.25: + return "word-drift" + return "failed" + + +def parse_asr_jsonl(stdout: str) -> dict[str, dict[str, Any]]: + out: dict[str, dict[str, Any]] = {} + for line in stdout.splitlines(): + line = line.strip() + if not line.startswith("{"): + continue + try: + item = json.loads(line) + except json.JSONDecodeError: + continue + if "file" in item: + out[str(item["file"])] = item + return out + + +def transcribe_by_language( + attempts: list[Attempt], + audio_dir: Path, + asr_dir: Path, + asr_engine: str, + asr_model: str, +) -> None: + by_lang: dict[str, list[Attempt]] = defaultdict(list) + for attempt in attempts: + if attempt.ok and attempt.audio_path: + by_lang[attempt.case.language].append(attempt) + + for language, items in sorted(by_lang.items()): + lang_audio_dir = audio_dir / language + lang_asr_dir = asr_dir / language + lang_asr_dir.mkdir(parents=True, exist_ok=True) + cmd = [ + "speech", + "transcribe-batch", + str(lang_audio_dir), + "--output-dir", + str(lang_asr_dir), + "--engine", + asr_engine, + "--language", + language, + "--jsonl", + ] + if asr_engine == "qwen3": + cmd.extend(["--model", asr_model]) + started = time.monotonic() + cp = run(cmd) + elapsed = time.monotonic() - started + if cp.returncode != 0: + for item in items: + item.error = item.error or f"ASR failed for language {language}: {cp.stdout[-500:]}" + item.verdict = classify_intelligibility(item) + continue + parsed = parse_asr_jsonl(cp.stdout) + for item in items: + row = parsed.get(item.stem) + if not row: + item.error = item.error or f"ASR missing result for {item.stem}" + item.verdict = classify_intelligibility(item) + continue + item.transcript = str(row.get("text") or "").strip() + item.asr_sec = float(row.get("time") or 0.0) + item.asr_rtf = float(row.get("rtf") or 0.0) + item.metadata["asrBatchWallSec"] = elapsed + p, r, wer, acc = score(item.case.text, item.transcript) + item.precision = p + item.recall = r + item.wer = wer + item.accuracy = acc + item.pass_intelligibility = ( + item.precision >= 0.55 + and item.recall >= 0.60 + and item.accuracy >= 0.45 + ) + item.verdict = classify_intelligibility(item) + + +def select_cases(models: list[str], languages: list[str]) -> list[Case]: + selected_engines = ENGINES.keys() if models == ["all"] else models + cases: list[Case] = [] + for engine_id in selected_engines: + if engine_id not in ENGINES: + raise ValueError(f"unknown engine {engine_id}; choose {', '.join(ENGINES)}") + engine = ENGINES[engine_id] + selected_langs = ( + engine.benchmark_languages if languages == ["all"] else tuple(languages) + ) + for language in selected_langs: + if language not in engine.languages: + continue + if language not in TEXTS: + raise ValueError(f"missing test text for language {language}") + cases.append(Case(engine=engine, language=language, text=TEXTS[language])) + return cases + + +def asr_model_descriptor(asr_engine: str, asr_model: str) -> tuple[str, str]: + if asr_engine == "qwen3": + model_ids = { + "0.6B": ("aufklarer/Qwen3-ASR-0.6B-MLX-4bit", "4bit"), + "0.6B-8bit": ("aufklarer/Qwen3-ASR-0.6B-MLX-8bit", "8bit"), + "1.7B": ("aufklarer/Qwen3-ASR-1.7B-MLX-8bit", "8bit"), + "1.7B-4bit": ("aufklarer/Qwen3-ASR-1.7B-MLX-4bit", "4bit"), + } + return model_ids.get(asr_model, (asr_model, "unknown")) + if asr_engine == "parakeet": + return ("aufklarer/Parakeet-TDT-v3-CoreML-INT8-30s", "int8") + return (asr_model or asr_engine, "unknown") + + +def write_reports( + attempts: list[Attempt], + outdir: Path, + baseline: dict[str, Any] | None, + asr_engine: str, + asr_model: str, +) -> None: + asr_model_id, asr_precision = asr_model_descriptor(asr_engine, asr_model) + rows = [] + for attempt in attempts: + key = f"{attempt.case.engine.id}/{attempt.case.language}" + tts_rtf = ( + attempt.synth_sec / attempt.duration_sec + if attempt.ok and attempt.duration_sec > 0 + else 0.0 + ) + if baseline and key in baseline: + base_acc = float(baseline[key].get("accuracy") or 0.0) + delta = attempt.accuracy - base_acc + if delta <= -0.15: + attempt.regression = f"regressed {delta * 100:.0f}pp" + else: + attempt.regression = f"{delta * 100:+.0f}pp" + rows.append( + { + "engine": attempt.case.engine.id, + "displayName": attempt.case.engine.display_name, + "modelId": attempt.case.engine.model_id, + "modelPrecision": attempt.case.engine.precision, + "runtime": attempt.case.engine.runtime, + "language": attempt.case.language, + "languageSent": attempt.metadata.get("languageSent", ""), + "seed": attempt.seed, + "ok": attempt.ok, + "pass": attempt.pass_intelligibility, + "verdict": attempt.verdict, + "precision": round(attempt.precision, 4), + "recall": round(attempt.recall, 4), + "wer": round(attempt.wer, 4), + "accuracy": round(attempt.accuracy, 4), + "durationSec": round(attempt.duration_sec, 3), + "synthSec": round(attempt.synth_sec, 3), + "ttsRtf": round(tts_rtf, 4), + "asrSec": round(attempt.asr_sec, 3), + "asrRtf": round(attempt.asr_rtf, 4), + "asrEngine": asr_engine, + "asrModel": asr_model, + "asrModelId": asr_model_id, + "asrPrecision": asr_precision, + "audioPath": attempt.audio_path, + "target": attempt.case.text, + "transcript": attempt.transcript, + "error": attempt.error, + "regression": attempt.regression, + } + ) + + csv_path = outdir / "tts-roundtrip-matrix.csv" + with csv_path.open("w", encoding="utf-8", newline="") as f: + writer = csv.DictWriter(f, fieldnames=list(rows[0].keys()) if rows else []) + writer.writeheader() + writer.writerows(rows) + + json_path = outdir / "tts-roundtrip-matrix.json" + json_path.write_text(json.dumps(rows, ensure_ascii=False, indent=2), encoding="utf-8") + + summary: dict[str, Any] = {} + for engine_id in ENGINES: + engine_rows = [r for r in rows if r["engine"] == engine_id] + if not engine_rows: + continue + warm_rows = engine_rows[1:] if len(engine_rows) > 1 else engine_rows + verdict_counts = Counter(str(r["verdict"]) for r in engine_rows) + summary[engine_id] = { + "modelId": ENGINES[engine_id].model_id, + "precision": ENGINES[engine_id].precision, + "runtime": ENGINES[engine_id].runtime, + "cases": len(engine_rows), + "passed": sum(1 for r in engine_rows if r["pass"]), + "passRate": sum(1 for r in engine_rows if r["pass"]) / len(engine_rows), + "verdicts": { + "exact": verdict_counts.get("exact", 0), + "intelligible": verdict_counts.get("intelligible", 0), + "word-drift": verdict_counts.get("word-drift", 0), + "failed": verdict_counts.get("failed", 0), + }, + "meanPrecision": sum(float(r["precision"]) for r in engine_rows) / len(engine_rows), + "meanRecall": sum(float(r["recall"]) for r in engine_rows) / len(engine_rows), + "meanWer": sum(float(r["wer"]) for r in engine_rows) / len(engine_rows), + "meanTtsRtf": sum(float(r["ttsRtf"]) for r in engine_rows) / len(engine_rows), + "warmMeanTtsRtf": sum(float(r["ttsRtf"]) for r in warm_rows) / len(warm_rows), + "meanAsrRtf": sum(float(r["asrRtf"]) for r in engine_rows) / len(engine_rows), + "exactLanguages": [r["language"] for r in engine_rows if r["verdict"] == "exact"], + "intelligibleLanguages": [ + r["language"] for r in engine_rows if r["verdict"] == "intelligible" + ], + "wordDriftLanguages": [ + r["language"] for r in engine_rows if r["verdict"] == "word-drift" + ], + "failedLanguages": [ + r["language"] for r in engine_rows if r["verdict"] == "failed" + ], + "failures": [ + f"{r['language']} acc={float(r['accuracy']) * 100:.0f}% p={float(r['precision']) * 100:.0f}%" + for r in engine_rows + if r["verdict"] == "failed" + ], + "languageResults": "; ".join( + f"{r['language']} {r['verdict']} " + f"P{float(r['precision']) * 100:.0f} " + f"R{float(r['recall']) * 100:.0f} " + f"WER{float(r['wer']) * 100:.0f}" + for r in engine_rows + ), + } + (outdir / "tts-roundtrip-summary.json").write_text( + json.dumps(summary, ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + md = [ + "# TTS Roundtrip Matrix", + "", + f"Generated: {dt.datetime.now().isoformat(timespec='seconds')}", + "", + "Scores are ASR-derived intelligibility proxies: precision/recall are token overlap; WER is edit distance over normalized tokens or CJK characters.", + f"ASR scorer: `{asr_engine}` `{asr_model}` -> `{asr_model_id}` ({asr_precision}).", + "TTS RTF is wall-clock synthesis seconds divided by generated audio seconds. Warm RTF excludes the first row per engine because the sidecar loads that model lazily on first synthesis.", + "Verdicts: `exact` is a high-overlap transcript; `intelligible` passes the regression threshold with minor wording drift; `word-drift` is related/understandable but not exact enough for a pass; `failed` is empty, unintelligible, wrong-language, or unrelated output.", + "", + "| Engine | TTS artifact | Model precision | Roundtrip per language | Verdicts E/I/D/F | Cases | Passed | Pass rate | Mean ASR precision | Mean recall | Mean WER | TTS RTF | Warm TTS RTF | ASR RTF |", + "|---|---|---|---|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|", + ] + for engine_id, item in summary.items(): + md.append( + "| {engine} | `{model}` | {model_precision} | {language_results} | {verdicts} | {cases} | {passed} | {pass_rate:.0%} | {precision:.0%} | {recall:.0%} | {wer:.0%} | {tts_rtf:.2f} | {warm_tts_rtf:.2f} | {asr_rtf:.2f} |".format( + engine=ENGINES[engine_id].display_name, + model=item["modelId"], + model_precision=item["precision"], + language_results=item["languageResults"], + verdicts="{exact}/{intelligible}/{drift}/{failed}".format( + exact=item["verdicts"]["exact"], + intelligible=item["verdicts"]["intelligible"], + drift=item["verdicts"]["word-drift"], + failed=item["verdicts"]["failed"], + ), + cases=item["cases"], + passed=item["passed"], + pass_rate=item["passRate"], + precision=item["meanPrecision"], + recall=item["meanRecall"], + wer=item["meanWer"], + tts_rtf=item["meanTtsRtf"], + warm_tts_rtf=item["warmMeanTtsRtf"], + asr_rtf=item["meanAsrRtf"], + ) + ) + md.extend( + [ + "", + "## Per Case", + "", + "| Engine | Model precision | Lang | Sent | Verdict | Pass | ASR precision | Recall | WER | Duration | Synth | TTS RTF | ASR RTF | Transcript | Error |", + "|---|---|---|---|---|---:|---:|---:|---:|---:|---:|---:|---:|---|---|", + ] + ) + for r in rows: + transcript = str(r["transcript"]).replace("|", "\\|") + if len(transcript) > 80: + transcript = transcript[:77] + "..." + error = str(r["error"]).replace("|", "\\|") + if len(error) > 80: + error = error[:77] + "..." + md.append( + "| {engine} | {model_precision} | {lang} | {sent} | {verdict} | {passed} | {precision:.0%} | {recall:.0%} | {wer:.0%} | {duration:.1f}s | {synth:.1f}s | {tts_rtf:.2f} | {asr_rtf:.2f} | {transcript} | {error} |".format( + engine=r["displayName"], + model_precision=r["modelPrecision"], + lang=r["language"], + sent=r["languageSent"] or "-", + verdict=r["verdict"], + passed="yes" if r["pass"] else "no", + precision=float(r["precision"]), + recall=float(r["recall"]), + wer=float(r["wer"]), + duration=float(r["durationSec"]), + synth=float(r["synthSec"]), + tts_rtf=float(r["ttsRtf"]), + asr_rtf=float(r["asrRtf"]), + transcript=transcript, + error=error, + ) + ) + (outdir / "tts-roundtrip-report.md").write_text("\n".join(md) + "\n", encoding="utf-8") + + +def load_baseline(path: Path | None) -> dict[str, Any] | None: + if not path: + return None + rows = json.loads(path.read_text(encoding="utf-8")) + return {f"{row['engine']}/{row['language']}": row for row in rows} + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--models", default="all", help="Comma list or all") + parser.add_argument("--languages", default="all", help="Comma list or all") + parser.add_argument("--outdir", default="") + parser.add_argument("--sidecar", default=str(SIDECAR)) + parser.add_argument("--asr-engine", default="qwen3") + parser.add_argument("--asr-model", default="0.6B") + parser.add_argument("--seed", type=int, default=1000) + parser.add_argument("--timeout-sec", type=float, default=600) + parser.add_argument( + "--routing", + choices=("production", "declared"), + default="production", + help="production sends language only when requiresLanguage=true; declared sends it whenever the model-side API accepts one", + ) + parser.add_argument("--baseline-json", default="") + args = parser.parse_args() + + models = [x.strip() for x in args.models.split(",") if x.strip()] + languages = [x.strip() for x in args.languages.split(",") if x.strip()] + outdir = Path(args.outdir) if args.outdir else Path("/tmp/speech-studio-roundtrip") / dt.datetime.now().strftime("%Y%m%d-%H%M%S") + outdir.mkdir(parents=True, exist_ok=True) + audio_dir = outdir / "audio" + asr_dir = outdir / "asr" + audio_dir.mkdir(exist_ok=True) + asr_dir.mkdir(exist_ok=True) + + cases = select_cases(models, languages) + ref_path = ensure_reference(outdir) + print(f"[matrix] output: {outdir}") + print(f"[matrix] cases: {len(cases)}") + print(f"[matrix] reference: {ref_path}") + + attempts: list[Attempt] = [] + sidecar = Sidecar(Path(args.sidecar), outdir / "sidecar.stderr.log") + try: + for index, case in enumerate(cases, 1): + print( + f"[matrix] synth {index}/{len(cases)} {case.engine.id}/{case.language}", + flush=True, + ) + attempt = synthesize( + sidecar, + case, + args.seed, + ref_path, + audio_dir, + args.routing, + args.timeout_sec, + ) + if attempt.ok: + print( + f" ok {attempt.duration_sec:.2f}s audio in {attempt.synth_sec:.1f}s", + flush=True, + ) + else: + print(f" failed: {attempt.error}", flush=True) + attempts.append(attempt) + finally: + sidecar.close() + + print("[matrix] transcribing by language...", flush=True) + transcribe_by_language(attempts, audio_dir, asr_dir, args.asr_engine, args.asr_model) + write_reports( + attempts, + outdir, + load_baseline(Path(args.baseline_json)) if args.baseline_json else None, + args.asr_engine, + args.asr_model, + ) + + passed = sum(1 for item in attempts if item.pass_intelligibility) + print(f"[matrix] pass: {passed}/{len(attempts)}") + print(f"[matrix] report: {outdir / 'tts-roundtrip-report.md'}") + print(f"[matrix] csv: {outdir / 'tts-roundtrip-matrix.csv'}") + return 0 if passed == len(attempts) else 2 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 900eb7f..4d87ec6 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -3469,6 +3469,7 @@ dependencies = [ name = "speech-studio" version = "0.0.8" dependencies = [ + "base64 0.22.1", "chrono", "dirs 5.0.1", "serde", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 2ed3d76..6000552 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -28,3 +28,4 @@ chrono = { version = "0.4", features = ["serde"] } dirs = "5" tauri-plugin-updater = "2" tauri-plugin-process = "2" +base64 = "0.22" diff --git a/src-tauri/resources/voices/hindi_fleurs.wav b/src-tauri/resources/voices/hindi_fleurs.wav new file mode 100644 index 0000000000000000000000000000000000000000..2251c6391051d894d38b8ac649c2b3439dfa94fa GIT binary patch literal 122924 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 literal 0 HcmV?d00001 diff --git a/src-tauri/resources/voices/hindi_fleurs_female.wav b/src-tauri/resources/voices/hindi_fleurs_female.wav new file mode 100644 index 0000000000000000000000000000000000000000..873e31a955c0958097e2d56c3074bb2f2b3534b0 GIT binary patch literal 282284 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�F7;oo&ud&k7SV(|$CNko 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 literal 0 HcmV?d00001 diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 1a38d81..ed57174 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1,11 +1,14 @@ +use base64::Engine; use serde::{Deserialize, Serialize}; +use std::collections::HashMap; use std::io::{BufRead, BufReader, Write}; use std::path::{Path, PathBuf}; use std::process::{Child, ChildStdin, ChildStdout, Command, Stdio}; use std::sync::{ atomic::{AtomicU32, Ordering}, - Mutex, + LazyLock, Mutex, }; +use std::time::Instant; use tauri::{Emitter, Manager, State}; use tauri_plugin_dialog::DialogExt; @@ -382,20 +385,28 @@ enum TtsEngine { FishAudio, } -#[derive(Clone, Copy, Serialize)] +#[derive(Clone, Debug, Deserialize, Serialize)] struct TtsEngineInfo { id: TtsEngine, #[serde(rename = "displayName")] - display_name: &'static str, + display_name: String, #[serde(rename = "modelName")] - model_name: &'static str, + model_name: String, #[serde(rename = "modelId")] - model_id: &'static str, + model_id: String, #[serde(rename = "modelSize")] - model_size: &'static str, - languages: &'static [&'static str], + model_size: String, + runtime: String, + precision: String, + languages: Vec, + #[serde( + rename = "benchmarkLanguages", + default, + skip_serializing_if = "Vec::is_empty" + )] + benchmark_languages: Vec, #[serde(rename = "voiceProfileModes")] - voice_profile_modes: &'static [&'static str], + voice_profile_modes: Vec, #[serde(rename = "requiresReferenceAudio")] requires_reference_audio: bool, #[serde(rename = "requiresReferenceTranscript")] @@ -403,263 +414,183 @@ struct TtsEngineInfo { #[serde(rename = "requiresLanguage")] requires_language: bool, #[serde(rename = "styleMode")] - style_mode: &'static str, + style_mode: String, #[serde(rename = "supportsInstruct")] supports_instruct: bool, #[serde(rename = "supportedMarkers")] - supported_markers: &'static [&'static str], + supported_markers: Vec, #[serde(rename = "needsTrim")] needs_trim: bool, #[serde(rename = "sampleRate")] sample_rate: u32, #[serde(rename = "usePolicy")] - use_policy: &'static str, - readiness: &'static str, + use_policy: String, + readiness: String, } -#[derive(Clone, Copy)] +#[derive(Clone, Debug, Deserialize)] +#[serde(rename_all = "camelCase")] struct TtsEngineRegistryEntry { + #[serde(flatten)] info: TtsEngineInfo, - sidecar_command: &'static str, + sidecar_command: String, macos_only: bool, + #[serde(default)] + platform_overrides: HashMap, } -const REFERENCE_CLONE_PROFILE: &[&str] = &["reference-clone"]; -const EN_ZH_LANGUAGES: &[&str] = &["en", "zh"]; -const QWEN_TTS_LANGUAGES: &[&str] = &["zh", "en", "ja", "ko", "de", "fr", "ru", "pt", "es", "it"]; -const CHATTERBOX_LANGUAGES: &[&str] = &[ - "ar", "da", "de", "el", "en", "es", "fi", "fr", "he", "hi", "it", "ja", "ko", "ms", "nl", "no", - "pl", "pt", "ru", "sv", "sw", "tr", "zh", -]; -const OMNIVOICE_LANGUAGES: &[&str] = &[ - "en", "hi", "ru", "es", "fr", "de", "it", "pt", "zh", "ja", "ko", -]; -const HI_EN_LANGUAGES: &[&str] = &["hi", "en"]; -const INSTRUCTION_MARKERS: &[&str] = &[ - "soft", - "warm", - "whispering", - "intense", - "excited", - "happy", - "calm", - "serious", - "surprised", - "sad", - "angry", - "dramatic", - "laughs", -]; -const OMNIVOICE_MARKERS: &[&str] = &[ - "whispering", - "excited", - "happy", - "calm", - "serious", - "sad", - "angry", -]; -const INDIC_MIO_MARKERS: &[&str] = &["happy", "sad", "angry", "disgust", "fear", "surprise"]; -const FISH_AUDIO_MARKERS: &[&str] = &[ - "pause", - "emphasis", - "laughing", - "excited", - "angry", - "whisper", - "screaming", - "shouting", - "surprised", - "sad", -]; - -const TTS_ENGINE_REGISTRY: &[TtsEngineRegistryEntry] = &[ - TtsEngineRegistryEntry { - info: TtsEngineInfo { - id: TtsEngine::VoxCPM2, - display_name: "VoxCPM2", - model_name: "voxcpm2-mlx-int8", - model_id: "aufklarer/VoxCPM2-MLX-int8", - model_size: "1.7B", - languages: EN_ZH_LANGUAGES, - voice_profile_modes: REFERENCE_CLONE_PROFILE, - requires_reference_audio: true, - requires_reference_transcript: false, - requires_language: false, - style_mode: "instruction", - supports_instruct: true, - supported_markers: INSTRUCTION_MARKERS, - needs_trim: true, - sample_rate: 48_000, - use_policy: "commercial-safe", - readiness: "production", - }, - sidecar_command: "synthesize_voxcpm2", - macos_only: false, - }, - TtsEngineRegistryEntry { - info: TtsEngineInfo { - id: TtsEngine::CosyVoice, - display_name: "CosyVoice 3", - model_name: "cosyvoice-3-0.5b-mlx-bf16", - model_id: "aufklarer/CosyVoice3-0.5B-MLX-bf16", - model_size: "0.5B", - languages: EN_ZH_LANGUAGES, - voice_profile_modes: REFERENCE_CLONE_PROFILE, - requires_reference_audio: true, - requires_reference_transcript: true, - requires_language: false, - style_mode: "instruction", - supports_instruct: true, - supported_markers: INSTRUCTION_MARKERS, - needs_trim: true, - sample_rate: 24_000, - use_policy: "commercial-safe", - readiness: "production", - }, - sidecar_command: "synthesize_cosyvoice", - macos_only: true, - }, - TtsEngineRegistryEntry { - info: TtsEngineInfo { - id: TtsEngine::Qwen3, - display_name: "Qwen3-TTS", - model_name: "qwen3-tts-1.7b-mlx-bf16", - model_id: "aufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-bf16", - model_size: "1.7B", - languages: QWEN_TTS_LANGUAGES, - voice_profile_modes: REFERENCE_CLONE_PROFILE, - requires_reference_audio: true, - requires_reference_transcript: true, - requires_language: false, - style_mode: "none", - supports_instruct: false, - supported_markers: &[], - needs_trim: true, - sample_rate: 24_000, - use_policy: "commercial-safe", - readiness: "legacy-fallback", - }, - sidecar_command: "synthesize_icl", - macos_only: true, - }, - TtsEngineRegistryEntry { - info: TtsEngineInfo { - id: TtsEngine::Chatterbox, - display_name: "Chatterbox", - model_name: "chatterbox-multilingual-mlx-fp16", - model_id: "aufklarer/Chatterbox-Multilingual-MLX-fp16", - model_size: "0.5B", - languages: CHATTERBOX_LANGUAGES, - voice_profile_modes: REFERENCE_CLONE_PROFILE, - requires_reference_audio: true, - requires_reference_transcript: false, - requires_language: true, - style_mode: "intensity", - supports_instruct: false, - supported_markers: INSTRUCTION_MARKERS, - needs_trim: true, - sample_rate: 24_000, - use_policy: "commercial-safe", - readiness: "production", - }, - sidecar_command: "synthesize_chatterbox", - macos_only: true, - }, - TtsEngineRegistryEntry { - info: TtsEngineInfo { - id: TtsEngine::OmniVoice, - display_name: "OmniVoice", - model_name: "omnivoice-mlx-int8", - model_id: "aufklarer/OmniVoice-MLX-int8", - model_size: "0.5B", - languages: OMNIVOICE_LANGUAGES, - voice_profile_modes: REFERENCE_CLONE_PROFILE, - requires_reference_audio: true, - requires_reference_transcript: false, - requires_language: true, - style_mode: "controlled-vocabulary", - supports_instruct: false, - supported_markers: OMNIVOICE_MARKERS, - needs_trim: true, - sample_rate: 24_000, - use_policy: "commercial-safe", - readiness: "production", - }, - sidecar_command: "synthesize_omnivoice", - macos_only: true, - }, - TtsEngineRegistryEntry { - info: TtsEngineInfo { - id: TtsEngine::IndicMio, - display_name: "Indic-Mio", - model_name: "indic-mio-mlx-fp16", - model_id: "aufklarer/Indic-Mio-MLX-fp16", - model_size: "0.6B", - languages: HI_EN_LANGUAGES, - voice_profile_modes: REFERENCE_CLONE_PROFILE, - requires_reference_audio: true, - requires_reference_transcript: false, - requires_language: false, - style_mode: "suffix-tag", - supports_instruct: false, - supported_markers: INDIC_MIO_MARKERS, - needs_trim: true, - sample_rate: 24_000, - use_policy: "commercial-safe", - readiness: "production", - }, - sidecar_command: "synthesize_indic_mio", - macos_only: true, - }, - TtsEngineRegistryEntry { - info: TtsEngineInfo { - id: TtsEngine::FishAudio, - display_name: "Fish Audio S2 Pro", - model_name: "fish-audio-s2-pro-mlx-fp16", - model_id: "aufklarer/Fish-Audio-S2-Pro-MLX-fp16", - model_size: "S2 Pro", - languages: HI_EN_LANGUAGES, - voice_profile_modes: REFERENCE_CLONE_PROFILE, - requires_reference_audio: true, - requires_reference_transcript: true, - requires_language: false, - style_mode: "bracket-tag", - supports_instruct: false, - supported_markers: FISH_AUDIO_MARKERS, - needs_trim: false, - sample_rate: 44_100, - use_policy: "research-only", - readiness: "benchmark", - }, - sidecar_command: "synthesize_fish_audio", - macos_only: true, - }, -]; +#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq, Eq)] +#[serde(rename_all = "kebab-case")] +enum AsrModel { + ParakeetTdtV3, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +struct AsrModelInfo { + id: AsrModel, + #[serde(rename = "displayName")] + display_name: String, + #[serde(rename = "modelName")] + model_name: String, + #[serde(rename = "modelId")] + model_id: String, + #[serde(rename = "modelSize")] + model_size: String, + languages: Vec, + runtime: String, + #[serde(rename = "sampleRate")] + sample_rate: u32, + #[serde(rename = "maxSegmentSec")] + max_segment_sec: u32, + streaming: bool, + readiness: String, +} + +#[derive(Clone, Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct AsrModelRegistryEntry { + #[serde(flatten)] + info: AsrModelInfo, + sidecar_command: String, + #[serde(default)] + platform_overrides: HashMap, +} + +#[derive(Clone, Debug, Default, Deserialize)] +#[serde(rename_all = "camelCase")] +struct ModelPlatformOverride { + model_name: Option, + model_id: Option, + runtime: Option, + precision: Option, +} + +#[derive(Clone, Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct ModelRegistry { + version: u32, + tts_engines: Vec, + asr_models: Vec, +} + +impl TtsEngineInfo { + fn apply_platform_override(&mut self, item: &ModelPlatformOverride) { + if let Some(value) = &item.model_name { + self.model_name = value.clone(); + } + if let Some(value) = &item.model_id { + self.model_id = value.clone(); + } + if let Some(value) = &item.runtime { + self.runtime = value.clone(); + } + if let Some(value) = &item.precision { + self.precision = value.clone(); + } + } +} + +impl AsrModelInfo { + fn apply_platform_override(&mut self, item: &ModelPlatformOverride) { + if let Some(value) = &item.model_name { + self.model_name = value.clone(); + } + if let Some(value) = &item.model_id { + self.model_id = value.clone(); + } + if let Some(value) = &item.runtime { + self.runtime = value.clone(); + } + } +} + +fn platform_registry_key() -> &'static str { + if cfg!(target_os = "macos") { + "macos" + } else if cfg!(target_os = "windows") { + "windows" + } else { + "linux" + } +} + +static MODEL_REGISTRY: LazyLock = LazyLock::new(|| { + let mut registry: ModelRegistry = + serde_json::from_str(include_str!("../../model-registry.json")) + .expect("model-registry.json must be valid"); + assert_eq!(registry.version, 1, "unsupported model registry version"); + + let platform = platform_registry_key(); + for entry in &mut registry.tts_engines { + if let Some(item) = entry.platform_overrides.get(platform) { + entry.info.apply_platform_override(item); + } + } + for entry in &mut registry.asr_models { + if let Some(item) = entry.platform_overrides.get(platform) { + entry.info.apply_platform_override(item); + } + } + registry +}); + +impl AsrModel { + fn registry_entry(self) -> &'static AsrModelRegistryEntry { + MODEL_REGISTRY + .asr_models + .iter() + .find(|entry| entry.info.id == self) + .expect("AsrModel missing from ASR_MODEL_REGISTRY") + } + + fn sidecar_command(self) -> &'static str { + self.registry_entry().sidecar_command.as_str() + } +} impl TtsEngine { fn registry_entry(self) -> &'static TtsEngineRegistryEntry { - TTS_ENGINE_REGISTRY + MODEL_REGISTRY + .tts_engines .iter() .find(|entry| entry.info.id == self) .expect("TtsEngine missing from TTS_ENGINE_REGISTRY") } fn sidecar_command(self) -> &'static str { - self.registry_entry().sidecar_command + self.registry_entry().sidecar_command.as_str() } fn display_name(self) -> &'static str { - self.registry_entry().info.display_name + self.registry_entry().info.display_name.as_str() } fn requires_reference_transcript(self) -> bool { self.registry_entry().info.requires_reference_transcript } - /// Whether synthesis needs a caller-chosen language. Chatterbox prepends a - /// `[lang]` token, so the Studio shows a language picker for it; the other - /// engines infer language from the text. + /// Whether synthesis needs a caller-chosen language. The Studio shows a + /// language picker only for engines that declare this in the registry. fn requires_language(self) -> bool { self.registry_entry().info.requires_language } @@ -673,13 +604,25 @@ impl TtsEngine { /// - `bracket-tag`: marker is appended as an engine-specific bracket tag. /// - `none`: markers are stripped and ignored. fn style_mode(self) -> &'static str { - self.registry_entry().info.style_mode + self.registry_entry().info.style_mode.as_str() } } fn normalize_sidecar_language(engine: TtsEngine, language: Option<&str>) -> Option { let trimmed = language.map(str::trim).filter(|value| !value.is_empty()); match engine { + TtsEngine::CosyVoice => trimmed.map(|value| match value.to_ascii_lowercase().as_str() { + "zh" | "zho" | "cmn" | "chinese" => "chinese".to_string(), + "en" | "eng" | "english" => "english".to_string(), + "ja" | "jpn" | "japanese" => "japanese".to_string(), + "ko" | "kor" | "korean" => "korean".to_string(), + "de" | "deu" | "ger" | "german" => "german".to_string(), + "es" | "spa" | "spanish" => "spanish".to_string(), + "fr" | "fra" | "fre" | "french" => "french".to_string(), + "it" | "ita" | "italian" => "italian".to_string(), + "ru" | "rus" | "russian" => "russian".to_string(), + _ => value.to_string(), + }), // The UI keeps BCP-47-ish ids because Chatterbox expects `[hi]`, but // OmniVoice gives cleaner Hindi output with the spelled language item. TtsEngine::OmniVoice | TtsEngine::IndicMio => { @@ -732,15 +675,29 @@ fn humanize_sidecar_error(engine: TtsEngine, error: String) -> String { } fn tts_engine_info(engine: TtsEngine) -> TtsEngineInfo { - engine.registry_entry().info + engine.registry_entry().info.clone() +} + +fn asr_model_info(model: AsrModel) -> AsrModelInfo { + model.registry_entry().info.clone() } #[tauri::command] async fn available_tts_engines() -> Vec { - TTS_ENGINE_REGISTRY + MODEL_REGISTRY + .tts_engines .iter() .filter(|entry| engine_is_supported(entry.info.id)) - .map(|entry| entry.info) + .map(|entry| entry.info.clone()) + .collect() +} + +#[tauri::command] +async fn available_asr_models() -> Vec { + MODEL_REGISTRY + .asr_models + .iter() + .map(|entry| entry.info.clone()) .collect() } @@ -762,10 +719,12 @@ struct InitModelArgs { #[tauri::command] async fn init_model(manager: State<'_, SidecarManager>, args: InitModelArgs) -> Result<(), String> { ensure_engine_supported(args.engine)?; + let info = tts_engine_info(args.engine); let payload = serde_json::json!({ "id": format!("init-{}", uuid::Uuid::new_v4()), "command": "init_model", "engine": args.engine, + "modelId": info.model_id, }); let raw = manager.request(&payload)?; let env: SidecarResponse = serde_json::from_value(raw).map_err(|e| e.to_string())?; @@ -870,9 +829,7 @@ fn reference_access_error(action: &str, path: &Path, err: &std::io::Error) -> St std::io::ErrorKind::NotFound => { "The file is no longer at that path. Re-add the reference from its current location." } - _ => { - "Copy or export the reference audio to a normal local folder, then add it again." - } + _ => "Copy or export the reference audio to a normal local folder, then add it again.", }; format!( "Cannot {action} reference audio \"{}\": {err}. {hint}", @@ -1116,8 +1073,8 @@ struct SynthesizeArgs { reference_audio_path: String, #[serde(rename = "referenceText")] reference_text: String, - /// Synthesis language id (Chatterbox `[lang]` token, e.g. "en"/"ar"/"hi"). - /// Optional; engines that infer language from text ignore it. + /// Synthesis language id for engines with `requiresLanguage=true`. + /// Optional; engines that infer or default language do not receive it. #[serde(default)] language: Option, } @@ -1268,6 +1225,25 @@ fn chunk_text_for_synthesis(text: &str, max_words: usize) -> Vec { chunks } +const DEFAULT_SYNTH_SEED_LADDER: &[u64] = &[1000, 1001, 1002, 1010, 1011, 1012]; + +fn synth_seed_ladder(engine: TtsEngine) -> &'static [u64] { + debug_assert_ne!(engine, TtsEngine::Qwen3); + DEFAULT_SYNTH_SEED_LADDER +} + +fn synth_max_tokens(engine: TtsEngine, target_word_count: usize) -> usize { + if engine == TtsEngine::Qwen3 { + // Qwen3 frames are ~80 ms each. The generic cap lets short lines run + // to 96 frames (~7.7 s of audio, ~12 s wall time) whenever EOS fails. + // Keep enough headroom for slow speech, but prevent minute-long retry + // ladders for one short utterance. + (target_word_count.saturating_mul(4) + 20).clamp(40, 96) + } else { + (target_word_count.saturating_mul(12) + 40).clamp(60, 320) + } +} + /// One synthesis pass (seed/cfg retry ladder + optional ASR grading) for a /// single piece of text. Returns (audio_path, duration_sec) of the accepted /// take. Extracted from synthesize_clip so long-form chunking can call it @@ -1285,15 +1261,12 @@ fn synth_one_line( invocation_salt: &str, part_idx: usize, ) -> Result<(String, f64), String> { - // Seed ladder: both backends are deterministic per seed. VoxCPM2 also - // consumes cfgValue; CosyVoice ignores that optional field. - const SEED_LADDER: &[u64] = &[1000, 1001, 1002, 1010, 1011, 1012]; const CFG_LADDER: &[f32] = &[2.0, 2.5, 3.0]; // Token budget: ~12 steps/word + headroom (each step ≈ 50 ms of audio). let grade_target = strip_style_markers_for_grading(text); let target_word_count = canon_tokens(&grade_target).len(); - let max_tokens = (target_word_count.saturating_mul(12) + 40).clamp(60, 320); + let max_tokens = synth_max_tokens(engine, target_word_count); // Floor under the model's stop signal: VoxCPM2 fires its stop token // prematurely on long non-Latin-script lines (a 19-word Hindi sentence // stops at ~40 steps ≈ 6 s, cutting the sentence). The model speaks @@ -1314,16 +1287,59 @@ fn synth_one_line( .chars() .any(|c| !c.is_ascii() && c.is_alphabetic()); let sidecar_language = normalize_sidecar_language(engine, language); + let model_id = engine.registry_entry().info.model_id.as_str(); let mut best: Option<(String, Grade, u64, f64)> = None; let mut last_error: Option = None; - for (attempt_idx, &seed) in SEED_LADDER.iter().enumerate() { + if engine == TtsEngine::Qwen3 { + let seed = 1000; + let payload = serde_json::json!({ + "id": format!("synth-{}-p{}-s{}-{}", clip_id, part_idx, seed, invocation_salt), + "command": engine.sidecar_command(), + "engine": engine, + "modelId": model_id, + "text": text, + "voiceId": voice_id, + "referenceAudioPath": reference_audio_path, + "referenceText": reference_text, + "language": sidecar_language.as_deref(), + "seed": seed, + "maxTokens": max_tokens, + }); + let raw = manager.request(&payload)?; + let env: SidecarResponse = serde_json::from_value(raw).map_err(|e| e.to_string())?; + if !env.ok { + return Err(humanize_sidecar_error( + engine, + env.error.unwrap_or_else(|| "sidecar error".into()), + )); + } + let result = env.result.unwrap_or_default(); + let audio_path = result + .get("audioPath") + .and_then(|v| v.as_str()) + .ok_or_else(|| "missing audioPath in sidecar response".to_string())? + .to_string(); + let duration = result + .get("durationSec") + .and_then(|v| v.as_f64()) + .unwrap_or(0.0); + validate_synth_audio(&audio_path)?; + eprintln!( + "[synth] clip {} part {} accepted qwen single-shot (seed={}, {:.2}s)", + clip_id, part_idx, seed, duration + ); + return Ok((audio_path, duration)); + } + + for (attempt_idx, &seed) in synth_seed_ladder(engine).iter().enumerate() { let cfg = CFG_LADDER[attempt_idx.min(CFG_LADDER.len() - 1)]; let payload = serde_json::json!({ "id": format!("synth-{}-p{}-s{}-{}", clip_id, part_idx, seed, invocation_salt), "command": engine.sidecar_command(), "engine": engine, + "modelId": model_id, "text": text, "voiceId": voice_id, "referenceAudioPath": reference_audio_path, @@ -2450,11 +2466,9 @@ fn canon_tokens(s: &str) -> Vec { // ---------- demo seed ---------- // -// The demo uses real Qwen3-TTS ICL synthesis. Since Qwen3-TTS needs a -// reference audio + reference transcript per voice, and we don't ship any -// audio in this repo, we bootstrap the references by calling macOS `say` -// (Samantha / Daniel) into a temp WAV. Then we synthesize each demo line -// through the sidecar, which loads the Qwen3-TTS model on first call. +// The demo embeds human reference WAVs. Engines such as Qwen3-TTS and Fish +// Audio need the reference transcript to match that WAV closely, otherwise +// prompt words can leak into the synthesized take. // // First-ever invocation: downloads ~300MB of model weights from HuggingFace, // then ~2-5s per line. Subsequent invocations reuse the warm model. @@ -2487,6 +2501,9 @@ struct DemoSeed { clips: Vec, } +const DEMO_ANNA_REFERENCE_TEXT: &str = "The Hispaniola was rolling scuppers under in the ocean swell. The booms were tearing at the blocks. The rudder was banging."; +const DEMO_MAREK_REFERENCE_TEXT: &str = "It is a pretty little spot there, a green grass plateau running along by the water's edge and overhung by willows."; + fn short_hash(s: &str) -> u32 { // FNV-1a 32-bit. Stable across runs without pulling another crate. let mut h: u32 = 0x811c9dc5; @@ -2511,6 +2528,15 @@ fn clip_cache_dir() -> std::path::PathBuf { dir } +fn dictation_cache_dir() -> std::path::PathBuf { + let dir = dirs::cache_dir() + .unwrap_or_else(std::env::temp_dir) + .join("audio.soniqo.studio") + .join("dictation"); + let _ = std::fs::create_dir_all(&dir); + dir +} + fn wav_duration_sec(path: &std::path::Path) -> Result { use std::io::Read; let mut f = std::fs::File::open(path).map_err(|e| e.to_string())?; @@ -2528,6 +2554,132 @@ fn wav_duration_sec(path: &std::path::Path) -> Result { Ok(audio_bytes as f64 / byte_rate as f64) } +#[derive(Deserialize)] +struct SaveDictationAudioArgs { + #[serde(rename = "wavBase64")] + wav_base64: String, +} + +#[derive(Serialize)] +struct SaveDictationAudioResult { + #[serde(rename = "audioPath")] + audio_path: String, + #[serde(rename = "durationSec")] + duration_sec: f64, +} + +#[tauri::command] +async fn save_dictation_audio( + args: SaveDictationAudioArgs, +) -> Result { + let bytes = base64::engine::general_purpose::STANDARD + .decode(args.wav_base64.trim()) + .map_err(|e| format!("invalid dictation audio payload: {e}"))?; + const MAX_DICTATION_WAV_BYTES: usize = 100 * 1024 * 1024; + if bytes.len() > MAX_DICTATION_WAV_BYTES { + return Err("dictation recording is too large".into()); + } + if bytes.len() < 44 || &bytes[0..4] != b"RIFF" || &bytes[8..12] != b"WAVE" { + return Err("dictation audio must be a WAV file".into()); + } + + let path = + dictation_cache_dir().join(format!("dictation-{}.wav", uuid::Uuid::new_v4().simple())); + std::fs::write(&path, &bytes).map_err(|e| format!("could not write dictation audio: {e}"))?; + let duration_sec = wav_duration_sec(&path).unwrap_or(0.0); + Ok(SaveDictationAudioResult { + audio_path: path.to_string_lossy().to_string(), + duration_sec, + }) +} + +#[derive(Deserialize)] +struct TranscribeAudioArgs { + #[serde(rename = "audioPath")] + audio_path: String, + model: Option, + language: Option, +} + +#[derive(Serialize)] +struct TranscribeAudioResult { + text: String, + #[serde(rename = "modelName")] + model_name: String, + #[serde(rename = "modelId")] + model_id: String, + #[serde(rename = "durationSec")] + duration_sec: f64, + #[serde(rename = "elapsedSec")] + elapsed_sec: f64, + #[serde(skip_serializing_if = "Option::is_none")] + language: Option, +} + +#[tauri::command] +async fn transcribe_audio( + manager: State<'_, SidecarManager>, + args: TranscribeAudioArgs, +) -> Result { + let model = args.model.unwrap_or(AsrModel::ParakeetTdtV3); + let info = asr_model_info(model); + let audio_path = PathBuf::from(&args.audio_path); + let metadata = std::fs::metadata(&audio_path) + .map_err(|e| format!("cannot read dictation audio {}: {e}", audio_path.display()))?; + if !metadata.is_file() { + return Err(format!( + "dictation audio path is not a file: {}", + audio_path.display() + )); + } + + let started = Instant::now(); + let payload = serde_json::json!({ + "id": format!("asr-{}", uuid::Uuid::new_v4().simple()), + "command": model.sidecar_command(), + "audioPath": audio_path.to_string_lossy(), + "language": args.language, + }); + let raw = manager.request(&payload)?; + let env: SidecarResponse = serde_json::from_value(raw).map_err(|e| e.to_string())?; + if !env.ok { + return Err(env + .error + .unwrap_or_else(|| format!("{} transcription failed", info.display_name))); + } + + let result = env.result.unwrap_or_default(); + let text = result + .get("text") + .and_then(|v| v.as_str()) + .unwrap_or("") + .trim() + .to_string(); + let language = result + .get("language") + .and_then(|v| v.as_str()) + .filter(|value| !value.is_empty()) + .map(str::to_string); + let duration_sec = result + .get("durationSec") + .and_then(|v| v.as_f64()) + .or_else(|| wav_duration_sec(&audio_path).ok()) + .unwrap_or(0.0); + let elapsed_sec = result + .get("elapsedSec") + .and_then(|v| v.as_f64()) + .unwrap_or_else(|| started.elapsed().as_secs_f64()); + + Ok(TranscribeAudioResult { + text, + model_name: info.model_name, + model_id: info.model_id, + duration_sec, + elapsed_sec, + language, + }) +} + #[derive(Serialize, Clone)] struct DemoProgress { phase: &'static str, @@ -2554,9 +2706,38 @@ fn emit_progress( ); } +fn demo_clip_seeds(cache_prefix: &str, lines: &[(usize, &str)]) -> Vec { + let cache_dir = clip_cache_dir(); + let mut clips = Vec::with_capacity(lines.len()); + for (idx, (speaker_idx, text)) in lines.iter().enumerate() { + let stable_id = format!( + "{}-s{}-l{}-{:x}", + cache_prefix, + speaker_idx, + idx, + short_hash(text) + ); + let cached_path = cache_dir.join(format!("{}.wav", stable_id)); + let (audio_path, duration_sec) = if cached_path.exists() { + let dur = wav_duration_sec(&cached_path).ok(); + (Some(cached_path.to_string_lossy().to_string()), dur) + } else { + (None, None) + }; + + clips.push(DemoClipSeed { + speaker_index: *speaker_idx, + audio_path, + duration_sec, + text: (*text).to_string(), + }); + } + clips +} + #[tauri::command] async fn seed_demo(app: tauri::AppHandle) -> Result { - eprintln!("[seed_demo] start (lazy mode: no Qwen3 synth, only `say` references)"); + eprintln!("[seed_demo] start (lazy mode: bundled references only)"); emit_progress(&app, "references", 0, 1, "Preparing reference voices…"); let dir = std::env::temp_dir().join("soniqo-demo"); std::fs::create_dir_all(&dir).map_err(|e| format!("mkdir failed: {}", e))?; @@ -2568,17 +2749,17 @@ async fn seed_demo(app: tauri::AppHandle) -> Result { // clips, ~450 KB each, embedded via include_bytes!): // Anna → female reader, ~10s, literary narration. // Marek → male reader, ~9s, calm narration. - // Reference text was produced by Parakeet ASR over the same WAV — close - // enough to verbatim for ICL. + // Reference text must be exact for Qwen3-TTS ICL. A stale Anna transcript + // leaked prompt words into the synthesized take, while Marek stayed clean. let ref_specs: [(&[u8], &str, &str); 2] = [ ( include_bytes!("../resources/voices/anna.wav"), - "The Hispaniola was rolling scuppers under in the ocean swell. The booms were tearing at the blocks, ruddering.", + DEMO_ANNA_REFERENCE_TEXT, "ref-anna.wav", ), ( include_bytes!("../resources/voices/marek.wav"), - "It is a pretty little spot there, a green grass plateau running along by the water's edge and overhung by willows.", + DEMO_MAREK_REFERENCE_TEXT, "ref-marek.wav", ), ]; @@ -2600,9 +2781,7 @@ async fn seed_demo(app: tauri::AppHandle) -> Result { reference_text: (*ref_text).to_string(), }); } - eprintln!( - "[seed_demo] references ready, starting Qwen3-TTS synthesis (first call downloads model)" - ); + eprintln!("[seed_demo] references ready; synthesis is on demand"); // Step 2 — demo lines, each wrapped in a VoxCPM2 style marker. The // sidecar's extractFirstEmotionTag pulls the tag name out and passes it @@ -2623,26 +2802,55 @@ async fn seed_demo(app: tauri::AppHandle) -> Result { // attach its path so the user can immediately play it; otherwise leave // audio_path = None and let the user trigger synthesis explicitly via // Regenerate. No Qwen3 calls happen here — Load demo is ~instant. - let cache_dir = clip_cache_dir(); - let mut clips = Vec::with_capacity(lines.len()); - for (idx, (speaker_idx, text)) in lines.iter().enumerate() { - let stable_id = format!("demo-s{}-l{}-{:x}", speaker_idx, idx, short_hash(text)); - let cached_path = cache_dir.join(format!("{}.wav", stable_id)); - let (audio_path, duration_sec) = if cached_path.exists() { - let dur = wav_duration_sec(&cached_path).ok(); - (Some(cached_path.to_string_lossy().to_string()), dur) - } else { - (None, None) - }; + let clips = demo_clip_seeds("demo", &lines); - clips.push(DemoClipSeed { - speaker_index: *speaker_idx, - audio_path, - duration_sec, - text: (*text).to_string(), + Ok(DemoSeed { voices, clips }) +} + +#[tauri::command] +async fn seed_hindi_demo(app: tauri::AppHandle) -> Result { + eprintln!("[seed_hindi_demo] start"); + emit_progress(&app, "references", 0, 1, "Preparing Hindi reference voice…"); + let dir = std::env::temp_dir().join("soniqo-demo"); + std::fs::create_dir_all(&dir).map_err(|e| format!("mkdir failed: {}", e))?; + + // Two FLEURS hi_in test-split speakers (CC-BY, PCM16 mono 16 kHz), one per + // gender. Reference text must be exact for voice-clone ICL — both + // transcripts are the raw FLEURS transcriptions, ASR-verified against the + // audio (a mismatched transcript leaks prompt words into the takes). + let ref_specs: [(&[u8], &str, &str); 2] = [ + ( + include_bytes!("../resources/voices/hindi_fleurs.wav"), + "लूना को साथी पहलवानों ने भी श्रद्धांजलि दी.", + "ref-hindi-fleurs.wav", + ), + ( + include_bytes!("../resources/voices/hindi_fleurs_female.wav"), + "यह शहर देश के बाकी शहरों से अलग है क्योंकि यह किसी अफ्रीकी शहर की बजाय अरब शहर लगता है.", + "ref-hindi-fleurs-female.wav", + ), + ]; + + let mut voices = Vec::with_capacity(ref_specs.len()); + for (bytes, ref_text, filename) in ref_specs.iter() { + let path = dir.join(filename); + std::fs::write(&path, bytes) + .map_err(|e| format!("write {} failed: {}", path.display(), e))?; + voices.push(DemoVoiceSeed { + reference_audio_path: path.to_string_lossy().to_string(), + reference_text: (*ref_text).to_string(), }); } + // Male (0) and female (1) speakers alternate, like the English demo. + let lines: [(usize, &str); 4] = [ + (0, "(happy) नमस्ते, आज हम हिंदी आवाज़ का परीक्षण कर रहे हैं।"), + (1, "(sad) यह पंक्ति शांत और भावुक सुनाई देनी चाहिए।"), + (0, "(angry) अब आवाज़ में थोड़ी तीव्रता और ज़ोर चाहिए।"), + (1, "(surprised) अंत में यह वाक्य साफ़ और उत्साहित होना चाहिए।"), + ]; + let clips = demo_clip_seeds("demo-hi", &lines); + Ok(DemoSeed { voices, clips }) } @@ -3029,6 +3237,7 @@ pub fn run() { .invoke_handler(tauri::generate_handler![ ping_sidecar, available_tts_engines, + available_asr_models, init_model, interrupt_model_load, pick_video, @@ -3036,6 +3245,8 @@ pub fn run() { import_reference_audio, probe_reference, clone_voice, + save_dictation_audio, + transcribe_audio, synthesize_clip, export_project, list_projects, @@ -3043,6 +3254,7 @@ pub fn run() { load_project, delete_project, seed_demo, + seed_hindi_demo, ]) .run(tauri::generate_context!()) .expect("error while running tauri application"); @@ -3056,10 +3268,16 @@ mod tests { fn tts_engine_protocol_names_are_stable() { let cosy: TtsEngine = serde_json::from_str("\"cosyvoice\"").unwrap(); assert_eq!(cosy, TtsEngine::CosyVoice); + let parakeet: AsrModel = serde_json::from_str("\"parakeet-tdt-v3\"").unwrap(); + assert_eq!(parakeet, AsrModel::ParakeetTdtV3); assert_eq!( serde_json::to_string(&TtsEngine::VoxCPM2).unwrap(), "\"voxcpm2\"" ); + assert_eq!( + serde_json::to_string(&AsrModel::ParakeetTdtV3).unwrap(), + "\"parakeet-tdt-v3\"" + ); assert_eq!( serde_json::to_string(&TtsEngine::IndicMio).unwrap(), "\"indic-mio\"" @@ -3077,6 +3295,7 @@ mod tests { TtsEngine::FishAudio.sidecar_command(), "synthesize_fish_audio" ); + assert_eq!(parakeet.sidecar_command(), "transcribe_parakeet"); } #[test] @@ -3113,6 +3332,15 @@ mod tests { assert!(!TtsEngine::VoxCPM2.requires_reference_transcript()); } + #[test] + fn demo_anna_reference_transcript_matches_bundled_audio() { + assert!( + !DEMO_ANNA_REFERENCE_TEXT.contains("ruddering"), + "stale Anna transcript leaks reference text into Qwen3-TTS ICL output" + ); + assert!(DEMO_ANNA_REFERENCE_TEXT.ends_with("The rudder was banging.")); + } + #[test] fn chatterbox_engine_wiring() { let c: TtsEngine = serde_json::from_str("\"chatterbox\"").unwrap(); @@ -3133,28 +3361,149 @@ mod tests { #[test] fn tts_engine_info_exposes_model_capabilities() { + let vox = tts_engine_info(TtsEngine::VoxCPM2); + assert_eq!(vox.languages.len(), 30); + assert!(vox.languages.iter().any(|language| language == "hi")); + assert!(vox.languages.iter().any(|language| language == "vi")); + assert!(!vox.requires_language); + assert_eq!(vox.model_name, "voxcpm2-mlx-bf16"); + assert_eq!(vox.model_id, "aufklarer/VoxCPM2-MLX-bf16"); + assert_eq!(vox.precision, "bf16"); + + let cosy = tts_engine_info(TtsEngine::CosyVoice); + assert!(cosy.requires_language); + assert_eq!( + cosy.languages, + ["en", "zh", "ja", "ko", "de", "es", "fr", "it", "ru"] + ); + assert!(cosy + .supported_markers + .iter() + .any(|marker| marker == "excited")); + let qwen = tts_engine_info(TtsEngine::Qwen3); assert_eq!(qwen.model_name, "qwen3-tts-1.7b-mlx-bf16"); assert_eq!(qwen.model_id, "aufklarer/Qwen3-TTS-12Hz-1.7B-Base-MLX-bf16"); - assert_eq!(qwen.voice_profile_modes, &["reference-clone"]); + assert_eq!(qwen.voice_profile_modes, ["reference-clone"]); assert!(qwen.requires_reference_audio); assert!(qwen.requires_reference_transcript); + assert!(qwen.requires_language); assert!(!qwen.supports_instruct); assert_eq!(qwen.style_mode, "none"); - assert!(qwen.languages.contains(&"en")); - assert!(qwen.languages.contains(&"ru")); + assert!(qwen.languages.iter().any(|language| language == "en")); + assert!(qwen.languages.iter().any(|language| language == "ru")); assert!(qwen.supported_markers.is_empty()); + assert_eq!(qwen.precision, "bf16"); + + let chatterbox = tts_engine_info(TtsEngine::Chatterbox); + assert_eq!(chatterbox.languages.len(), 22); + assert!(chatterbox.languages.iter().any(|language| language == "zh")); + assert!(chatterbox.languages.iter().any(|language| language == "ja")); + assert!(!chatterbox.languages.iter().any(|language| language == "he")); + assert!(chatterbox.languages.iter().any(|language| language == "ko")); + assert_eq!(chatterbox.precision, "fp16"); + + let omni = tts_engine_info(TtsEngine::OmniVoice); + assert_eq!(omni.model_name, "omnivoice-mlx-fp16"); + assert_eq!(omni.model_id, "aufklarer/OmniVoice-MLX-fp16"); + assert_eq!(omni.precision, "fp16"); let fish = tts_engine_info(TtsEngine::FishAudio); assert_eq!(fish.style_mode, "bracket-tag"); - assert!(fish.supported_markers.contains(&"excited")); + assert!(fish.languages.len() > 70); + assert!(fish + .benchmark_languages + .iter() + .any(|language| language == "hi")); + assert!(fish + .supported_markers + .iter() + .any(|marker| marker == "excited")); assert_eq!(fish.use_policy, "research-only"); assert!(!fish.needs_trim); } + #[test] + fn hindi_demo_reference_is_bundled_pcm_wav() { + let path = std::env::temp_dir().join(format!( + "speech-studio-hindi-ref-{}.wav", + uuid::Uuid::new_v4().simple() + )); + std::fs::write( + &path, + include_bytes!("../resources/voices/hindi_fleurs.wav"), + ) + .unwrap(); + + let (sample_rate, channels, bits) = read_wav_header(&path).unwrap(); + assert_eq!(sample_rate, 16_000); + assert_eq!(channels, 1); + assert_eq!(bits, 16); + + let duration = wav_duration_sec(&path).unwrap(); + assert!( + (3.7..4.0).contains(&duration), + "unexpected Hindi reference duration: {duration}" + ); + + let _ = std::fs::remove_file(path); + } + + #[test] + fn tts_registry_defaults_keep_16bit_precision_floor() { + for entry in MODEL_REGISTRY + .tts_engines + .iter() + .filter(|entry| engine_is_supported(entry.info.id)) + { + assert!( + matches!(entry.info.precision.as_str(), "bf16" | "fp16"), + "{} default precision should stay 16-bit, got {}", + entry.info.model_name, + entry.info.precision + ); + assert!( + !entry.info.model_id.contains("int8") + && !entry.info.model_id.contains("8bit") + && !entry.info.model_id.contains("4bit"), + "{} default model id should not be quantized: {}", + entry.info.model_name, + entry.info.model_id + ); + } + } + + #[test] + fn asr_registry_uses_parakeet_family_on_all_platforms() { + let parakeet = asr_model_info(AsrModel::ParakeetTdtV3); + assert_eq!(parakeet.model_name, "parakeet-tdt-v3-0.6b-int8"); + assert_eq!(parakeet.sample_rate, 16_000); + assert_eq!(parakeet.max_segment_sec, 30); + assert!(parakeet.streaming); + assert_eq!(parakeet.readiness, "production"); + assert_eq!(parakeet.languages, ["en"]); + assert_eq!( + parakeet.runtime, + if cfg!(target_os = "macos") { + "coreml" + } else { + "litert" + } + ); + assert_eq!( + parakeet.model_id, + if cfg!(target_os = "macos") { + "aufklarer/Parakeet-TDT-v3-CoreML-INT8-30s" + } else { + "soniqo/Parakeet-TDT-0.6B-v3-LiteRT-INT8" + } + ); + } + #[test] fn studio_registry_keeps_qwen_on_bf16() { - let ids: Vec = TTS_ENGINE_REGISTRY + let ids: Vec = MODEL_REGISTRY + .tts_engines .iter() .map(|entry| entry.info.id) .collect(); @@ -3180,11 +3529,29 @@ mod tests { assert!(!qwen.info.model_name.contains("8bit")); assert!(!qwen.info.model_id.contains("8bit")); assert!(!qwen.info.model_name.contains("0.6b")); + assert_eq!(qwen.info.precision, "bf16"); assert_eq!(qwen.info.style_mode, "none"); } + #[test] + fn qwen_synth_budget_is_bounded_for_short_lines() { + assert_eq!(synth_seed_ladder(TtsEngine::CosyVoice).len(), 6); + assert_eq!(synth_max_tokens(TtsEngine::Qwen3, 2), 40); + assert_eq!(synth_max_tokens(TtsEngine::Qwen3, 6), 44); + assert_eq!(synth_max_tokens(TtsEngine::Qwen3, 20), 96); + assert_eq!(synth_max_tokens(TtsEngine::CosyVoice, 6), 112); + } + #[test] fn sidecar_language_normalization_preserves_chatterbox_hi() { + assert_eq!( + normalize_sidecar_language(TtsEngine::CosyVoice, Some("ru")).as_deref(), + Some("russian") + ); + assert_eq!( + normalize_sidecar_language(TtsEngine::CosyVoice, Some("ja")).as_deref(), + Some("japanese") + ); assert_eq!( normalize_sidecar_language(TtsEngine::Chatterbox, Some("hi")).as_deref(), Some("hi") @@ -3247,6 +3614,21 @@ mod tests { ); } + #[test] + fn dictation_cache_dir_under_app_namespace() { + let dir = dictation_cache_dir(); + assert!( + dir.ends_with("dictation"), + "dictation dir should end with dictation: {:?}", + dir + ); + assert!( + dir.to_string_lossy().contains("audio.soniqo.studio"), + "dictation dir should be under the app namespace: {:?}", + dir + ); + } + // Simulates the installed-bundle layout: the sidecar binary sits next to // the main app binary while libLiteRt is staged in a separate resource dir. // The search path must include both so the loader finds the runtime. diff --git a/src-tauri/tests/sidecar.rs b/src-tauri/tests/sidecar.rs index bf11660..41f7622 100644 --- a/src-tauri/tests/sidecar.rs +++ b/src-tauri/tests/sidecar.rs @@ -680,7 +680,7 @@ fn bundled_voice_path(name: &str) -> PathBuf { } // Reference text for the bundled WAVs. Must match seed_demo in src/lib.rs. -const ANNA_REF_TEXT: &str = "The Hispaniola was rolling scuppers under in the ocean swell. The booms were tearing at the blocks, ruddering."; +const ANNA_REF_TEXT: &str = "The Hispaniola was rolling scuppers under in the ocean swell. The booms were tearing at the blocks. The rudder was banging."; const MAREK_REF_TEXT: &str = "It is a pretty little spot there, a green grass plateau running along by the water's edge and overhung by willows."; // Demo target lines. Must match `lines` in `seed_demo`. @@ -933,3 +933,273 @@ fn demo_references_e2e() { overall * 100.0 ); } + +// ----------------------------------------------------------------------------- +// Onset-junk + emotion-marker e2e tests. +// +// Qwen3 ICL and OmniVoice both opened some renders (reference-dependent) with +// a short low-level codec artifact before the first word — quiet hiss for +// Qwen3 on the Marek reference, a low hum for OmniVoice on Anna — followed by +// a silence gap before the phrase. The sidecar removes these via +// trimLeadingJunk before edge conditioning. These tests replay the exact +// production requests that used to produce audible junk (deterministic at +// seed 1000) and assert the first thing you hear is speech-loud. +// +// Indic-Mio styles via a closed suffix-tag vocabulary; the sidecar maps the +// Studio's inline "(happy)"-style marker onto it. Before that mapping the +// model read the marker aloud, so the third test pins "marker is styled, not +// spoken". +// +// All three load real models (cached under ~/.cache/huggingface after the +// first run) and need the `speech` CLI for Parakeet grading. Opt in via: +// cargo test --test sidecar -- --ignored --nocapture qwen_onset_is_speech_not_junk +// cargo test --test sidecar -- --ignored --nocapture omnivoice_onset_is_speech_not_junk +// cargo test --test sidecar -- --ignored --nocapture indic_mio_does_not_speak_emotion_marker +// ----------------------------------------------------------------------------- + +/// Read a sidecar-written WAV (44-byte header, 16-bit PCM mono) as f32 samples. +fn read_wav_samples(path: &str) -> (Vec, usize) { + use std::io::Read; + let mut f = std::fs::File::open(path).expect("open wav"); + let mut header = [0u8; 44]; + f.read_exact(&mut header).expect("wav header"); + let channels = u16::from_le_bytes([header[22], header[23]]) as usize; + let sample_rate = u32::from_le_bytes([header[24], header[25], header[26], header[27]]) as usize; + let bps = u16::from_le_bytes([header[34], header[35]]); + assert_eq!(bps, 16, "expected 16-bit PCM"); + assert_eq!(channels, 1, "expected mono"); + let mut buf = Vec::new(); + f.read_to_end(&mut buf).expect("wav data"); + let samples = buf + .chunks_exact(2) + .map(|c| i16::from_le_bytes([c[0], c[1]]) as f32 / 32768.0) + .collect(); + (samples, sample_rate) +} + +/// Group audio into energy islands (5 ms RMS windows above -60 dBFS, closed +/// by ≥50 ms of quiet) and return (first_island_peak_db, max_island_peak_db). +/// Mirrors the sidecar's trimLeadingJunk analysis: a clean render opens with +/// a speech-loud island; onset junk shows up as a first island far below the +/// loudest one (measured 10-28 dB down across both engines). +fn onset_island_peaks(samples: &[f32], sample_rate: usize) -> Option<(f64, f64)> { + let win = sample_rate * 5 / 1000; + if win == 0 || samples.len() < win * 8 { + return None; + } + let dbs: Vec = samples + .chunks_exact(win) + .map(|c| { + let e = c.iter().map(|s| (*s as f64) * (*s as f64)).sum::() / c.len() as f64; + if e > 0.0 { 10.0 * e.log10() } else { -120.0 } + }) + .collect(); + let mut peaks: Vec = Vec::new(); + let mut current: Option = None; + let mut quiet = 0; + for &db in &dbs { + if db > -60.0 { + current = Some(current.map_or(db, |p: f64| p.max(db))); + quiet = 0; + } else if let Some(peak) = current { + quiet += 1; + if quiet >= 10 { + peaks.push(peak); + current = None; + } + } + } + if let Some(peak) = current { + peaks.push(peak); + } + let first = *peaks.first()?; + let max = peaks.iter().cloned().fold(f64::MIN, f64::max); + Some((first, max)) +} + +fn parakeet_transcript(audio_path: &str) -> String { + let out = Command::new("speech") + .args(["transcribe", audio_path, "--engine", "parakeet"]) + .output() + .expect("run `speech transcribe` (install the speech CLI for e2e tests)"); + assert!( + out.status.success(), + "speech transcribe failed: {}", + String::from_utf8_lossy(&out.stderr) + ); + String::from_utf8_lossy(&out.stdout) + .lines() + .find_map(|l| l.strip_prefix("Result: ")) + .map(|s| s.trim().to_string()) + .unwrap_or_default() +} + +/// Send one synthesis request, assert success, and return the output path. +fn synth_expect_ok(s: &mut SidecarHandle, payload: serde_json::Value) -> String { + let id = payload["id"].as_str().unwrap_or("").to_string(); + s.send(&payload); + let v = s.recv(); + assert_eq!(v["id"], serde_json::Value::String(id)); + assert_eq!( + v["ok"], + true, + "synthesis failed: {}", + v["error"].as_str().unwrap_or("(no error)") + ); + let path = v["result"]["audioPath"].as_str().expect("audioPath").to_string(); + let dur = v["result"]["durationSec"].as_f64().unwrap_or(0.0); + assert!( + (1.0..=15.0).contains(&dur), + "implausible duration {:.2}s for {}", + dur, + path + ); + path +} + +/// The first energy island must be speech, not a quiet junk prefix. 8 dB is +/// the sidecar detector's own quiet-junk bound: clean takes measured ≤4.7 dB +/// below the loudest island, junk takes ≥10.2 dB. +fn assert_onset_is_speech(audio_path: &str, target_text: &str) { + let (samples, sample_rate) = read_wav_samples(audio_path); + let (first_peak, max_peak) = + onset_island_peaks(&samples, sample_rate).expect("no energy islands in output"); + let deficit = max_peak - first_peak; + assert!( + deficit <= 8.0, + "onset junk: first island peaks {:.1} dB below the loudest ({:.1} vs {:.1} dBFS) in {}", + deficit, + first_peak, + max_peak, + audio_path + ); + let transcript = parakeet_transcript(audio_path); + let (_, _, cov) = token_coverage(target_text, &transcript); + assert!( + cov >= 0.6, + "coverage {:.0}% < 60% — transcript {:?} vs target {:?}", + cov * 100.0, + transcript, + target_text + ); +} + +#[test] +#[ignore] +fn qwen_onset_is_speech_not_junk() { + let marek = bundled_voice_path("marek"); + let mut s = SidecarHandle::spawn(); + // The exact production request (post-preprocess text, seed 1000) that + // used to open with ~100 ms of quiet hiss followed by half a second of + // silence before the phrase. + let path = synth_expect_ok( + &mut s, + serde_json::json!({ + "id": "e2e-qwen-onset", + "command": "synthesize_icl", + "engine": "qwen3", + "text": "Then we end this together, Tonight.", + "voiceId": "marek", + "referenceAudioPath": marek.to_string_lossy(), + "referenceText": MAREK_REF_TEXT, + "seed": 1000, + "maxTokens": 44, + }), + ); + assert_onset_is_speech(&path, "Then we end this together, Tonight."); +} + +#[test] +#[ignore] +fn omnivoice_onset_is_speech_not_junk() { + let anna = bundled_voice_path("anna"); + let mut s = SidecarHandle::spawn(); + // OmniVoice's variant of the same artifact: a ~200 ms low hum on the + // Anna reference before the first word. + let path = synth_expect_ok( + &mut s, + serde_json::json!({ + "id": "e2e-omni-onset", + "command": "synthesize_omnivoice", + "engine": "omnivoice", + "modelId": "aufklarer/OmniVoice-MLX-fp16", + "text": "(dramatic) I never thought we'd make it this far.", + "voiceId": "anna", + "referenceAudioPath": anna.to_string_lossy(), + "referenceText": ANNA_REF_TEXT, + "language": "en", + "seed": 1000, + }), + ); + assert_onset_is_speech(&path, "I never thought we'd make it this far."); +} + +#[test] +#[ignore] +fn indic_mio_does_not_speak_emotion_marker() { + let anna = bundled_voice_path("anna"); + let mut s = SidecarHandle::spawn(); + let target = "This line should sound bright and clear."; + let path = synth_expect_ok( + &mut s, + serde_json::json!({ + "id": "e2e-indic-marker", + "command": "synthesize_indic_mio", + "engine": "indic-mio", + "modelId": "aufklarer/Indic-Mio-MLX-fp16", + "text": format!("(happy) {}", target), + "voiceId": "indic-test", + "referenceAudioPath": anna.to_string_lossy(), + "referenceText": ANNA_REF_TEXT, + "language": "en", + "seed": 1000, + }), + ); + let transcript = parakeet_transcript(&path); + let (_, _, cov) = token_coverage(target, &transcript); + assert!( + cov >= 0.6, + "coverage {:.0}% < 60% — transcript {:?}", + cov * 100.0, + transcript + ); + assert!( + !tokenize(&transcript).contains(&"happy".to_string()), + "emotion marker was spoken aloud — transcript {:?}", + transcript + ); +} + +#[test] +fn sidecar_rejects_engine_mismatch() { + let mut s = SidecarHandle::spawn(); + s.send(&serde_json::json!({ + "id": "mismatch", + "command": "synthesize_omnivoice", + "engine": "qwen3", + "text": "hi", + "referenceAudioPath": "/nonexistent.wav", + })); + let v = s.recv(); + assert_eq!(v["ok"], false); + let err = v["error"].as_str().unwrap_or(""); + assert!( + err.contains("requires engine"), + "unexpected error: {}", + err + ); +} + +#[test] +fn sidecar_rejects_indic_mio_without_text() { + let mut s = SidecarHandle::spawn(); + s.send(&serde_json::json!({ + "id": "no-text", + "command": "synthesize_indic_mio", + "engine": "indic-mio", + })); + let v = s.recv(); + assert_eq!(v["ok"], false); + let err = v["error"].as_str().unwrap_or(""); + assert!(err.contains("requires text"), "unexpected error: {}", err); +} diff --git a/src/components/DictationPanel.tsx b/src/components/DictationPanel.tsx new file mode 100644 index 0000000..b2fab45 --- /dev/null +++ b/src/components/DictationPanel.tsx @@ -0,0 +1,408 @@ +import { useEffect, useRef, useState } from "react"; +import { Clipboard, FilePlus2, Loader2, Mic, Pause, Play, Square } from "lucide-react"; +import { convertFileSrc } from "@tauri-apps/api/core"; +import { + availableAsrModels, + saveDictationAudio, + transcribeAudio, + type AsrModelInfo, + type TranscribeAudioResult, +} from "../ipc/commands"; +import { newClip, useProjectStore } from "../state/projectStore"; +import type { SpeakerTrack } from "../types/project"; +import { Button } from "./ui/button"; +import { useI18n } from "../i18n/useI18n"; + +interface RecorderSession { + stream: MediaStream; + context: AudioContext; + source: MediaStreamAudioSourceNode; + processor: ScriptProcessorNode; + chunks: Float32Array[]; + sampleRate: number; + startedAt: number; +} + +interface DictationCapture { + id: string; + audioPath: string; + durationSec: number; + text: string; + elapsedSec: number; + createdAt: string; +} + +let currentDictationAudio: HTMLAudioElement | null = null; + +function flattenChunks(chunks: Float32Array[]): Float32Array { + const total = chunks.reduce((sum, chunk) => sum + chunk.length, 0); + const out = new Float32Array(total); + let offset = 0; + for (const chunk of chunks) { + out.set(chunk, offset); + offset += chunk.length; + } + return out; +} + +function writeAscii(view: DataView, offset: number, value: string) { + for (let i = 0; i < value.length; i += 1) { + view.setUint8(offset + i, value.charCodeAt(i)); + } +} + +function encodeWav(samples: Float32Array, sampleRate: number): ArrayBuffer { + const bytesPerSample = 2; + const dataBytes = samples.length * bytesPerSample; + const buffer = new ArrayBuffer(44 + dataBytes); + const view = new DataView(buffer); + writeAscii(view, 0, "RIFF"); + view.setUint32(4, 36 + dataBytes, true); + writeAscii(view, 8, "WAVE"); + writeAscii(view, 12, "fmt "); + view.setUint32(16, 16, true); + view.setUint16(20, 1, true); + view.setUint16(22, 1, true); + view.setUint32(24, sampleRate, true); + view.setUint32(28, sampleRate * bytesPerSample, true); + view.setUint16(32, bytesPerSample, true); + view.setUint16(34, 16, true); + writeAscii(view, 36, "data"); + view.setUint32(40, dataBytes, true); + let offset = 44; + for (const sample of samples) { + const clamped = Math.max(-1, Math.min(1, sample)); + view.setInt16(offset, Math.round(clamped * 32767), true); + offset += bytesPerSample; + } + return buffer; +} + +function arrayBufferToBase64(buffer: ArrayBuffer): string { + const bytes = new Uint8Array(buffer); + const chunkSize = 0x8000; + let binary = ""; + for (let i = 0; i < bytes.length; i += chunkSize) { + binary += String.fromCharCode(...bytes.subarray(i, i + chunkSize)); + } + return btoa(binary); +} + +function formatSec(value: number): string { + return value.toFixed(value < 10 ? 1 : 0); +} + +function estimateClipDurationSec(text: string, fallbackSec: number): number { + const words = text.trim().split(/\s+/).filter(Boolean).length; + return Math.max(1.0, fallbackSec || words * 0.35 || 1.0); +} + +export function DictationPanel() { + const { messages: t } = useI18n(); + const addTrack = useProjectStore((s) => s.addTrack); + const addClip = useProjectStore((s) => s.addClip); + const updateClip = useProjectStore((s) => s.updateClip); + const select = useProjectStore((s) => s.select); + const [models, setModels] = useState([]); + const [recording, setRecording] = useState(false); + const [busy, setBusy] = useState(false); + const [error, setError] = useState(null); + const [flowMessage, setFlowMessage] = useState(null); + const [captures, setCaptures] = useState([]); + const [playingId, setPlayingId] = useState(null); + const recorderRef = useRef(null); + + const model = models[0]; + + useEffect(() => { + let cancelled = false; + void availableAsrModels() + .then((next) => { + if (!cancelled) setModels(next); + }) + .catch((e) => { + if (!cancelled) setError(String(e)); + }); + return () => { + cancelled = true; + stopRecorderOnly(); + if (currentDictationAudio) { + currentDictationAudio.pause(); + currentDictationAudio = null; + } + }; + }, []); + + function stopRecorderOnly(): RecorderSession | null { + const session = recorderRef.current; + recorderRef.current = null; + if (!session) return null; + session.processor.disconnect(); + session.source.disconnect(); + session.stream.getTracks().forEach((track) => track.stop()); + void session.context.close(); + setRecording(false); + return session; + } + + async function startRecording() { + setError(null); + setFlowMessage(null); + if (!navigator.mediaDevices?.getUserMedia) { + setError(t.dictation.unsupported); + return; + } + try { + const stream = await navigator.mediaDevices.getUserMedia({ + audio: { + echoCancellation: true, + noiseSuppression: true, + autoGainControl: true, + channelCount: 1, + }, + }); + const AudioContextCtor = window.AudioContext; + const context = new AudioContextCtor({ sampleRate: 16000 }); + const source = context.createMediaStreamSource(stream); + const processor = context.createScriptProcessor(4096, 1, 1); + const chunks: Float32Array[] = []; + processor.onaudioprocess = (event) => { + chunks.push(new Float32Array(event.inputBuffer.getChannelData(0))); + event.outputBuffer.getChannelData(0).fill(0); + }; + source.connect(processor); + processor.connect(context.destination); + recorderRef.current = { + stream, + context, + source, + processor, + chunks, + sampleRate: context.sampleRate, + startedAt: performance.now(), + }; + setRecording(true); + } catch (e) { + setError(t.dictation.micFailed(String(e))); + } + } + + async function stopAndTranscribe() { + const session = stopRecorderOnly(); + if (!session || busy) return; + const samples = flattenChunks(session.chunks); + const durationSec = samples.length / session.sampleRate; + if (durationSec < 0.2) { + setError(t.dictation.tooShort); + return; + } + + setBusy(true); + setError(null); + setFlowMessage(null); + try { + const wav = encodeWav(samples, session.sampleRate); + const saved = await saveDictationAudio(arrayBufferToBase64(wav)); + const transcript: TranscribeAudioResult = await transcribeAudio({ + audioPath: saved.audioPath, + model: model?.id, + }); + setCaptures((prev) => [ + { + id: crypto.randomUUID(), + audioPath: saved.audioPath, + durationSec: transcript.durationSec || saved.durationSec || durationSec, + text: transcript.text, + elapsedSec: transcript.elapsedSec, + createdAt: new Date().toISOString(), + }, + ...prev, + ]); + } catch (e) { + setError(t.dictation.transcribeFailed(String(e))); + } finally { + setBusy(false); + } + } + + function insertCapture(capture: DictationCapture) { + const text = capture.text.trim(); + if (!text) { + setError(t.dictation.emptyTranscript); + return; + } + const state = useProjectStore.getState(); + if (state.selection.kind === "clip") { + updateClip(state.selection.id, { + text, + renderedAudioPath: undefined, + locked: false, + }); + setFlowMessage(t.dictation.insertedClip); + return; + } + + const selectedTrackId = state.selection.kind === "track" ? state.selection.id : undefined; + const selectedTrack = selectedTrackId + ? state.project.tracks.find( + (track): track is SpeakerTrack => + track.kind === "speaker" && track.id === selectedTrackId, + ) + : undefined; + let targetTrack = selectedTrack ?? state.project.tracks.find( + (track): track is SpeakerTrack => track.kind === "speaker", + ); + if (!targetTrack) { + targetTrack = { + kind: "speaker", + id: crypto.randomUUID(), + name: t.defaults.speakerTrack(1), + clips: [], + }; + addTrack(targetTrack); + } + + const startSec = Math.max(0, state.transport.positionSec); + const endSec = startSec + estimateClipDurationSec(text, capture.durationSec); + const clip = newClip({ + trackId: targetTrack.id, + startSec, + endSec, + text, + }); + addClip(clip); + select({ kind: "clip", id: clip.id }); + setFlowMessage(t.dictation.insertedTimeline); + } + + function togglePlayback(capture: DictationCapture) { + if (playingId === capture.id) { + currentDictationAudio?.pause(); + currentDictationAudio = null; + setPlayingId(null); + return; + } + currentDictationAudio?.pause(); + const audio = new Audio(convertFileSrc(capture.audioPath)); + currentDictationAudio = audio; + audio.onended = () => { + if (currentDictationAudio === audio) currentDictationAudio = null; + setPlayingId(null); + }; + audio.onerror = () => setPlayingId(null); + audio.play().then(() => setPlayingId(capture.id)).catch(() => setPlayingId(null)); + } + + return ( +

+
+ + {t.dictation.title} + + + {model ? model.displayName : t.dictation.loadingModel} + +
+ +
+ +
+ {model ? t.dictation.modelMeta(model.runtime, model.modelSize) : t.dictation.modelPending} +
+
+ + {error && ( +
+ {error} +
+ )} + {flowMessage && ( +
+ {flowMessage} +
+ )} + +
+ {captures.length === 0 && ( +
+ {t.dictation.empty} +
+ )} + {captures.map((capture) => ( +
+
+ + {t.dictation.captureMeta( + formatSec(capture.durationSec), + formatSec(capture.elapsedSec), + )} + +
+ + + +
+
+

+ {capture.text || t.dictation.emptyTranscript} +

+
+ ))} +
+
+ ); +} diff --git a/src/components/Inspector.tsx b/src/components/Inspector.tsx index 6413a21..87d66ba 100644 --- a/src/components/Inspector.tsx +++ b/src/components/Inspector.tsx @@ -1,5 +1,4 @@ import { useState } from "react"; -import { convertFileSrc } from "@tauri-apps/api/core"; import { Lock, Unlock, Trash2, RefreshCw, History, Loader2 } from "lucide-react"; import { useProjectStore } from "../state/projectStore"; import { ScriptEditor } from "./ScriptEditor"; @@ -15,6 +14,8 @@ import { SelectValue, } from "./ui/select"; import { cn } from "@/lib/utils"; +import { clipAudioVersion } from "../lib/clipAudio"; +import { mediaFileSrc } from "../lib/mediaSrc"; import { dateLocale, type Messages } from "../i18n/messages"; import { useI18n } from "../i18n/useI18n"; @@ -62,8 +63,10 @@ export function Inspector() { const updateClip = useProjectStore((s) => s.updateClip); const assignVoiceToTrack = useProjectStore((s) => s.assignVoiceToTrack); const removeClip = useProjectStore((s) => s.removeClip); + const setPlaying = useProjectStore((s) => s.setPlaying); + const seek = useProjectStore((s) => s.seek); const engine = useProjectStore((s) => s.model.engine); - const language = useProjectStore((s) => s.model.language); + const modelLanguage = useProjectStore((s) => s.model.language); const activeEngine = useProjectStore((s) => s.model.engines.find((candidate) => candidate.id === s.model.engine), ); @@ -257,6 +260,7 @@ export function Inspector() { const needsReferenceTranscript = activeEngine?.requiresReferenceTranscript ?? (engine === "cosyvoice" || engine === "qwen3" || engine === "fish-audio"); + const language = activeEngine?.requiresLanguage ? modelLanguage : undefined; const transcriptEngineName = activeEngine?.displayName ?? t.inspector.selectedEngine; const canRegenerate = !isRegenerating && @@ -267,6 +271,8 @@ export function Inspector() { async function regenerate() { if (!effectiveVoice || !effectiveVoice.referenceAudioPath) return; + setPlaying(false); + seek(current.startSec); setIsRegenerating(true); setRegenError(null); setRegenTiming(null); @@ -391,8 +397,8 @@ export function Inspector() {