昨天先完成了 Speech-to-Text,讓 AI 可以把我說的話轉成文字。
今天要做的事情剛好相反:
Text
↓
TTS
↓
Audio
↓
Playback
讓 AI 可以真正「開口說話」。
如果要做一個可以自然互動的 AI Companion,只透過文字回覆還不夠。
尤其這次以高齡陪伴為主要情境,相比一直閱讀畫面上的文字,直接用語音互動會更加直覺。
這時就需要 TTS(Text-to-Speech),也就是把文字轉換成語音。
例如輸入:
你好,今天過得怎麼樣?
會經過:
Text
↓
TTS Model
↓
Audio
↓
Playback
未來完整流程則會是:
使用者說話
↓
STT
↓
LLM
↓
TTS
↓
AI 說話
今天還沒有接 LLM,因此先從 Terminal 手動輸入文字。
一開始我測試過 Qwen3-TTS 1.7B,在目前的 Mac 與測試設定下,Warm RTF 約為 3.03。
也就是生成 1 秒語音,大約要花 3 秒,對即時聊天來說太慢。
因此這次改測:
mlx-community/Kokoro-82M-bf16
Kokoro 只有 82M,可以透過 MLX 在 Apple Silicon GPU 上本機執行,而且不需要參考音訊,只要指定文字與聲線就能直接產生語音。
目前使用:
zf_xiaoxiao
作為預設中文聲線。
執行:
.venv-kokoro/bin/python -m app.tts.kokoro_cli \
--text "你好,今天過得怎麼樣?"
流程:
輸入文字
↓
Kokoro 82M
↓
產生 WAV
↓
自動播放
也可以調整聲線與語速:
.venv-kokoro/bin/python -m app.tts.kokoro_cli \
--text "今天有記得吃飯嗎?" \
--voice zf_xiaoxiao \
--speed 0.9
這次使用 RTF(Real-Time Factor) 量測生成速度:
RTF = Inference Time / Audio Duration
當:
RTF < 1
代表語音生成速度比實際播放速度快。
實測結果:
| 測試 | 推論時間 | 音訊長度 | RTF |
|---|---|---|---|
| 短句 | 0.095 s | 2.30 s | 0.041 |
| 一般句 | 0.113 s | 2.85 s | 0.040 |
| 中句 | 0.227 s | 5.35 s | 0.043 |
| 長句 | 0.437 s | 9.10 s | 0.048 |
平均:
RTF = 0.0464
也就是生成 1 秒語音,大約只需要 0.046 秒。
模型載入時間也只有:
0.286 秒
因此目前即使不使用 Streaming TTS,整段生成完再播放,等待時間也已經很短。
除了速度,也測試了一般中文、數字、長句、標點與不同語速。
生成的音訊再透過 MLX Whisper 回聽,純中文測試結果:
CER = 0
代表這批測試句沒有出現文字辨識錯誤。
另外測試:
speed = 0.9
speed = 1.0
speed = 1.1
三種速度都可以正確生成。
如果之後主要提供給高齡使用者,我目前比較傾向使用:
speed = 0.9
讓語速稍微慢一點。
目前比較明顯的問題是中英文混合,英文詞的發音容易出錯,因此之後可能需要在送進 TTS 前先做文字正規化。
Day 03 完成:
Text
↓
Kokoro 82M
↓
Audio
↓
Playback
Kokoro 在 Apple MLX GPU 上平均 RTF 約為 0.0464,已經能快速完成中文語音生成。
目前 TTS 架構也先決定拆成:
一般聊天
→ Kokoro 82M
→ 固定中文聲線
家人克隆聲線
→ Qwen3-TTS
→ Voice Cloning
一般聊天優先追求低延遲,需要家人聲音時,再使用 Voice Cloning。
現在 AI 已經可以快速把文字說出來,但目前仍然使用模型提供的固定聲線。
下一步要測試的是:
如果只提供一小段真人錄音,AI 能不能用相似的聲音說出新的內容?
Day 04 準備進入 Voice Cloning