import { Injectable } from "@nestjs/common"; import type { TTSProvider, TTSSynthesisInput, SynthesizedAudio } from "./tts-provider.js"; import { hashToSeed } from "../llm/seeded-random.js"; const CHARS_PER_SECOND_AT_NORMAL_RATE = 6; // Mock 階段的粗略估算,不代表真實語速 // P-4 MockTTSProvider:輸出韻律標記與佔位音檔參照,不呼叫任何真實語音服務—— // 讓語音管線的其他機制(韻律解析、非語言發聲、副語言分析)都能在沒有真實 TTS 供應商的情況下完整測試。 @Injectable() export class MockTTSProvider implements TTSProvider { async synthesize(input: TTSSynthesisInput): Promise { const seed = input.seed ?? hashToSeed(input.text); const { prosody, nonverbalCue, voiceSheet } = input; const spokenText = nonverbalCue.interjection ? `${nonverbalCue.interjection} ${input.text}` : input.text; const durationEstimateMs = nonverbalCue.pauseSeconds * 1000 + (spokenText.length / CHARS_PER_SECOND_AT_NORMAL_RATE / prosody.rateMultiplier) * 1000; const prosodyMarkup = `` + `` + `` + spokenText + ``; return { audioRef: `mock://tts/${seed}`, prosodyMarkup, durationEstimateMs: Math.round(durationEstimateMs), }; } }