隨著語音助理應用日益普及,資料隱私和功能客製化的需求也隨之提升。本文提供一個以 Python 為基礎,結合 Whisper、Rasa 和 pyttsx3 等開源工具,建構個人化語音助理的完整流程。透過 Whisper 模型進行語音辨識,將語音轉換為文字,再利用 Rasa 框架進行自然語言理解和對話管理,最後使用 pyttsx3 將文字轉換為語音輸出。此架構允許使用者在本地端執行語音助理,有效降低資料外洩的風險,並可根據個人需求調整功能。
開發個人化語音助理:結合NLP技術的Python實作
為何需要自建語音助理?
現今語音助理已非單純玩具,而是功能強大的數位助手,能溝通、搜尋資訊,甚至還能開玩笑(有時比某些人還好笑)。本文將逐步解說如何使用Python和現代NLP工具從零開始開發客製化語音助理,擺脫Siri、Alexa等既有框架,開發專屬個人化的語音助理。
市面上既有的語音助理功能強大,但其運作機制通常牽涉到大量資料傳輸至第三方伺服器。這對於重視隱私的使用者來說,可能存在資料安全疑慮。因此,自建語音助理能有效解決此問題,並根據個人需求調整功能。
語音助理架構
一個語音助理系統主要由以下幾個模組組成:
- ASR (Automatic Speech Recognition,自動語音辨識):將麥克風錄音轉換成文字。
- NLP Engine (自然語言處理引擎):處理文字,理解使用者意圖。
- Dialogue Manager (對話管理):管理對話流程及互動邏輯。
- TTS (Text-to-Speech,文字轉語音):將文字轉換成語音輸出。
- API Layer (應用程式介面層):若語音助理需要搜尋資訊或執行其他動作,則需要透過API與外部服務互動。
本文將使用以下工具:
- Whisper (OpenAI):用於語音辨識。
- 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
# 載入Whisper模型
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)
# 使用Whisper進行轉錄
result = model.transcribe("temp.wav")
print("您說了:", result["text"])
內容解密:
此程式碼首先載入Whisper的基礎模型。record_audio
函式使用sounddevice
套件錄製一段時間的音訊,並將其儲存為WAV檔案。save_wav
函式則負責將錄製的音訊資料儲存為WAV檔案。最後,程式碼使用Whisper模型將錄製的音訊轉錄成文字,並印出轉錄結果。 np.squeeze
用於處理音訊陣列的維度,確保其與Whisper模型相容。 程式碼中使用了較小的模型"base",若需要更高的準確度,可以考慮使用更大的模型,但相對地,運算資源消耗也會增加。
第二部分:使用Rasa進行NLP處理
Rasa是一個強大的開源框架,可用於構建對話式AI應用程式,包含意圖辨識、實體抽取和對話管理等功能。
# 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: "天氣晴朗,陽光明媚!" # 這邊需要整合天氣API才能提供實際天氣資訊
接著撰寫stories,執行rasa train
命令訓練模型,即可建立對話邏輯。
第三部分:使用pyttsx3進行文字轉語音
pyttsx3是一個離線的文字轉語音引擎,速度快且易於使用。
import pyttsx3
engine = pyttsx3.init()
engine.say("你好!我是你的語音助理。")
engine.runAndWait()
可以設定語音、速度和音調等引數。不同的作業系統會有不同的預設語音。
第四部分:整合所有模組
現在,我們可以將所有模組整合在一起,完成一個完整的語音助理流程:
- 語音 → 文字 (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模型,以及pyttsx3語音引擎。 程式碼進入一個無限迴圈,持續監聽使用者語音輸入。 record_audio
和 save_wav
函式與前述程式碼相同,負責錄音及儲存。 asr_model.transcribe
將語音轉換成文字,並將其傳遞給Rasa模型進行處理。 agent.handle_text
函式將使用者輸入的文字傳遞給Rasa模型,取得回應。 最後,程式碼將Rasa模型的回應使用pyttsx3轉換成語音並播放。
可能的改進方向
- 使用Coqui TTS或VITS等更先進的文字轉語音引擎,以獲得更自然逼真的語音輸出。
- 整合資料函式庫,儲存對話記錄和使用者資訊,提升使用體驗。
- 整合外部API,例如天氣預報、行事曆、記事本等,擴充套件語音助理的功能。