隨著語音助理應用日益普及,資料隱私和功能客製化的需求也隨之提升。本文提供一個以 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開發的強大語音辨識模型,支援離線使用。我們可以使用whisperfaster-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()

可以設定語音、速度和音調等引數。不同的作業系統會有不同的預設語音。

第四部分:整合所有模組

現在,我們可以將所有模組整合在一起,完成一個完整的語音助理流程:

  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模型,以及pyttsx3語音引擎。 程式碼進入一個無限迴圈,持續監聽使用者語音輸入。 record_audiosave_wav 函式與前述程式碼相同,負責錄音及儲存。 asr_model.transcribe 將語音轉換成文字,並將其傳遞給Rasa模型進行處理。 agent.handle_text 函式將使用者輸入的文字傳遞給Rasa模型,取得回應。 最後,程式碼將Rasa模型的回應使用pyttsx3轉換成語音並播放。

可能的改進方向

  • 使用Coqui TTS或VITS等更先進的文字轉語音引擎,以獲得更自然逼真的語音輸出。
  • 整合資料函式庫,儲存對話記錄和使用者資訊,提升使用體驗。
  • 整合外部API,例如天氣預報、行事曆、記事本等,擴充套件語音助理的功能。