internlm2-chat-1.8b在Ollama中启用语音输入:Whisper+InternLM端到端演示

想象一下,你正在厨房做饭,双手沾满了面粉,突然想查一个菜谱。或者你正在开车,想问问天气和路况。又或者,你只是想更自然地与AI对话,就像和朋友聊天一样。在这些场景下,打字显然不是最方便的选择。

今天,我们就来解决这个问题。我将带你一步步实现一个酷炫的功能:让部署在Ollama上的internlm2-chat-1.8b模型“听懂”你的声音。我们将使用开源的Whisper语音识别模型,搭建一个从“语音输入”到“文本对话”再到“文字输出”的完整流程。整个过程不需要复杂的配置,用Python就能轻松搞定。

读完本文,你将掌握:

  1. 如何快速搭建一个本地的语音对话AI助手。
  2. 理解Whisper语音识别与InternLM文本生成模型的协同工作流程。
  3. 获得一套可直接运行、可扩展的Python代码。

1. 准备工作与环境搭建

在开始动手之前,我们需要确保“舞台”已经搭好。这里主要依赖两个核心工具:Ollama和Whisper。

1.1 确保Ollama与InternLM2模型就绪

首先,你需要已经通过Ollama成功部署了internlm2:1.8b模型。如果还没有,操作非常简单:

  1. 打开你的终端(命令行)。
  2. 输入以下命令拉取并运行模型:
    ollama run internlm2:1.8b
    
  3. 看到模型开始运行并出现对话提示符 >>>,就说明模型已经准备就绪了。你可以先输入一段文字测试一下,比如“你好”,看看它是否能正常回复。

小提示: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模型,它速度快、体积小,适合实时演示。如果你的机器性能较好,也可以选择basesmall模型以获得更好的识别精度。

2. 核心原理与流程设计

在写代码之前,我们先理清整个系统是如何工作的。这就像一份“食谱”,知道了步骤,做起来就心中有数了。

我们的语音对话助手工作流程分为清晰的四步:

  1. 聆听:使用电脑的麦克风录制你的一段语音。
  2. 转写:将录制好的音频文件送入Whisper模型,识别出对应的文字。
  3. 思考:将识别出的文字作为问题,通过API发送给Ollama上运行的internlm2-chat-1.8b模型。
  4. 回答:接收模型生成的文本回复,并显示在屏幕上。

这个过程形成了一个完整的闭环:语音 -> 文本 -> 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. 运行与效果体验

现在,让我们来运行这个脚本,看看实际效果如何。

  1. 保存代码:将上面的所有代码块按顺序复制到一个Python文件中,例如命名为voice_chat_with_internlm.py
  2. 运行脚本:在终端中,切换到文件所在目录,运行:
    python voice_chat_with_internlm.py
    
  3. 开始对话:程序启动后,你会看到提示信息。紧接着,它会开始5秒倒计时录音(你可以修改record_audio函数中的duration参数来调整)。对着麦克风清晰地说出你的问题,比如:“今天天气怎么样?”或者“讲一个关于太空的短故事。”
  4. 观察过程:你会依次看到:
    • “准备录制...”
    • “录制完成!”
    • “正在识别语音内容...”
    • “识别结果:今天天气怎么样?”
    • “正在思考中...”
    • “模型回复:今天天气很好,阳光明媚,适合外出。”(回复内容因模型生成而异)

实际效果展示: 我测试了几个问题,效果令人满意:

  • :“上海的特色小吃有什么?”(语音输入)
  • 识别: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(文本转语音)库,如pyttsx3edge-tts,将模型的文字回复用语音读出来,实现真正的全语音交互。

5.3 处理常见问题

  • Ollama连接错误:确保Ollama应用正在运行。可以在浏览器中访问http://localhost:11434,如果能看到Ollama的API文档页面,说明服务正常。
  • 没有声音或录音失败:检查系统的麦克风设置是否正确,并确保sounddevice库能列出你的麦克风设备(可通过python -m sounddevice命令查看)。
  • 识别结果为空:可能是录音音量太小,或者背景噪音太大。尝试提高音量,或在安静环境下使用。也可以适当延长录音时间。

6. 总结

通过本文的实践,我们成功地将Whisper语音识别模型Ollama部署的InternLM2-Chat-1.8B对话模型连接起来,构建了一个本地的、端到端的语音对话AI助手原型。

这个项目的核心价值在于:

  1. 降低了交互门槛:用户无需打字,通过最自然的语音即可与强大的大语言模型交互。
  2. 展示了模块化集成的思路:我们利用Whisper处理“听觉”,利用InternLM处理“思考”,这种“专业模型做专业事”的思路是构建复杂AI应用的关键。
  3. 提供了完整的可运行代码:从环境准备、原理讲解到代码实现,你获得了一个可以直接运行和二次开发的起点。

这个演示只是一个开始。你可以在此基础上,加入我提到的进阶功能,如流式响应、对话记忆、语音合成,甚至为其开发一个图形界面(GUI),将其打造成一个功能完善的个人AI语音助手。

技术的魅力在于将想象变为现实。现在,你的电脑不仅能读懂文字,还能听懂你的声音了。下一步,你想让它为你做些什么呢?


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐