Python調(diào)用本地ollama大模型實(shí)現(xiàn)智能語(yǔ)音助手
項(xiàng)目簡(jiǎn)介
本項(xiàng)目是一個(gè)基于 Python 的智能語(yǔ)音助手,集成了語(yǔ)音錄制、語(yǔ)音識(shí)別、AI對(duì)話和語(yǔ)音合成功能。用戶可以通過(guò)語(yǔ)音與本地部署的 Ollama 大模型進(jìn)行自然對(duì)話。
技術(shù)架構(gòu)
核心功能模塊
語(yǔ)音錄制 - 使用 sounddevice 錄制用戶語(yǔ)音
語(yǔ)音識(shí)別 - 使用 faster-whisper 將語(yǔ)音轉(zhuǎn)換為文本
AI對(duì)話 - 與本地 Ollama 模型進(jìn)行文本對(duì)話
語(yǔ)音合成 - 使用 edge-tts 將AI回復(fù)轉(zhuǎn)換為語(yǔ)音并播放
工作流程
用戶語(yǔ)音輸入 → 錄音 → 語(yǔ)音識(shí)別 → AI對(duì)話 → 語(yǔ)音合成 → 語(yǔ)音播放
實(shí)現(xiàn)效果
環(huán)境準(zhǔn)備
1. 安裝必需的 Python 包
# 音頻處理相關(guān) pip install sounddevice soundfile pyaudio # 語(yǔ)音識(shí)別 pip install faster-whisper # HTTP請(qǐng)求 pip install requests # 語(yǔ)音合成(可選,如果使用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)開始說(shuō)話...") audio = sd.rec(int(duration * fs), samplerate=fs, channels=1) sd.wait() sf.write(filename, audio, fs) print("? 錄音完成") # 語(yǔ)音識(shí)別函數(shù),調(diào)用 WhisperModel 將音頻轉(zhuǎn)為文本 def transcribe_whisper(filename="input.wav"): print("?? Whisper 正在識(shí)別語(yǔ)音...") 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 # 語(yǔ)音合成與播放,將文本轉(zhuǎn)為語(yǔ)音并播放 def speak_text(text, output="reply.wav"): """文本轉(zhuǎn)語(yǔ)音并播放""" print("?? 正在生成語(yǔ)音...") try: # 直接使用 edge-tts 命令,避免 echo 管道問(wèn)題 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"? 語(yǔ)音合成失敗: {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"? 語(yǔ)音合成或播放出錯(cuò): {e}") # 主流程:錄音 -> 語(yǔ)音識(shí)別 -> AI對(duì)話 -> 語(yǔ)音合成與播放 if __name__ == "__main__": record_audio() # 錄音 user_text = transcribe_whisper() # 語(yǔ)音轉(zhuǎn)文本 reply_text = chat_with_ollama(user_text) # AI對(duì)話 speak_text(reply_text) # 語(yǔ)音合成與播放
功能詳解
1. 語(yǔ)音錄制模塊
def record_audio(filename="input.wav", duration=5, fs=16000): print("?? 正在錄音,請(qǐng)開始說(shuō)話...") 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. 語(yǔ)音識(shí)別模塊
def transcribe_whisper(filename="input.wav"): print("?? Whisper 正在識(shí)別語(yǔ)音...") 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):
通過(guò) HTTP API 與 Ollama 服務(wù)通信(支持本地或遠(yuǎn)程部署)
支持多種模型:yi:9b、llama3-8b 等
stream=False 獲取完整回復(fù)
可配置本地部署(http://localhost:11434)或遠(yuǎn)程服務(wù)
4. 語(yǔ)音合成模塊
def speak_text(text, output="reply.wav"): print("?? 正在生成語(yǔ)音...") 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 播放生成的音頻文件
支持多種語(yǔ)音選擇
使用說(shuō)明
1. 啟動(dòng)準(zhǔn)備
# 1. 確保 Ollama 服務(wù)運(yùn)行 ollama serve # 2. 運(yùn)行語(yǔ)音助手 python v.py
2. 交互流程
- 程序啟動(dòng)后自動(dòng)開始錄音(5秒)
- 錄音結(jié)束后進(jìn)行語(yǔ)音識(shí)別
- 識(shí)別結(jié)果發(fā)送給 Ollama 模型
- AI 回復(fù)轉(zhuǎn)換為語(yǔ)音并播放
性能優(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ì)
故障排除
常見(jiàn)問(wèn)題
1.錄音設(shè)備問(wèn)題
# 查看可用音頻設(shè)備 import sounddevice as sd print(sd.query_devices())
2.Ollama 連接失敗
# 檢查 Ollama 服務(wù)狀態(tài) curl http://localhost:11434/api/tags
3.語(yǔ)音合成失敗
# 測(cè)試 edge-tts edge-tts --list-voices | grep zh-CN
4.FFmpeg 播放問(wèn)題
# 檢查 FFmpeg 安裝 ffplay -version
擴(kuò)展功能
1. 添加喚醒詞檢測(cè)
# 可集成 pvporcupine 實(shí)現(xiàn)喚醒詞功能 pip install pvporcupine
2. 支持多輪對(duì)話
# 添加對(duì)話歷史管理 conversation_history = []
3. 語(yǔ)音情感識(shí)別
# 可集成情感分析庫(kù) pip install transformers torch
總結(jié)
本項(xiàng)目展示了如何構(gòu)建一個(gè)完整的語(yǔ)音助手系統(tǒng),涵蓋了從語(yǔ)音輸入到語(yǔ)音輸出的完整鏈路。通過(guò)本地部署的方式,既保證了響應(yīng)速度,又保護(hù)了用戶隱私。
項(xiàng)目特點(diǎn):
- 隱私保護(hù):所有處理都在本地完成
- 響應(yīng)迅速:優(yōu)化的模型配置和本地部署
- 易于擴(kuò)展:模塊化設(shè)計(jì),便于功能擴(kuò)展
- 成本低廉:無(wú)需調(diào)用付費(fèi)API
適用場(chǎng)景:
- 個(gè)人語(yǔ)音助手
- 智能家居控制
- 語(yǔ)音筆記工具
- 教育輔助工具
到此這篇關(guān)于Python調(diào)用本地ollama大模型實(shí)現(xiàn)智能語(yǔ)音助手的文章就介紹到這了,更多相關(guān)Python ollama智能語(yǔ)音助手內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python socket模塊方法實(shí)現(xiàn)詳解
這篇文章主要介紹了Python socket模塊方法實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11python Matplotlib底圖中鼠標(biāo)滑過(guò)顯示隱藏內(nèi)容的實(shí)例代碼
這篇文章主要介紹了python Matplotlib底圖中鼠標(biāo)滑過(guò)顯示隱藏內(nèi)容,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-072021年最新用于圖像處理的Python庫(kù)總結(jié)
為了快速地處理大量信息,科學(xué)家需要利用圖像準(zhǔn)備工具來(lái)完成人工智能和深度學(xué)習(xí)任務(wù).在本文中,我將深入研究Python中最有用的圖像處理庫(kù),這些庫(kù)正在人工智能和深度學(xué)習(xí)任務(wù)中得到大力利用.我們開始吧,需要的朋友可以參考下2021-06-06使用TensorFlow實(shí)現(xiàn)二分類的方法示例
這篇文章主要介紹了使用TensorFlow實(shí)現(xiàn)二分類的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02Ubuntu下升級(jí) python3.7.1流程備忘(推薦)
這篇文章主要介紹了Ubuntu下升級(jí) python3.7.1流程備忘,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-12-12簡(jiǎn)單介紹Python的Django框架加載模版的方式
這篇文章主要介紹了Python的Django框架加載模版的方式,包括一些對(duì)加載順序的介紹,需要的朋友可以參考下2015-07-07python實(shí)現(xiàn)的AES雙向?qū)ΨQ加密解密與用法分析
這篇文章主要介紹了python實(shí)現(xiàn)的AES雙向?qū)ΨQ加密解密與用法,簡(jiǎn)單分析了AES加密解密算法的基本概念并結(jié)合實(shí)例形式給出了AES加密解密算法的相關(guān)實(shí)現(xiàn)技巧與使用注意事項(xiàng),需要的朋友可以參考下2017-05-05python模塊之subprocess模塊級(jí)方法的使用
這篇文章主要介紹了python模塊之subprocess模塊級(jí)方法的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03弄懂這56個(gè)Python使用技巧(輕松掌握Python高效開發(fā))
這篇文章主要介紹了弄懂這56個(gè)Python使用技巧(輕松掌握Python高效開發(fā)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-09-09Python urllib庫(kù)如何添加headers過(guò)程解析
這篇文章主要介紹了Python urllib庫(kù)如何添加headers過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10