如果要做一個能自然互動的「高齡智慧健康照護 AI Companion」,第一步就是先讓它能夠「聽懂」使用者在說什麼。
對高齡使用者來說,比起打字,直接透過語音描述日常狀況會更加直覺。像是「昨天沒睡好」、「今天膝蓋有點痛」這些對話,也成為系統了解近期狀態的重要資訊。
所以今天先完成最基本的語音入口:
使用者說話
↓
麥克風
↓
VAD 判斷人聲開始 / 結束
↓
Whisper STT
↓
中文文字
這次使用 Apple M5 Pro 搭配 MLX Whisper,在本機完成第一版語音辨識。
STT(Speech-to-Text)就是把語音轉換成文字。
未來 AI Companion 的基本流程會是:
語音 → STT → LLM → TTS → 數位人
而再往後,STT 得到的內容不只會拿來與 LLM 對話,其中與生活、身體狀況相關的資訊,也會進一步交給 Health Memory 處理。
因此 STT 可以說是整套系統最前面的語音入口。
這次主要考慮中文辨識、本機執行,以及後續即時互動的速度,因此使用:
mlx-community/whisper-large-v3-turbo
最基本的辨識方式:
import mlx_whisper
result = mlx_whisper.transcribe(
"test.wav",
path_or_hf_repo="mlx-community/whisper-large-v3-turbo",
language="zh",
condition_on_previous_text=False,
)
print(result["text"].strip())
language="zh" 指定中文;condition_on_previous_text=False 則讓不同音訊片段盡量獨立辨識。
接著使用 sounddevice 取得麥克風輸入:
stream = sd.InputStream(
device=device,
samplerate=sample_rate,
channels=1,
dtype="float32",
callback=audio_callback,
)
這樣就完成:
麥克風 → Whisper → 中文文字
第一版必須錄完才能開始辨識,所以接著加入 Rolling Transcription,每隔約 2 秒更新一次:
Partial:
哈囉,你好……
Partial:
哈囉,你好!今天我要開始測試我的 AI Companion。
接著再加入 Silero VAD(Voice Activity Detection)。
pip install silero-vad
VAD 負責判斷使用者什麼時候開始、停止說話;Whisper 則負責辨識「說了什麼」。
不過這裡遇到一個問題。
Rolling 每 2 秒才更新一次,如果使用者剛好在兩次更新之間說完,最後一小段語音可能還沒有被辨識。
例如:
我今天不太舒服。
如果漏掉句尾,可能直接改變整句話的意思。在健康相關的對話中,這類錯誤更需要避免。
所以最後把兩者用途分開:
Rolling STT → 顯示即時字幕
VAD 判斷說完
↓
完整辨識一次
↓
Final Text
Rolling STT 只負責讓使用者知道「系統正在聽」,真正送進 LLM 的則是 VAD 判斷說完後,重新完整辨識得到的 Final Text。
測試環境:
本次測試結果:
| 項目 | 結果 |
|---|---|
| 模型預熱 | 約 0.97 秒 |
| 第一個 Partial | 約 2.3 秒 |
| 4.5 秒音訊辨識 | 約 1.31 秒 |
| RTF | 約 0.29 |
RTF 計算方式:
RTF = 處理時間 / 音訊長度
= 1.31 / 4.5
≈ 0.29
RTF 小於 1,代表目前模型處理速度比音訊本身還快。
到這裡,AI Companion 已經完成:
直接說話
→ Rolling STT
→ VAD 判斷說完
→ Final Text
目前這些文字先拿來完成語音對話;之後加入 Memory 系統後,其中與睡眠、飲食、活動、用藥或身體狀況相關的內容,也會成為 Health Memory 的資料來源。
現在 AI 已經可以「聽懂」使用者了。
下一步,就要讓它真正開口說話。
Day 03:Text-to-Speech(TTS)。