隨著語音助理的普及,資料隱私問題日益受到關注。本文介紹如何使用 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開發的一款強大的語音辨識模型,可以本地佈署使用 whisperfaster-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保持一致。

第四部分:整合所有元件

現在我們可以建立完整的語音助理流程:

  1. 語音 → 文字 (Whisper)
  2. 文字 → 意圖 (Rasa)
  3. 回應 → 文字 (Rasa)
  4. 文字 → 語音 (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_audiosave_wav 錄音並儲存,接著使用Whisper轉錄成文字。 將文字傳給Rasa處理,取得回應後,再使用pyttsx3將回應轉換成語音輸出。

進階改進方向

  • pyttsx3 替換成 Coqui TTSVITS 以獲得更自然的語音。
  • 使用資料函式庫儲存對話歷史記錄,提升語音助理的記憶能力。
  • 整合外部API,例如天氣預報、行事曆、記事本等。