項目簡介
本項目是一個基于 Python 的智能語音助手,集成了語音錄制、語音識別、AI對話和語音合成功能。用戶可以通過語音與本地部署的 Ollama 大模型進行自然對話。
技術架構
核心功能模塊
- 語音錄制 - 使用 sounddevice 錄制用戶語音
- 語音識別 - 使用 faster-whisper 將語音轉換為文本
- AI對話 - 與本地 Ollama 模型進行文本對話
- 語音合成 - 使用 edge-tts 將AI回復轉換為語音并播放
工作流程
用戶語音輸入 → 錄音 → 語音識別 → AI對話 → 語音合成 → 語音播放
環境準備
1. 安裝必需的 Python 包
# 音頻處理相關
pip install sounddevice soundfile pyaudio# 語音識別
pip install faster-whisper# HTTP請求
pip install requests# 語音合成(可選,如果使用edge-tts)
pip install edge-tts
2. 系統依賴
Windows 系統
# 使用 Chocolatey 安裝 FFmpeg(推薦)
choco install ffmpeg# 或者手動下載 FFmpeg 并添加到系統 PATH
# 下載地址:https://ffmpeg.org/download.html
Linux/macOS 系統
# Ubuntu/Debian
sudo apt update
sudo apt install ffmpeg# macOS
brew install ffmpeg
3. Ollama 模型部署
# 安裝 Ollama
curl -fsSL https://ollama.ai/install.sh | sh# 拉取模型(選擇其中一個)
ollama pull yi:9b
# 或者
ollama pull llama3-8b# 啟動 Ollama 服務
ollama serve
核心代碼實現
完整源代碼
import subprocess
import sounddevice as sd
import soundfile as sf
from faster_whisper import WhisperModel
import requestsOLLAMA_MODEL = "yi:9b" # 或者 llama3-8b,已在 Ollama 里拉取好的模型# 錄音函數,錄制音頻并保存為 input.wav
def record_audio(filename="input.wav", duration=5, fs=16000):print("🎤 正在錄音,請開始說話...")audio = sd.rec(int(duration * fs), samplerate=fs, channels=1)sd.wait()sf.write(filename, audio, fs)print("? 錄音完成")# 語音識別函數,調用 WhisperModel 將音頻轉為文本
def transcribe_whisper(filename="input.wav"):print("🧠 Whisper 正在識別語音...")model = WhisperModel("medium", compute_type="int8")segments, _ = model.transcribe(filename, beam_size=5)text = "".join([seg.text for seg in segments])print(f"📝 識別結果:{text}")return text# 與 Ollama 大模型對話,獲取回復
def chat_with_ollama(prompt):print("💬 發送給 Ollama 中...")response = requests.post("http://ollama.jjsos.cn/api/generate", json={"model": OLLAMA_MODEL,"prompt": prompt,"stream": False})answer = response.json()["response"]print(f"🤖 Ollama 回復:{answer}")return answer# 語音合成與播放,將文本轉為語音并播放
def speak_text(text, output="reply.wav"):"""文本轉語音并播放"""print("🔊 正在生成語音...")try:# 直接使用 edge-tts 命令,避免 echo 管道問題tts_command = ["edge-tts", "--text", text, "--voice", "zh-CN-XiaoxiaoNeural", "--write-media", output]result = subprocess.run(tts_command, capture_output=True, text=True)# 檢查命令是否成功執行if result.returncode != 0:print(f"? 語音合成失敗: {result.stderr}")return# 檢查文件是否存在import osif not os.path.exists(output):print(f"? 音頻文件 {output} 未生成")returnprint("🔈 播放中...")subprocess.run(["ffplay", "-nodisp", "-autoexit", output])except Exception as e:print(f"? 語音合成或播放出錯: {e}")# 主流程:錄音 -> 語音識別 -> AI對話 -> 語音合成與播放
if __name__ == "__main__":record_audio() # 錄音user_text = transcribe_whisper() # 語音轉文本reply_text = chat_with_ollama(user_text) # AI對話speak_text(reply_text) # 語音合成與播放
功能詳解
1. 語音錄制模塊
def record_audio(filename="input.wav", duration=5, fs=16000):print("🎤 正在錄音,請開始說話...")audio = sd.rec(int(duration * fs), samplerate=fs, channels=1)sd.wait()sf.write(filename, audio, fs)print("? 錄音完成")
技術要點:
- 使用
sounddevice
進行實時音頻錄制 - 采樣率設置為 16kHz,單聲道錄制
- 默認錄制時長 5 秒
- 使用
soundfile
保存為 WAV 格式
2. 語音識別模塊
def transcribe_whisper(filename="input.wav"):print("🧠 Whisper 正在識別語音...")model = WhisperModel("medium", compute_type="int8")segments, _ = model.transcribe(filename, beam_size=5)text = "".join([seg.text for seg in segments])print(f"📝 識別結果:{text}")return text
技術要點:
- 使用
faster-whisper
庫,比原版 Whisper 更快 - 選擇 “medium” 模型,平衡準確性和速度
compute_type="int8"
量化加速,減少內存占用beam_size=5
提高識別準確率
3. AI對話模塊
def chat_with_ollama(prompt):print("💬 發送給 Ollama 中...")response = requests.post("http://localhost:11434/api/generate", json={"model": OLLAMA_MODEL,"prompt": prompt,"stream": False})answer = response.json()["response"]print(f"🤖 Ollama 回復:{answer}")return answer
技術要點:
- 通過 HTTP API 與 Ollama 服務通信(支持本地或遠程部署)
- 支持多種模型:yi:9b、llama3-8b 等
stream=False
獲取完整回復- 可配置本地部署(
http://localhost:11434
)或遠程服務
4. 語音合成模塊
def speak_text(text, output="reply.wav"):print("🔊 正在生成語音...")tts_command = f"echo '{text}' | edge-tts --voice zh-CN-XiaoxiaoNeural --write-media {output}"subprocess.run(tts_command, shell=True)print("🔈 播放中...")subprocess.run(["ffplay", "-nodisp", "-autoexit", output])
技術要點:
- 使用 Microsoft Edge TTS 引擎
- 選擇中文女聲 “zh-CN-XiaoxiaoNeural”
- 使用 FFplay 播放生成的音頻文件
- 支持多種語音選擇
使用說明
1. 啟動準備
# 1. 確保 Ollama 服務運行
ollama serve# 2. 運行語音助手
python v.py
2. 交互流程
- 程序啟動后自動開始錄音(5秒)
- 錄音結束后進行語音識別
- 識別結果發送給 Ollama 模型
- AI 回復轉換為語音并播放
性能優化建議
1. Whisper 模型選擇
模型大小 | 內存占用 | 識別速度 | 準確率 |
---|---|---|---|
tiny | ~39MB | 最快 | 較低 |
base | ~74MB | 快 | 中等 |
small | ~244MB | 中等 | 良好 |
medium | ~769MB | 較慢 | 很好 |
large | ~1550MB | 最慢 | 最佳 |
2. 計算類型優化
# 不同計算類型的性能對比
model = WhisperModel("medium", compute_type="int8") # 推薦:速度快,內存少
model = WhisperModel("medium", compute_type="float16") # 平衡:中等速度和精度
model = WhisperModel("medium", compute_type="float32") # 最高精度,最慢速度
3. 錄音參數調優
# 根據使用場景調整參數
record_audio(duration=3, fs=16000) # 短對話
record_audio(duration=10, fs=22050) # 長對話,更高音質
故障排除
常見問題
-
錄音設備問題
# 查看可用音頻設備 import sounddevice as sd print(sd.query_devices())
-
Ollama 連接失敗
# 檢查 Ollama 服務狀態 curl http://localhost:11434/api/tags
-
語音合成失敗
# 測試 edge-tts edge-tts --list-voices | grep zh-CN
-
FFmpeg 播放問題
# 檢查 FFmpeg 安裝 ffplay -version
擴展功能
1. 添加喚醒詞檢測
# 可集成 pvporcupine 實現喚醒詞功能
pip install pvporcupine
2. 支持多輪對話
# 添加對話歷史管理
conversation_history = []
3. 語音情感識別
# 可集成情感分析庫
pip install transformers torch
總結
本項目展示了如何構建一個完整的語音助手系統,涵蓋了從語音輸入到語音輸出的完整鏈路。通過本地部署的方式,既保證了響應速度,又保護了用戶隱私。
項目特點:
- 🔒 隱私保護:所有處理都在本地完成
- ? 響應迅速:優化的模型配置和本地部署
- 🎯 易于擴展:模塊化設計,便于功能擴展
- 💰 成本低廉:無需調用付費API
適用場景:
- 個人語音助手
- 智能家居控制
- 語音筆記工具
- 教育輔助工具
希望這個項目能為你的語音AI應用開發提供參考和啟發!