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

環(huán)境準(zhǔn)備
1. 安裝必需的 Python 包
# 音頻處理相關(guān) pip install sounddevice soundfile pyaudio # 語音識(shí)別 pip install faster-whisper # HTTP請(qǐng)求 pip install requests # 語音合成(可選,如果使用edge-tts) pip install edge-tts
2. 系統(tǒng)依賴
Windows 系統(tǒng)
# 使用 Chocolatey 安裝 FFmpeg(推薦) choco install ffmpeg # 或者手動(dòng)下載 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 # 拉取模型(選擇其中一個(gè)) ollama pull yi:9b # 或者 ollama pull llama3-8b # 啟動(dòng) Ollama 服務(wù) 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("?? 正在錄音,請(qǐng)開始說話...")
audio = sd.rec(int(duration * fs), samplerate=fs, channels=1)
sd.wait()
sf.write(filename, audio, fs)
print("? 錄音完成")
# 語音識(shí)別函數(shù),調(diào)用 WhisperModel 將音頻轉(zhuǎn)為文本
def transcribe_whisper(filename="input.wav"):
print("?? Whisper 正在識(shí)別語音...")
model = WhisperModel("medium", compute_type="int8")
segments, _ = model.transcribe(filename, beam_size=5)
text = "".join([seg.text for seg in segments])
print(f"?? 識(shí)別結(jié)果:{text}")
return text
# 與 Ollama 大模型對(duì)話,獲取回復(fù)
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 回復(fù):{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"? 語音合成或播放出錯(cuò): {e}")
# 主流程:錄音 -> 語音識(shí)別 -> AI對(duì)話 -> 語音合成與播放
if __name__ == "__main__":
record_audio() # 錄音
user_text = transcribe_whisper() # 語音轉(zhuǎn)文本
reply_text = chat_with_ollama(user_text) # AI對(duì)話
speak_text(reply_text) # 語音合成與播放
功能詳解
1. 語音錄制模塊
def record_audio(filename="input.wav", duration=5, fs=16000):
print("?? 正在錄音,請(qǐng)開始說話...")
audio = sd.rec(int(duration * fs), samplerate=fs, channels=1)
sd.wait()
sf.write(filename, audio, fs)
print("? 錄音完成")
技術(shù)要點(diǎn):
使用 sounddevice 進(jìn)行實(shí)時(shí)音頻錄制
采樣率設(shè)置為 16kHz,單聲道錄制
默認(rèn)錄制時(shí)長(zhǎng) 5 秒
使用 soundfile 保存為 WAV 格式
2. 語音識(shí)別模塊
def transcribe_whisper(filename="input.wav"):
print("?? Whisper 正在識(shí)別語音...")
model = WhisperModel("medium", compute_type="int8")
segments, _ = model.transcribe(filename, beam_size=5)
text = "".join([seg.text for seg in segments])
print(f"?? 識(shí)別結(jié)果:{text}")
return text
技術(shù)要點(diǎn):
使用 faster-whisper 庫(kù),比原版 Whisper 更快
選擇 “medium” 模型,平衡準(zhǔn)確性和速度
compute_type="int8" 量化加速,減少內(nèi)存占用
beam_size=5 提高識(shí)別準(zhǔn)確率
3. AI對(duì)話模塊
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 回復(fù):{answer}")
return answer
技術(shù)要點(diǎn):
通過 HTTP API 與 Ollama 服務(wù)通信(支持本地或遠(yuǎn)程部署)
支持多種模型:yi:9b、llama3-8b 等
stream=False 獲取完整回復(fù)
可配置本地部署(http://localhost:11434)或遠(yuǎn)程服務(wù)
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])
技術(shù)要點(diǎn):
使用 Microsoft Edge TTS 引擎
選擇中文女聲 “zh-CN-XiaoxiaoNeural”
使用 FFplay 播放生成的音頻文件
支持多種語音選擇
使用說明
1. 啟動(dòng)準(zhǔn)備
# 1. 確保 Ollama 服務(wù)運(yùn)行 ollama serve # 2. 運(yùn)行語音助手 python v.py
2. 交互流程
- 程序啟動(dòng)后自動(dòng)開始錄音(5秒)
- 錄音結(jié)束后進(jìn)行語音識(shí)別
- 識(shí)別結(jié)果發(fā)送給 Ollama 模型
- AI 回復(fù)轉(zhuǎn)換為語音并播放
性能優(yōu)化建議
1. Whisper 模型選擇
| 模型大小 | 內(nèi)存占用 | 識(shí)別速度 | 準(zhǔn)確率 |
|---|---|---|---|
| tiny | ~39MB | 最快 | 較低 |
| base | ~74MB | 快 | 中等 |
| small | ~244MB | 中等 | 良好 |
| medium | ~769MB | 較慢 | 很好 |
| large | ~1550MB | 最慢 | 最佳 |
2. 計(jì)算類型優(yōu)化
# 不同計(jì)算類型的性能對(duì)比
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ù)使用場(chǎng)景調(diào)整參數(shù) record_audio(duration=3, fs=16000) # 短對(duì)話 record_audio(duration=10, fs=22050) # 長(zhǎng)對(duì)話,更高音質(zhì)
故障排除
常見問題
1.錄音設(shè)備問題
# 查看可用音頻設(shè)備 import sounddevice as sd print(sd.query_devices())
2.Ollama 連接失敗
# 檢查 Ollama 服務(wù)狀態(tài) curl http://localhost:11434/api/tags
3.語音合成失敗
# 測(cè)試 edge-tts edge-tts --list-voices | grep zh-CN
4.FFmpeg 播放問題
# 檢查 FFmpeg 安裝 ffplay -version
擴(kuò)展功能
1. 添加喚醒詞檢測(cè)
# 可集成 pvporcupine 實(shí)現(xiàn)喚醒詞功能 pip install pvporcupine
2. 支持多輪對(duì)話
# 添加對(duì)話歷史管理 conversation_history = []
3. 語音情感識(shí)別
# 可集成情感分析庫(kù) pip install transformers torch
總結(jié)
本項(xiàng)目展示了如何構(gòu)建一個(gè)完整的語音助手系統(tǒng),涵蓋了從語音輸入到語音輸出的完整鏈路。通過本地部署的方式,既保證了響應(yīng)速度,又保護(hù)了用戶隱私。
項(xiàng)目特點(diǎn):
- 隱私保護(hù):所有處理都在本地完成
- 響應(yīng)迅速:優(yōu)化的模型配置和本地部署
- 易于擴(kuò)展:模塊化設(shè)計(jì),便于功能擴(kuò)展
- 成本低廉:無需調(diào)用付費(fèi)API
適用場(chǎng)景:
- 個(gè)人語音助手
- 智能家居控制
- 語音筆記工具
- 教育輔助工具
到此這篇關(guān)于Python調(diào)用本地ollama大模型實(shí)現(xiàn)智能語音助手的文章就介紹到這了,更多相關(guān)Python ollama智能語音助手內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python下的Softmax回歸函數(shù)的實(shí)現(xiàn)方法(推薦)
下面小編就為大家?guī)硪黄狿ython下的Softmax回歸函數(shù)的實(shí)現(xiàn)方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01
python3+PyQt5重新實(shí)現(xiàn)自定義數(shù)據(jù)拖放處理
這篇文章主要為大家詳細(xì)介紹了python3+PyQt5重新實(shí)現(xiàn)自定義數(shù)據(jù)拖放處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
使用Python和jieba庫(kù)生成中文詞云的示例代碼
在文本分析和數(shù)據(jù)可視化的領(lǐng)域中,詞云是一種展示文本數(shù)據(jù)中關(guān)鍵詞頻率的直觀方式,Python作為一種強(qiáng)大的編程語言,提供了多種庫(kù)來幫助我們生成詞云,在本文中,我們將通過一個(gè)簡(jiǎn)單的示例,展示如何使用Python生成中文詞云,需要的朋友可以參考下2024-07-07
Python整數(shù)與Numpy數(shù)據(jù)溢出問題解決
這篇文章主要介紹了Python 的整數(shù)與 Numpy 的數(shù)據(jù)溢出,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
深入解析 Python 的 argparse命令行參數(shù)的實(shí)戰(zhàn)案例
argparse是開發(fā)Python命令行工具不可或缺的標(biāo)準(zhǔn)模塊,它功能全面、文檔豐富、學(xué)習(xí)曲線平緩,只要掌握了它,你就可以輕松將任何 Python 腳本變成一個(gè)強(qiáng)大、優(yōu)雅、可維護(hù)的命令行工具,本文帶領(lǐng)深入解析Python的argparse命令行參數(shù),需要的朋友跟隨小編一起看看吧2025-08-08
深度學(xué)習(xí)小工程練習(xí)之tensorflow垃圾分類詳解
這篇文章主要介紹了練習(xí)深度學(xué)習(xí)的一個(gè)小工程,代碼簡(jiǎn)單明確,用來作為學(xué)習(xí)深度學(xué)習(xí)的練習(xí)很適合,對(duì)于有需要的朋友可以參考下,希望大家可以體驗(yàn)到深度學(xué)習(xí)帶來的收獲2021-04-04

