# Python 語音助手本地的ollama實現

在這里插入圖片描述

項目簡介

本項目是一個基于 Python 的智能語音助手,集成了語音錄制、語音識別、AI對話和語音合成功能。用戶可以通過語音與本地部署的 Ollama 大模型進行自然對話。

技術架構

核心功能模塊

  1. 語音錄制 - 使用 sounddevice 錄制用戶語音
  2. 語音識別 - 使用 faster-whisper 將語音轉換為文本
  3. AI對話 - 與本地 Ollama 模型進行文本對話
  4. 語音合成 - 使用 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. 交互流程

  1. 程序啟動后自動開始錄音(5秒)
  2. 錄音結束后進行語音識別
  3. 識別結果發送給 Ollama 模型
  4. 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)  # 長對話,更高音質

故障排除

常見問題

  1. 錄音設備問題

    # 查看可用音頻設備
    import sounddevice as sd
    print(sd.query_devices())
    
  2. Ollama 連接失敗

    # 檢查 Ollama 服務狀態
    curl http://localhost:11434/api/tags
    
  3. 語音合成失敗

    # 測試 edge-tts
    edge-tts --list-voices | grep zh-CN
    
  4. FFmpeg 播放問題

    # 檢查 FFmpeg 安裝
    ffplay -version
    

擴展功能

1. 添加喚醒詞檢測

# 可集成 pvporcupine 實現喚醒詞功能
pip install pvporcupine

2. 支持多輪對話

# 添加對話歷史管理
conversation_history = []

3. 語音情感識別

# 可集成情感分析庫
pip install transformers torch

總結

本項目展示了如何構建一個完整的語音助手系統,涵蓋了從語音輸入到語音輸出的完整鏈路。通過本地部署的方式,既保證了響應速度,又保護了用戶隱私。

項目特點:

  • 🔒 隱私保護:所有處理都在本地完成
  • ? 響應迅速:優化的模型配置和本地部署
  • 🎯 易于擴展:模塊化設計,便于功能擴展
  • 💰 成本低廉:無需調用付費API

適用場景:

  • 個人語音助手
  • 智能家居控制
  • 語音筆記工具
  • 教育輔助工具

希望這個項目能為你的語音AI應用開發提供參考和啟發!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/81684.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81684.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81684.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第1章第1節:安全運維基礎思維與體系建設-安全運維的定義與核心目標

🎯 實戰目標: 理解“安全運維”與傳統運維的本質區別 掌握安全運維的核心目標與價值定位 建立以“持續可控、可視可審、自動響應”為核心的思維框架 📖 背景知識: ? 傳統運維 vs 安全運維 傳統運維關注:系統穩定、…

LNMP 架構部署

目錄 一、基于授權的訪問控制 (一)功能簡介 (二)配置步驟 二、基于客戶端的訪問控制 (一)功能簡介 (二)配置步驟 三、Nginx 虛擬主機 (一)基于域名的…

JVM與JMM深度解析:從Java 8到Java 21的演進

文章目錄 第一部分:JVM基礎概念與架構JVM是什么?JVM整體架構運行時數據區類加載機制執行引擎 第二部分:Java內存模型(JMM)什么是Java內存模型JMM的核心問題主內存與工作內存內存間交互操作重排序與happens-before原則v…

Docker 掛載卷并保存為容器

1 創建docker容器 使用鏡像osrf/ros:humble-desktop-full-jammy創建并運行容器 sudo docker run -it --name ros2_humble osrf/ros:humble-desktop-full-jammy /ros_entrypoint.sh bash docker run -it -v d:\docker\ros2_humble:/root/ros2_ws osrf/ros:humble-desktop-fu…

無人機飛手共享接單平臺

2025年,無人機已不再是“黑科技”的代名詞。從農田噴灑到外賣配送,從航拍攝影到醫療急救,無人機正以驚人的速度滲透我們的生活。而在這場變革中, “無人機飛手共享接單平臺” 成為連接技術與需求的核心樞紐。它不僅讓專業飛手輕松…

【Web應用】若依框架:基礎篇07功能詳解-定時任務

文章目錄 ?前言?一、講解過程?二、動手實操?總結 標題詳情作者JosieBook頭銜CSDN博客專家資格、阿里云社區專家博主、軟件設計工程師博客內容開源、框架、軟件工程、全棧(,NET/Java/Python/C)、數據庫、操作系統、大數據、人工智能、工控、網絡、程序…

8.8 Primary ODSA service without ODSA Portal

主要ODSA服務(不使用ODSA門戶) 以下場景描述如下情況: ? 主ODSA客戶端應用程序被允許用于該類型的主設備,且對終端用戶啟用(已授權)。 ? 服務提供商(SP)能夠在不涉及ODSA門戶Web服…

深度檢測與動態透明度控制 - 基于Babylon.js的遮擋檢測實現解析

首先貼出實現代碼: OcclusionFader.ts import { AbstractEngine, Material, type Behavior, type Mesh, type PBRMetallicRoughnessMaterial, type Scene } from "babylonjs/core"; import { OcclusionTester } from "../../OcclusionTester"…

openssl 使用生成key pem

好的,以下是完整的步驟,幫助你在 Windows 系統中使用 OpenSSL 生成私鑰(key)和 PEM 文件。假設你的 openssl.cnf 配置文件位于桌面。 步驟 1:打開命令提示符 按 Win R 鍵,打開“運行”對話框。輸入 cmd&…

音視頻之視頻壓縮及數字視頻基礎概念

系列文章: 1、音視頻之視頻壓縮技術及數字視頻綜述 一、視頻壓縮編碼技術綜述: 1、信息化與視頻通信: 什么是信息: 眾所周知,人類社會的三大支柱是物質、能量和信息。具體而言,農業現代化的支柱是物質&…

傳統數據表設計與Prompt驅動設計的范式對比:以NBA投籃數據表為例

引言:數據表設計方法的演進 在數據庫設計領域,傳統的數據表設計方法與新興的Prompt驅動設計方法代表了兩種截然不同的思維方式。本文將以NBA賽季投籃數據表(shots)的設計為例,深入探討這兩種方法的差異、優劣及適用場景。隨著AI技術在數據領…

XCTF-web-mfw

發現了git 使用GitHack下載一下源文件&#xff0c;找到了php源代碼 <?phpif (isset($_GET[page])) {$page $_GET[page]; } else {$page "home"; }$file "templates/" . $page . ".php";// I heard .. is dangerous! assert("strpos…

Prompt Tuning與自然語言微調對比解析

Prompt Tuning 與輸入提示詞自然語言微調的區別和聯系 一、核心定義與區別 維度Prompt Tuning(提示微調)輸入提示詞自然語言微調本質優化連續向量空間中的提示嵌入(不可直接閱讀)優化離散自然語言文本(人類可理解)操作對象模型輸入嵌入層的連續向量(如WordEmbedding)自…

LVS的DR模式部署

目錄 一、引言&#xff1a;高并發場景下的流量調度方案 二、LVS-DR 集群核心原理與架構設計 &#xff08;一&#xff09;工作原理與數據流向 數據包流向步驟3&#xff1a; &#xff08;二&#xff09;模式特性與53網絡要求 三、實戰配置&#xff1a;從9環境搭建到參數調整…

8種常見數據結構及其特點簡介

一、8種常見數據結構 1. 數組&#xff08;Array&#xff09; 簡介&#xff1a;數組是有序元素的序列&#xff0c;連續內存塊存儲相同類型元素&#xff0c;通過下標直接訪問。數組會為存儲的元素都分配一個下標&#xff08;索引&#xff09;&#xff0c;此下標是一個自增連續的…

通過mailto:實現web/html郵件模板喚起新建郵件并填寫內容

一、背景 在實現網站、html郵件模板過程中&#xff0c;難免會遇到需要通過郵箱向服務提供方發起技術支持等需求&#xff0c;因此&#xff0c;我們需要通過一個功能&#xff0c;能新建郵件并提供模板&#xff0c;提高溝通效率 二、mailto協議配置說明 參數描述mailto:nameema…

好用但不常用的Git配置

參考文章 文章目錄 tag標簽分支新倉庫默認分支推送 代碼合并沖突處理默認diff算法 tag標簽 默認是以字母順序排序&#xff0c;這會導致一些問題&#xff0c;比如0.5.101排在0.5.1000之后。為了解決這個問題&#xff0c;我們可以把默認排序改為數值排序 git config --global t…

第六十八篇 從“超市收銀系統崩潰”看JVM性能監控與故障定位實戰

目錄 引言&#xff1a;當技術問題遇上生活場景一、JVM的“超市貨架管理哲學”二、收銀員工具箱&#xff1a;JVM監控三板斧三、典型故障診斷實錄四、防患于未然的運維智慧五、結語&#xff1a;從故障救火到體系化防控 引言&#xff1a;當技術問題遇上生活場景 想象一個周末的傍…

tauri2項目打開某個文件夾,類似于mac系統中的 open ./

在 Tauri 2 項目中打開文件夾 在 Tauri 2 項目中&#xff0c;你可以使用以下幾種方法來打開文件夾&#xff0c;類似于 macOS 中的 open ./ 命令功能&#xff1a; 方法一&#xff1a;使用 shell 命令 use tauri::Manager;#[tauri::command] async fn open_folder(path: Strin…

編譯pg_duckdb步驟

1. 要求cmake的版本要高于3.17&#xff0c;可以通過下載最新的cmake的程序&#xff0c;然后設置.bash_profile的PATH環境變量&#xff0c;將最新的cmake的bin目錄放到PATH環境變量的最前面 2. g的版本要支持c17標準&#xff0c;否則會報 error ‘invoke_result in namespace ‘…