Python調(diào)用本地ollama大模型實現(xiàn)智能語音助手
項目簡介
本項目是一個基于 Python 的智能語音助手,集成了語音錄制、語音識別、AI對話和語音合成功能。用戶可以通過語音與本地部署的 Ollama 大模型進行自然對話。
技術架構(gòu)
核心功能模塊
語音錄制 - 使用 sounddevice 錄制用戶語音
語音識別 - 使用 faster-whisper 將語音轉(zhuǎn)換為文本
AI對話 - 與本地 Ollama 模型進行文本對話
語音合成 - 使用 edge-tts 將AI回復轉(zhuǎn)換為語音并播放
工作流程
用戶語音輸入 → 錄音 → 語音識別 → AI對話 → 語音合成 → 語音播放
實現(xiàn)效果

環(huán)境準備
1. 安裝必需的 Python 包
# 音頻處理相關 pip install sounddevice soundfile pyaudio # 語音識別 pip install faster-whisper # HTTP請求 pip install requests # 語音合成(可選,如果使用edge-tts) pip install edge-tts
2. 系統(tǒng)依賴
Windows 系統(tǒng)
# 使用 Chocolatey 安裝 FFmpeg(推薦) choco install ffmpeg # 或者手動下載 FFmpeg 并添加到系統(tǒng) PATH # 下載地址:https://ffmpeg.org/download.html
Linux/macOS 系統(tǒng)
# 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 requests
OLLAMA_MODEL = "yi:9b" # 或者 llama3-8b,已在 Ollama 里拉取好的模型
# 錄音函數(shù),錄制音頻并保存為 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("? 錄音完成")
# 語音識別函數(shù),調(diào)用 WhisperModel 將音頻轉(zhuǎn)為文本
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"?? 識別結(jié)果:{text}")
return text
# 與 Ollama 大模型對話,獲取回復
def chat_with_ollama(prompt):
print("?? 發(fā)送給 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
# 語音合成與播放,將文本轉(zhuǎn)為語音并播放
def speak_text(text, output="reply.wav"):
"""文本轉(zhuǎn)語音并播放"""
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)
# 檢查命令是否成功執(zhí)行
if result.returncode != 0:
print(f"? 語音合成失敗: {result.stderr}")
return
# 檢查文件是否存在
import os
if not os.path.exists(output):
print(f"? 音頻文件 {output} 未生成")
return
print("?? 播放中...")
subprocess.run(["ffplay", "-nodisp", "-autoexit", output])
except Exception as e:
print(f"? 語音合成或播放出錯: {e}")
# 主流程:錄音 -> 語音識別 -> AI對話 -> 語音合成與播放
if __name__ == "__main__":
record_audio() # 錄音
user_text = transcribe_whisper() # 語音轉(zhuǎn)文本
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"?? 識別結(jié)果:{text}")
return text
技術要點:
使用 faster-whisper 庫,比原版 Whisper 更快
選擇 “medium” 模型,平衡準確性和速度
compute_type="int8" 量化加速,減少內(nèi)存占用
beam_size=5 提高識別準確率
3. AI對話模塊
def chat_with_ollama(prompt):
print("?? 發(fā)送給 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秒)
- 錄音結(jié)束后進行語音識別
- 識別結(jié)果發(fā)送給 Ollama 模型
- AI 回復轉(zhuǎn)換為語音并播放
性能優(yōu)化建議
1. Whisper 模型選擇
| 模型大小 | 內(nèi)存占用 | 識別速度 | 準確率 |
|---|---|---|---|
| tiny | ~39MB | 最快 | 較低 |
| base | ~74MB | 快 | 中等 |
| small | ~244MB | 中等 | 良好 |
| medium | ~769MB | 較慢 | 很好 |
| large | ~1550MB | 最慢 | 最佳 |
2. 計算類型優(yōu)化
# 不同計算類型的性能對比
model = WhisperModel("medium", compute_type="int8") # 推薦:速度快,內(nèi)存少
model = WhisperModel("medium", compute_type="float16") # 平衡:中等速度和精度
model = WhisperModel("medium", compute_type="float32") # 最高精度,最慢速度
3. 錄音參數(shù)調(diào)優(yōu)
# 根據(jù)使用場景調(diào)整參數(shù) record_audio(duration=3, fs=16000) # 短對話 record_audio(duration=10, fs=22050) # 長對話,更高音質(zhì)
故障排除
常見問題
1.錄音設備問題
# 查看可用音頻設備 import sounddevice as sd print(sd.query_devices())
2.Ollama 連接失敗
# 檢查 Ollama 服務狀態(tài) curl http://localhost:11434/api/tags
3.語音合成失敗
# 測試 edge-tts edge-tts --list-voices | grep zh-CN
4.FFmpeg 播放問題
# 檢查 FFmpeg 安裝 ffplay -version
擴展功能
1. 添加喚醒詞檢測
# 可集成 pvporcupine 實現(xiàn)喚醒詞功能 pip install pvporcupine
2. 支持多輪對話
# 添加對話歷史管理 conversation_history = []
3. 語音情感識別
# 可集成情感分析庫 pip install transformers torch
總結(jié)
本項目展示了如何構(gòu)建一個完整的語音助手系統(tǒng),涵蓋了從語音輸入到語音輸出的完整鏈路。通過本地部署的方式,既保證了響應速度,又保護了用戶隱私。
項目特點:
- 隱私保護:所有處理都在本地完成
- 響應迅速:優(yōu)化的模型配置和本地部署
- 易于擴展:模塊化設計,便于功能擴展
- 成本低廉:無需調(diào)用付費API
適用場景:
- 個人語音助手
- 智能家居控制
- 語音筆記工具
- 教育輔助工具
到此這篇關于Python調(diào)用本地ollama大模型實現(xiàn)智能語音助手的文章就介紹到這了,更多相關Python ollama智能語音助手內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python Matplotlib底圖中鼠標滑過顯示隱藏內(nèi)容的實例代碼
這篇文章主要介紹了python Matplotlib底圖中鼠標滑過顯示隱藏內(nèi)容,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07
python實現(xiàn)的AES雙向?qū)ΨQ加密解密與用法分析
這篇文章主要介紹了python實現(xiàn)的AES雙向?qū)ΨQ加密解密與用法,簡單分析了AES加密解密算法的基本概念并結(jié)合實例形式給出了AES加密解密算法的相關實現(xiàn)技巧與使用注意事項,需要的朋友可以參考下2017-05-05
弄懂這56個Python使用技巧(輕松掌握Python高效開發(fā))
這篇文章主要介紹了弄懂這56個Python使用技巧(輕松掌握Python高效開發(fā)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-09-09

