基于Python与本地Ollama的智能语音唤醒助手实现

article/2025/8/2 23:59:41

在这里插入图片描述

项目简介

本项目是一个基于 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 requests
import time  # 用于添加延迟OLLAMA_MODEL = "yi:34b"  # 或者 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://127.0.0.1:11434/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:# 验证文本内容if not text.strip():print("❌ 无法合成空文本")return# 使用 YunyangNeural 男声tts_command = ["edge-tts", "--text", text, "--voice", "zh-CN-YunyangNeural", "--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}")def is_wakeup_keyword(text, wakeup_keywords=[("一号助手", "yi hao zhu shou"), ("我的助手", "wo de zhu shou")]):"""检查文本中是否包含唤醒关键词,支持中文文本和拼音匹配"""# 将输入文本转换为小写text = text.lower()# 移除标点符号import stringtext = text.translate(str.maketrans('', '', string.punctuation))# 分词处理(按空格分割)words = text.split()# 检查每个唤醒词for keyword, pinyin in wakeup_keywords:# 获取拼音分词pinyin_words = pinyin.split()# 检查中文匹配if keyword.lower() in text:return True# 检查拼音匹配(精确匹配)if len(pinyin_words) == 1:# 单词拼音匹配if pinyin_words[0] in words:return Trueelse:# 多词拼音匹配 - 检查连续词语是否匹配拼音顺序for i in range(len(words) - len(pinyin_words) + 1):segment = words[i:i+len(pinyin_words)]if " ".join(segment) == pinyin:return Truereturn Falsedef delay(seconds):"""简单的延迟函数,避免过度占用CPU资源"""time.sleep(seconds)# 主流程:录音 -> 语音识别 -> AI对话 -> 语音合成与播放
if __name__ == "__main__":while True:print("👂 正在监听唤醒词...")record_audio("wakeup.wav", duration=3)  # 短录音用于唤醒检测wakeup_text = transcribe_whisper("wakeup.wav")if is_wakeup_keyword(wakeup_text):print(f"✅ 检测到唤醒词!开始交互...")record_audio()  # 录音user_text = transcribe_whisper()  # 语音转文本reply_text = chat_with_ollama(user_text)  # AI对话speak_text(reply_text)  # 语音合成与播放else:print("💤 未检测到唤醒词,继续监听...")# 添加延迟避免CPU过载delay(0.5)

功能详解

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 播放生成的音频文件
  • 支持多种语音选择

5. 唤醒检测模块

``python
def is_wakeup_keyword(text, wakeup_keywords=[“一号助手”,“我的助手”]):
“”“检查文本中是否包含唤醒关键词”“”
text = text.lower()
for keyword in wakeup_keywords:
if keyword.lower() in text:
return True
return False


功能说明:
- 实现多唤醒词支持
- 不区分大小写匹配
- 可自定义唤醒词列表
- 添加了中文注释说明## 使用说明### 1. 启动准备```bash
# 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
  1. 低功耗监听 - 通过唤醒词机制减少不必要的资源消耗
    • 初始3秒短录音用于唤醒检测
    • 只有检测到唤醒词才激活完整功能
    • 有效降低CPU和内存使用率
  2. 中文优化 - 完全支持中文语音识别和合成
    • 支持中文唤醒词检测
    • 支持中文语音转文字
    • 支持中文文本转语音
  3. 拼音匹配增强 - 提升唤醒准确性和容错能力
    • 实现中英文混合唤醒词识别
    • 支持同音字匹配(如"一"与"依")
    • 支持纯拼音输入识别(如"yi hao zhu shou")
    • 智能纠错:对语音识别结果进行拼音级比对
    • 提高在嘈杂环境下的唤醒成功率
  4. 模块化设计 - 各个组件可独立升级和替换
    • 清晰的函数划分
    • 标准化的输入输出接口
    • 易于维护和扩展
  5. 良好的用户体验 - 包含详细的日志输出和错误处理
    • 彩色状态提示(录音、处理、播放等)
    • 完善的错误检测机制
    • 用户友好的交互设计
  6. 可扩展性强 - 易于集成新的大模型或语音服务
    • 可更换不同的语音识别引擎
    • 支持多种TTS语音模型
    • 可对接不同的大语言模型服务

总结

本项目展示了一个完整的语音交互系统的实现方案,通过整合多个开源工具和API,构建了一个实用的智能语音助手。系统具有良好的扩展性和可维护性,可根据需要进一步优化和扩展功能。

  • 项目展示了如何将语音技术与大语言模型结合
  • 提供了本地化部署的完整解决方案
  • 实现了从语音输入到语音输出的完整闭环
  • 可作为智能助手、智能家居控制等场景的基础框架

http://www.hkcw.cn/article/FISWPMGtLA.shtml

相关文章

Vue框架2(vue搭建方式2:利用脚手架,ElementUI)

一.引入vue第二种搭建方式 在以前的前端项目中,一个项目需要多个html文件实现页面之前的切换,如果页面中需要依赖js或者css文件,那么我们就需要在多个html文件中都需要导入vue.js文件,太过繁琐. 现在前端开发都采用单页面结果,一个项目中只有一个html文件 其他不同的内容都写…

维斯塔潘谈和拉塞尔碰撞 意外相撞引发讨论

在F1西班牙大奖赛正赛中,维斯塔潘因与拉塞尔相撞被罚时10秒,最终排名第十。赛后采访中,记者问及那次碰撞。维斯塔潘表示两人开车时确实撞到了一起。当记者指出他本可以避免这种情况时,维斯塔潘承认了这一点。至于为什么会发生这样的情况,他表示自己也不清楚。责任编辑:zx…

乌称摧毁俄大量轰炸机 俄媒称系谣言 谎言蛛网

俄罗斯“与假新闻作战”网站发布文章称,通过分析乌克兰方面发布的视频可以确认,乌总统泽连斯基所谓“已摧毁34%俄罗斯远程机队”的说法并不属实。俄方认为,乌方的行动更像是编织了一张“谎言蛛网”。俄方分析指出,乌克兰实际上可能仅摧毁了两架图-95战略轰炸机及一架安-12运…

IntelliJ IDEA 接入 Ollama 本地模型 Qwen-coder

一:下载ollama 官网下载https://ollama.com/ 二:安装 一键自动安装,且安装的是C盘 如果C盘紧张,想装在其他盘符,在安装包目录下打开cmd命令行, 在你想安装的盘下创建一个文件夹,例如在D盘创建…

C++学习-入门到精通【12】文件处理

C学习-入门到精通【12】文件处理 目录 C学习-入门到精通【12】文件处理一、文件和流二、创建顺序文件三、从顺序文件读取数据文件定位指针对之前的程序进行修改:贷款查询程序 四、更新顺序文件五、随机存取文件1.创建随机存取文件2.修改程序:贷款处理程序…

生成式AI模型的重要评估指标——FID

1、引言 随着深度学习的发展迅速,生成式模型如生成对抗网络(GAN)、变分自编码器(VAE)等取得了显著的进展。看似逼真的图像数据,仍旧会有结构缺陷等情况发生,那么如何客观、准确的评估这些生成式…

第十:如何在Pycharm中安装AI插件(Proxy AI)

一.安装插件 1.通过官网安装:https://plugins.jetbrains.com/plugin/21056-proxy-ai2.通过设置安装:设置->插件->搜索:Proxy AI->点击安装3.安装后重启二.配置插件 1.配置路径:设置 -> 工具 -> CodeGPT或者Proxy…

在Visual Studio开发平台使用通义灵码:AI代码助手的深度实践指南

引言:当经典IDE遇见AI代码革命 Visual Studio(以下简称VS)作为微软推出的旗舰级集成开发环境,长期占据企业级开发工具的核心地位。然而,在智能化浪潮下,传统IDE的代码编写效率瓶颈日益显现。阿里云推出的通…

为什么你必须降AI?——写给每一位学生与科研人

📉 为什么要降 AI 检测率?一篇文章带你看清真相! 随着AI大模型的发展,越来越多的人开始使用人工智能辅助写作,无论是撰写论文、文案,还是职称申请材料,都大大提升了效率。然而,随之…

万字长文带你深度探索 MCP:AI 连接的未来之光​,MCP如何让AI产生“心灵感应“

文章目录 一、引言:开启 MCP 的神秘大门​二、MCP 的基本概念解析​2.1 MCP 的定义与内涵​2.2 与传统协议的区别与优势​ 三、MCP 的技术原理深度剖析​3.1 核心技术架构​3.2 数据格式与通信协议​ 四、MCP 的应用案例全景展示​4.1 WhatsApp MCP:AI 助…

【人工智能】人工智能的10大算法详解(优缺点+实际案例)

人工智能(AI)是现代科技的重要领域,其中的算法是实现智能的核心。本文将介绍10种常见的人工智能算法,包括它们的原理、训练方法、优缺点及适用场景。 1. 线性回归(Linear Regression) 模型原理 线性回归…

程序员鱼皮最新项目-----AI超级智能体教程(一)

文章目录 1.前言1.什么是AI大模型2.什么是多模态3.阿里云百炼平台介绍3.1文本调试展示3.2阿里云和dashscope的关系3.3平台智能体应用3.4工作流的创建3.5智能体编排应用 1.前言 最近鱼皮大佬出了一套关于这个AI 的教程,关注鱼皮大佬很久了,鱼皮大佬确实在…

Oracle官方MySQL+APEX+AI限时免费预约流程大全

📢📢📢📣📣📣 作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯…

AI 高手之路 #6:Pandas 数据处理——AI 数据清洗与准备

目录 引言:为什么 Pandas 是 AI 数据处理的瑞士军刀?Pandas 核心数据结构:精巧的矛与盾 2.1 Series:一维数据的精巧之矛 创建 Series:从零开始构建Series 索引和切片:精准定位与范围选取Series 运算:灵活的数据操作2.2 DataFrame:二维数据的坚实之盾 创建 DataFrame:构…

初学者如何微调大模型?从0到1详解

本文将手把手带你从0到1,详细解析初学者如何微调大模型,让你也能驾驭这些强大的AI工具。 1. 什么是大模型微调? 想象一下,预训练大模型就像一位博览群书但缺乏专业知识的通才。它掌握了海量的通用知识,但可能无法完美…

2008-2023年 上市公司-企业研发操纵数据-社科经管实证数据

2008-2023年上市公司-企业研发操纵数据-社科经管https://download.csdn.net/download/paofuluolijiang/90880455 https://download.csdn.net/download/paofuluolijiang/90880455 覆盖2008-2023年A股上市公司的研发操纵行为,累计包含超3.4万条观测值,涉及…

马斯克:不想为美政府所做的一切担责 成裁员替罪羊

当地时间6月1日,美国企业家埃隆马斯克在接受哥伦比亚广播公司采访时表达了他对政府的态度。他表示自己并不想公开反对美国政府,但也不愿意为政府所做的一切承担责任。马斯克提到,他领导的“政府效率部”成了所有问题的替罪羊,无论裁员是否真实发生,责任都被推到了该部门头…

歼-10超低空飞行含金量超高 飞行员技术与胆识的双重考验

歼-10战斗机是中国自主研制的高性能、多用途、全天候的第三代战斗机,能够完成震撼的超低空飞行。其动作流畅自如,如行云流水般展示挂载和低空盘旋等高难度动作。对于飞行员而言,利用山谷地形进行超低空飞行不仅有助于隐蔽行动,还能有效避开敌方雷达探测,实现突然袭击。尽管…

F1西班牙站正赛:皮亚斯特里夺冠,迈凯伦领跑

北京时间6月1日,F1西班牙大奖赛正赛结束。皮亚斯特里夺冠,诺里斯和勒克莱尔分别获得第二和第三名。拉塞尔、霍肯博格、汉密尔顿、哈贾尔、加斯利、阿隆索和维斯塔潘依次位列第四至第十名。安东内利和阿尔本因故退赛。比赛开始时,两台迈凯伦赛车占据头排位置,维斯塔潘和拉塞…

【办公类-22-05】20250601Python模拟点击鼠标上传CSDN12篇

、 背景需求: 每周为了获取流量券,每天上传2篇,获得1500流量券,每周共上传12篇,才能获得3000和500的券。之前我用UIBOT模拟上传12篇。 【办公类-22-04】20240418 UIBOT模拟上传每天两篇,获取流量券,并删除内容_csdn 每日任务流量券-CSDN博客文章浏览阅读863次,点赞18…