internlm2-chat-1.8b在Ollama中启用语音输入:Whisper+InternLM端到端演示
本文介绍了如何在星图GPU平台上自动化部署【书生·浦语】internlm2-chat-1.8b镜像,并结合Whisper语音识别模型,构建一个端到端的本地语音对话AI助手。该方案让用户无需打字,通过自然语音即可与模型交互,适用于厨房查询、驾驶问询等需要解放双手的便捷对话场景。
internlm2-chat-1.8b在Ollama中启用语音输入:Whisper+InternLM端到端演示
想象一下,你正在厨房做饭,双手沾满了面粉,突然想查一个菜谱。或者你正在开车,想问问天气和路况。又或者,你只是想更自然地与AI对话,就像和朋友聊天一样。在这些场景下,打字显然不是最方便的选择。
今天,我们就来解决这个问题。我将带你一步步实现一个酷炫的功能:让部署在Ollama上的internlm2-chat-1.8b模型“听懂”你的声音。我们将使用开源的Whisper语音识别模型,搭建一个从“语音输入”到“文本对话”再到“文字输出”的完整流程。整个过程不需要复杂的配置,用Python就能轻松搞定。
读完本文,你将掌握:
- 如何快速搭建一个本地的语音对话AI助手。
- 理解Whisper语音识别与InternLM文本生成模型的协同工作流程。
- 获得一套可直接运行、可扩展的Python代码。
1. 准备工作与环境搭建
在开始动手之前,我们需要确保“舞台”已经搭好。这里主要依赖两个核心工具:Ollama和Whisper。
1.1 确保Ollama与InternLM2模型就绪
首先,你需要已经通过Ollama成功部署了internlm2:1.8b模型。如果还没有,操作非常简单:
- 打开你的终端(命令行)。
- 输入以下命令拉取并运行模型:
ollama run internlm2:1.8b - 看到模型开始运行并出现对话提示符
>>>,就说明模型已经准备就绪了。你可以先输入一段文字测试一下,比如“你好”,看看它是否能正常回复。
小提示:Ollama默认会在本地启动一个API服务(通常是http://localhost:11434),这是我们后续用代码和它“对话”的桥梁。
1.2 安装必要的Python库
我们的脚本主要依赖几个Python库。建议你创建一个新的虚拟环境来安装它们,以避免与现有项目冲突。
打开终端,使用pip安装以下库:
pip install openai-whisper # 核心的语音识别库
pip install sounddevice # 用于录制音频
pip install scipy # 用于处理音频数据
pip install numpy # 基础数值计算
pip install requests # 用于发送HTTP请求到Ollama API
关于Whisper的说明:openai-whisper库在首次运行时会自动下载模型文件。我们这里使用最小的tiny模型,它速度快、体积小,适合实时演示。如果你的机器性能较好,也可以选择base或small模型以获得更好的识别精度。
2. 核心原理与流程设计
在写代码之前,我们先理清整个系统是如何工作的。这就像一份“食谱”,知道了步骤,做起来就心中有数了。
我们的语音对话助手工作流程分为清晰的四步:
- 聆听:使用电脑的麦克风录制你的一段语音。
- 转写:将录制好的音频文件送入Whisper模型,识别出对应的文字。
- 思考:将识别出的文字作为问题,通过API发送给Ollama上运行的
internlm2-chat-1.8b模型。 - 回答:接收模型生成的文本回复,并显示在屏幕上。
这个过程形成了一个完整的闭环:语音 -> 文本 -> AI思考 -> 文本回复。整个过程中,用户只需要说话,无需触碰键盘。
3. 分步实现端到端语音对话
接下来,我们一步步将上面的流程变成代码。我会提供完整的代码片段并加以解释。
3.1 第一步:录制语音
我们使用sounddevice库来录制音频。下面的函数record_audio负责这个任务。
import sounddevice as sd
import scipy.io.wavfile as wav
import numpy as np
def record_audio(filename, duration=5, samplerate=16000):
"""
录制一段音频并保存为WAV文件。
参数:
filename: 保存的音频文件名(如‘recording.wav‘)。
duration: 录制时长,单位秒(默认5秒)。
samplerate: 采样率(默认16000Hz,Whisper推荐)。
"""
print(f"\n🎤 准备录制 {duration} 秒音频...(请说话)")
# 开始录制
recording = sd.rec(int(duration * samplerate),
samplerate=samplerate,
channels=1, # 单声道
dtype='int16')
sd.wait() # 等待录制结束
print("✅ 录制完成!")
# 保存为WAV文件
wav.write(filename, samplerate, recording)
print(f"💾 音频已保存至:{filename}")
return filename
代码解释:
sd.rec函数是录制的核心,它指定了要录制多少秒(采样点数)、采样率和格式。sd.wait()确保程序等待录制完成后才继续执行。- 我们将音频保存为WAV格式,这是一种无损且被广泛支持的格式。
3.2 第二步:语音转文字(Whisper)
录制好音频后,我们用Whisper来识别它。我们加载tiny模型,它足够快。
import whisper
def transcribe_audio(filename):
"""
使用Whisper模型将音频文件转写成文字。
参数:
filename: 音频文件路径。
返回:
识别出的文本字符串。
"""
print("🔍 正在识别语音内容...")
# 加载模型(首次运行会自动下载)
model = whisper.load_model("tiny")
# 进行识别
result = model.transcribe(filename, language="zh")
transcribed_text = result["text"].strip()
print(f"📝 识别结果:{transcribed_text}")
return transcribed_text
重要提示:language="zh"参数指定了识别中文。如果你主要说英文,可以改为"en"或移除这个参数让模型自动检测。识别精度会随着模型增大(如base, small)而提升,但速度会变慢。
3.3 第三步:与InternLM模型对话(Ollama API)
现在,我们把识别出的文本发送给internlm2-chat-1.8b模型。Ollama提供了类似OpenAI的API接口,非常方便。
import requests
import json
def ask_ollama(prompt, model="internlm2:1.8b", api_url="http://localhost:11434/api/generate"):
"""
通过Ollama API向指定模型提问。
参数:
prompt: 输入的文本提示。
model: 使用的模型名称。
api_url: Ollama API地址。
返回:
模型生成的回复文本。
"""
print("🤖 正在思考中...")
# 构造请求数据
payload = {
"model": model,
"prompt": prompt,
"stream": False # 设为False一次性获取完整回复
}
headers = {'Content-Type': 'application/json'}
try:
# 发送POST请求
response = requests.post(api_url, data=json.dumps(payload), headers=headers)
response.raise_for_status() # 检查请求是否成功
# 解析返回的JSON数据
result = response.json()
answer = result.get("response", "").strip()
print(f"💬 模型回复:{answer}")
return answer
except requests.exceptions.RequestException as e:
print(f"❌ 请求Ollama API时出错:{e}")
return None
代码解释:
- 我们向
http://localhost:11434/api/generate这个地址发送一个POST请求。 - 请求体是一个JSON,告诉Ollama用哪个模型(
model)回答什么问题(prompt)。 stream: False意味着我们等待模型完全生成答案后再一次性获取。如果设为True,则可以实现像打字机一样逐字输出的效果。
3.4 第四步:整合所有功能
最后,我们创建一个主函数main(),把以上三个步骤串联起来,形成一个完整的交互循环。
def main():
"""主函数,运行语音对话循环。"""
print("="*50)
print("🎧 InternLM2 语音对话助手已启动!")
print("="*50)
print("操作说明:")
print("1. 程序将开始录音(默认5秒)。")
print("2. 请对着麦克风清晰地说出你的问题。")
print("3. 程序会自动识别、提问并显示回答。")
print("4. 输入‘退出’或‘quit’可结束程序。")
print("-"*50)
while True:
# 1. 录制音频
audio_file = "temp_recording.wav"
record_audio(audio_file, duration=5)
# 2. 语音转文字
user_input = transcribe_audio(audio_file)
# 检查用户是否想退出
if user_input.lower() in ["退出", "quit", "exit"]:
print("👋 感谢使用,再见!")
break
if not user_input:
print("⚠️ 未识别到有效语音,请重试。")
continue
# 3. 向模型提问
answer = ask_ollama(user_input)
if answer:
print(f"\n💡 对话完成。准备进行下一轮...\n{'-'*30}")
else:
print("⚠️ 未能获取模型回复。")
if __name__ == "__main__":
main()
这个main()函数实现了一个循环,可以让你持续地进行语音对话,直到你主动说出“退出”。
4. 运行与效果体验
现在,让我们来运行这个脚本,看看实际效果如何。
- 保存代码:将上面的所有代码块按顺序复制到一个Python文件中,例如命名为
voice_chat_with_internlm.py。 - 运行脚本:在终端中,切换到文件所在目录,运行:
python voice_chat_with_internlm.py - 开始对话:程序启动后,你会看到提示信息。紧接着,它会开始5秒倒计时录音(你可以修改
record_audio函数中的duration参数来调整)。对着麦克风清晰地说出你的问题,比如:“今天天气怎么样?”或者“讲一个关于太空的短故事。” - 观察过程:你会依次看到:
- “准备录制...”
- “录制完成!”
- “正在识别语音内容...”
- “识别结果:今天天气怎么样?”
- “正在思考中...”
- “模型回复:今天天气很好,阳光明媚,适合外出。”(回复内容因模型生成而异)
实际效果展示: 我测试了几个问题,效果令人满意:
- 问:“上海的特色小吃有什么?”(语音输入)
- 识别:Whisper准确转写为文字。
- InternLM回复:“上海有很多特色小吃,比如小笼包、生煎包、排骨年糕、南翔馒头等,都非常有名。”(模型生成)
- 体验:从说话到看到答案,整个过程在10秒内完成,基本实现了“即问即答”的流畅体验。识别准确率对于清晰的中文口语很高,模型的回答也相关且连贯。
5. 进阶优化与实用建议
基本的流程跑通了,但你可能希望它更好用。这里有一些简单的优化方向:
5.1 提升语音识别准确性
- 更换更大的Whisper模型:将
whisper.load_model("tiny")中的"tiny"改为"base"或"small",识别精度会显著提升,尤其是对于带口音或嘈杂环境下的语音,但需要更多的计算资源和时间。 - 添加静音检测(VAD):与其固定录制5秒,不如让程序检测到你开始说话时才录制,你说完就自动停止。这需要用到像
webrtcvad这样的库,可以避免录制长时间静音,体验更自然。
5.2 改善对话体验
- 实现流式输出:将
ask_ollama函数中的"stream": False改为True,然后处理返回的数据流。这样模型的回答会一个字一个字地显示出来,更像是在“思考”和“打字”,体验更佳。 - 添加对话历史:目前的每次问答都是独立的。你可以修改请求的
payload,加入"context"字段来传递之前的对话历史,让模型拥有记忆,能够进行多轮连贯的对话。 - 增加语音输出(TTS):让AI不仅“能听”,还要“会说”。你可以集成一个本地TTS(文本转语音)库,如
pyttsx3或edge-tts,将模型的文字回复用语音读出来,实现真正的全语音交互。
5.3 处理常见问题
- Ollama连接错误:确保Ollama应用正在运行。可以在浏览器中访问
http://localhost:11434,如果能看到Ollama的API文档页面,说明服务正常。 - 没有声音或录音失败:检查系统的麦克风设置是否正确,并确保
sounddevice库能列出你的麦克风设备(可通过python -m sounddevice命令查看)。 - 识别结果为空:可能是录音音量太小,或者背景噪音太大。尝试提高音量,或在安静环境下使用。也可以适当延长录音时间。
6. 总结
通过本文的实践,我们成功地将Whisper语音识别模型与Ollama部署的InternLM2-Chat-1.8B对话模型连接起来,构建了一个本地的、端到端的语音对话AI助手原型。
这个项目的核心价值在于:
- 降低了交互门槛:用户无需打字,通过最自然的语音即可与强大的大语言模型交互。
- 展示了模块化集成的思路:我们利用Whisper处理“听觉”,利用InternLM处理“思考”,这种“专业模型做专业事”的思路是构建复杂AI应用的关键。
- 提供了完整的可运行代码:从环境准备、原理讲解到代码实现,你获得了一个可以直接运行和二次开发的起点。
这个演示只是一个开始。你可以在此基础上,加入我提到的进阶功能,如流式响应、对话记忆、语音合成,甚至为其开发一个图形界面(GUI),将其打造成一个功能完善的个人AI语音助手。
技术的魅力在于将想象变为现实。现在,你的电脑不仅能读懂文字,还能听懂你的声音了。下一步,你想让它为你做些什么呢?
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐
所有评论(0)