隨著語音助理的普及,資料隱私問題日益受到關注。本文介紹如何使用 Python 結合 Whisper、Rasa 和 pyttsx3 等開源工具,從零開始構建一個本地佈署的個人化語音助理。透過 Whisper 模型進行語音辨識,將語音轉換為文字,再利用 Rasa 框架進行自然語言理解和對話管理,最後使用 pyttsx3 將文字轉換成語音輸出。文章提供完整的程式碼範例,涵蓋錄音、語音轉換、意圖識別、回應生成等關鍵步驟,並說明如何整合各個模組,實作語音助理的完整流程。此外,文章也探討了進階功能的開發方向,例如更換語音合成引擎、儲存對話歷史以及整合外部 API,以提升語音助理的效能和功能。
開發個人化語音助理:結合NLP技術的實作經驗分享
開源工具與本地化佈署:告別雲端巨頭的資料隱私疑慮
語音助理已不再是新鮮玩意兒,它們儼然成為能溝通、搜尋資訊甚至開玩笑(有時比某些人更好笑)的全功能數位助手。本文將探討如何從零開始,利用Python和現代NLP工具,開發一個客製化的語音助理,完全拋開Siri、Alexa等大型廠商的服務,實作真正的本地化佈署與資料自主掌控。
為何需要自建語音助理?
當語音助理能有效回應你的需求時,那是一種令人驚豔的魔法。然而,要實作這項魔法,背後需要許多複雜的技術:自動語音辨識(ASR)、自然語言處理(NLP)、對話模型、語音合成(TTS)……如果任何一個環節出錯,就會導致混亂。更重要的是,我們還需要確保它不會將所有資料洩露給第三方伺服器,對吧?
本文將示範如何建立一個本地運作的語音助理,它能理解語音、回應並記住你們之間的對話內容。所有程式碼都將使用Python編寫,力求專業且實用。
語音助理架構
以下是系統的基本組成模組:
- ASR (Automatic Speech Recognition):從麥克風接收語音並轉換成文字。
- NLP Engine:處理文字,理解使用者的意圖。
- Dialogue Manager:管理對話流程與互動邏輯。
- TTS (Text-to-Speech):將文字轉換成語音輸出。
- API Layer:如果語音助理需要搜尋或執行其他動作,則需要此模組。
我們將使用以下工具:
- OpenAI 的 Whisper 進行語音辨識。
- Rasa 作為對話與NLP引擎。
- pyttsx3 進行語音合成。
- SpeechRecognition 進行語音擷取。
第一部分:使用Whisper進行語音辨識
Whisper是OpenAI開發的一款強大的語音辨識模型,可以本地佈署使用 whisper
或 faster-whisper
套件。
Python程式碼範例:
import whisper
import sounddevice as sd
import numpy as np
import scipy.io.wavfile
model = whisper.load_model("base")
def record_audio(duration=5, fs=16000):
print("請開始說話...")
audio = sd.rec(int(duration * fs), samplerate=fs, channels=1, dtype='int16')
sd.wait()
return np.squeeze(audio)
def save_wav(filename, audio, fs=16000):
scipy.io.wavfile.write(filename, fs, audio)
audio = record_audio()
save_wav("temp.wav", audio)
result = model.transcribe("temp.wav")
print("您說了:", result["text"])
內容解密:
此程式碼首先載入Whisper模型,接著定義兩個函式:record_audio
負責錄音,save_wav
負責將錄音儲存成WAV檔案。主程式碼部分則呼叫 record_audio
錄音,儲存為 temp.wav
,然後使用Whisper模型將 temp.wav
轉錄成文字,最後印出轉錄結果。 np.squeeze
用於處理陣列維度,確保 audio
是一個一維陣列。 fs
代表取樣率,設定為 16000Hz。
第二部分:使用Rasa進行NLP
Rasa 是一個強大的框架,可以建立完整的對話系統,包含意圖辨識、槽位管理和上下文處理。
# nlu.yml
version: "3.1"
nlu:
- intent: greet
examples: |
- 您好
- 你好
- 早安
- intent: ask_weather
examples: |
- 天氣如何?
- 今天天氣怎樣?
- 會下雨嗎?
# domain.yml
intents:
- greet
- ask_weather
responses:
utter_greet:
- text: "您好!有什麼我可以幫您的嗎?"
utter_weather:
- text: "天氣晴朗,陽光明媚!"
接著撰寫stories,執行 rasa train
即可訓練對話模型。
第三部分:使用pyttsx3進行語音合成
pyttsx3 是一個離線的語音合成引擎,速度快且易於使用。
import pyttsx3
engine = pyttsx3.init()
engine.say("您好!我是您的語音助理。")
engine.runAndWait()
可以調整語音、速度和語氣。Windows和macOS系統的語音選項不同,但API保持一致。
第四部分:整合所有元件
現在我們可以建立完整的語音助理流程:
- 語音 → 文字 (Whisper)
- 文字 → 意圖 (Rasa)
- 回應 → 文字 (Rasa)
- 文字 → 語音 (pyttsx3)
# main.py
from rasa.core.agent import Agent
from whisper import load_model
import pyttsx3
agent = Agent.load('models') # Rasa 模型路徑
asr_model = load_model("base")
tts = pyttsx3.init()
while True:
audio = record_audio()
save_wav("temp.wav", audio)
result = asr_model.transcribe("temp.wav")
user_text = result["text"]
response = agent.handle_text(user_text)
if response:
reply = response[0]['text']
print(f"助理:{reply}")
tts.say(reply)
tts.runAndWait()
內容解密:
此程式碼載入訓練好的Rasa模型和Whisper模型,然後進入一個無限迴圈,持續監聽使用者語音。 它呼叫 record_audio
和 save_wav
錄音並儲存,接著使用Whisper轉錄成文字。 將文字傳給Rasa處理,取得回應後,再使用pyttsx3將回應轉換成語音輸出。
進階改進方向
- 將
pyttsx3
替換成Coqui TTS
或VITS
以獲得更自然的語音。 - 使用資料函式庫儲存對話歷史記錄,提升語音助理的記憶能力。
- 整合外部API,例如天氣預報、行事曆、記事本等。