news 2026/4/23 15:59:31

Qwen1.5-0.5B-Chat部署扩展:增加语音输入功能教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Qwen1.5-0.5B-Chat部署扩展:增加语音输入功能教程

Qwen1.5-0.5B-Chat部署扩展:增加语音输入功能教程

1. 引言

1.1 学习目标

本文将指导你如何在已部署的Qwen1.5-0.5B-Chat轻量级对话服务基础上,集成语音输入功能,实现“说话即可提问”的交互体验。完成本教程后,你将掌握:

  • 如何在 Flask WebUI 中添加麦克风录音按钮
  • 使用浏览器 Web Audio API 实现前端语音采集
  • 将音频流上传至后端并转换为文本(语音识别)
  • 调用本地 ASR 模型进行离线语音转写
  • 与 Qwen 模型无缝对接,实现语音→文本→回复→文本输出的完整链路

本方案完全基于 CPU 运行,适合边缘设备、低配服务器或隐私敏感场景。

1.2 前置知识

建议具备以下基础:

  • Python 基础语法与虚拟环境使用
  • Flask 框架基本结构理解
  • HTML/JavaScript 简单前端知识
  • 对 ModelScope 和 Transformers 有一定了解

1.3 教程价值

当前多数大模型应用仍依赖键盘输入,限制了其在智能音箱、车载系统、老年辅助等场景的落地。通过本教程,你将获得一个可直接部署的语音增强版 Qwen 聊天系统,具备以下优势:

  • 完全本地化运行,无第三方 API 依赖
  • 支持中文高准确率语音识别(ASR)
  • 低延迟、低资源消耗,适配轻量模型生态
  • 模块化设计,易于移植到其他 LLM 项目

2. 环境准备与依赖安装

2.1 创建独立 Conda 环境

确保你已在原项目环境中操作,若未创建,请执行:

conda create -n qwen_env python=3.9 conda activate qwen_env

2.2 安装新增依赖库

本功能需引入语音处理相关库,请安装以下包:

pip install torch torchaudio pip install transformers pip install flask-wtf flask-cors pip install numpy scipy

注意transformers已用于 Qwen 推理,此处确保版本 ≥4.36 支持 Whisper 模型。

我们选用Facebook 的 Speech2Text 模型作为 ASR 引擎,因其支持离线运行且对中文友好。推荐使用facebook/s2t-small-mustc-en-fr-pt或更轻量的openai/whisper-tiny

安装 Whisper 支持:

pip install git+https://github.com/openai/whisper.git

2.3 下载语音识别模型

选择一个轻量 ASR 模型以匹配 0.5B 级别的推理能力:

from transformers import Speech2TextProcessor, Speech2TextForConditionalGeneration import torch model_name = "facebook/s2t-small-mustc-en-fr-pt" processor = Speech2TextProcessor.from_pretrained(model_name) model_asr = Speech2TextForConditionalGeneration.from_pretrained(model_name) # 保存到本地缓存目录 processor.save_pretrained("./asr_model/") model_asr.save_pretrained("./asr_model/")

该模型约占用 300MB 存储空间,可在 CPU 上实现秒级转录。


3. 前端改造:添加语音输入界面

3.1 修改 HTML 页面结构

打开原项目的templates/index.html文件,在输入框区域添加语音按钮:

<div class="input-group"> <textarea id="user-input" placeholder="请输入您的问题..." rows="3"></textarea> <button id="voice-btn" title="点击开始录音"> 🎤 </button> <button id="send-btn">发送</button> </div>

3.2 添加 JavaScript 录音逻辑

<script>标签中加入以下代码:

let mediaRecorder; let audioChunks = []; const voiceBtn = document.getElementById('voice-btn'); const userInput = document.getElementById('user-input'); // 请求麦克风权限 async function startRecording() { try { const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); mediaRecorder = new MediaRecorder(stream); audioChunks = []; mediaRecorder.ondataavailable = event => { audioChunks.push(event.data); }; mediaRecorder.onstop = async () => { const audioBlob = new Blob(audioChunks, { type: 'audio/wav' }); await sendAudioToServer(audioBlob); }; mediaRecorder.start(); voiceBtn.textContent = '⏹️'; voiceBtn.disabled = true; setTimeout(() => { if (mediaRecorder.state === 'recording') { mediaRecorder.stop(); stream.getTracks().forEach(track => track.stop()); voiceBtn.textContent = '🎤'; voiceBtn.disabled = false; } }, 5000); // 最长录制5秒 } catch (err) { alert('无法访问麦克风: ' + err.message); } } // 发送音频到后端 async function sendAudioToServer(blob) { const formData = new FormData(); formData.append('audio', blob, 'record.wav'); const response = await fetch('/transcribe', { method: 'POST', body: formData }); const result = await response.json(); if (result.text) { userInput.value = result.text; } else { alert('语音识别失败: ' + result.error); } } // 绑定事件 voiceBtn.addEventListener('click', () => { if (voiceBtn.textContent === '🎤') { startRecording(); } });

说明:此脚本实现自动停止(最长5秒),避免长时间录音影响用户体验。


4. 后端开发:实现语音转写接口

4.1 新增 Flask 路由/transcribe

在主应用文件(如app.py)中添加新路由:

from flask import request, jsonify, send_from_directory import torchaudio import numpy as np import io import soundfile as sf @app.route('/transcribe', methods=['POST']) def transcribe_audio(): if 'audio' not in request.files: return jsonify({'error': '未收到音频文件'}), 400 file = request.files['audio'] try: # 读取音频数据 audio_data, sample_rate = sf.read(io.BytesIO(file.read())) # 重采样至16kHz(ASR模型要求) if sample_rate != 16000: resampler = torchaudio.transforms.Resample(orig_freq=sample_rate, new_freq=16000) waveform = torch.from_numpy(audio_data.T).float() if waveform.shape[0] > 1: # 多通道转单通道 waveform = waveform.mean(dim=0, keepdim=True) waveform = resampler(waveform) else: waveform = torch.from_numpy(audio_data).float() # 预处理并推理 inputs = processor(waveform.squeeze(0), sampling_rate=16000, return_tensors="pt", padding=True) with torch.no_grad(): generated_ids = model_asr.generate(inputs["input_features"], max_length=200) transcription = processor.batch_decode(generated_ids, skip_special_tokens=True)[0] return jsonify({'text': transcription.strip()}) except Exception as e: return jsonify({'error': str(e)}), 500

4.2 加载 ASR 模型(启动时加载一次)

在应用初始化部分添加:

from transformers import Speech2TextProcessor, Speech2TextForConditionalGeneration # 全局变量存储模型 model_asr = None processor = None def load_asr_model(): global model_asr, processor model_path = "./asr_model/" try: processor = Speech2TextProcessor.from_pretrained(model_path) model_asr = Speech2TextForConditionalGeneration.from_pretrained(model_path) print("✅ ASR 模型加载成功") except Exception as e: print(f"❌ ASR 模型加载失败: {e}") # 可选:从 Hugging Face 自动下载 # processor = Speech2TextProcessor.from_pretrained("facebook/s2t-small-mustc-en-fr-pt") # model_asr = Speech2TextForConditionalGeneration.from_pretrained("facebook/s2t-small-mustc-en-fr-pt") # 在 app.run() 前调用 load_asr_model()

5. 系统整合与测试验证

5.1 功能流程验证

完整的语音交互流程如下:

  1. 用户点击 🎤 按钮 → 浏览器请求麦克风权限
  2. 开始录音 → 5秒后自动停止并上传.wav文件
  3. 后端/transcribe接口接收音频 → 使用 ASR 模型转写为文本
  4. 文本填充至输入框 → 用户可编辑后发送
  5. 正常调用 Qwen1.5-0.5B-Chat 获取回复

5.2 性能优化建议

优化项建议
内存占用使用s2t-tinywhisper-tiny替代 large 模型
延迟控制设置最大录音时长(如 5s),防止过长输入
缓存机制对常用语音指令做关键词缓存(如“你好”、“退出”)
错误处理添加网络中断、静音检测、格式异常捕获

5.3 常见问题解答(FAQ)

Q1:点击语音按钮无反应?
A:检查浏览器是否允许麦克风权限,建议使用 Chrome 或 Edge 浏览器,并确保页面通过 HTTPS 或 localhost 访问。

Q2:语音识别准确率低?
A:尝试更换 ASR 模型,例如使用openai/whisper-tiny并指定中文语言:

generated_ids = model_asr.generate( inputs["input_features"], max_length=200, forced_bos_token_id=processor.tokenizer.lang_code_to_id["zh"] )

Q3:Can't convert object of type float to Tensor?
A:确保soundfile.read()返回的是 NumPy 数组,且维度正确。可用np.expand_dims(data, 0)补充批次维度。


6. 总结

6.1 学习路径建议

本文实现了 Qwen1.5-0.5B-Chat 的语音输入扩展,构建了一个完整的“语音对话机器人”原型。下一步你可以继续深入:

  • 添加 TTS(文本转语音)功能,实现全双工语音交互
  • 使用 ONNX Runtime 加速 ASR 模型推理
  • 集成唤醒词检测(如 Snowboy)实现免按键唤醒
  • 将系统打包为 Docker 镜像,便于跨平台部署

6.2 资源推荐

  • ModelScope 模型库:https://modelscope.cn
  • Transformers 文档:https://huggingface.co/docs/transformers
  • Web Audio API 指南:MDN 官方文档
  • Whisper 中文实践案例:GitHub 搜索whisper chinese asr

获取更多AI镜像

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 12:57:45

超详细版解析树莓派GPIO插针电气特性

树莓派GPIO电气特性全解析&#xff1a;从底层参数到实战避坑 你有没有遇到过这种情况&#xff1f; 接上一个简单的按钮&#xff0c;树莓派却反复误触发&#xff1b;点亮几颗LED&#xff0c;亮度忽明忽暗&#xff1b;IC总线通信时断时续&#xff0c;查遍代码也找不到问题…… …

作者头像 李华
网站建设 2026/4/23 13:02:54

测试开机启动脚本安全加固:以非root用户运行脚本实践

测试开机启动脚本安全加固&#xff1a;以非root用户运行脚本实践 1. 引言 在Linux系统运维和自动化部署中&#xff0c;开机启动脚本是实现服务自启、环境初始化和系统配置的重要手段。然而&#xff0c;许多传统启动脚本默认以root权限运行&#xff0c;带来了显著的安全风险—…

作者头像 李华
网站建设 2026/4/23 12:52:38

Fun-ASR麦克风权限问题解决,轻松开启实时录音

Fun-ASR麦克风权限问题解决&#xff0c;轻松开启实时录音 在使用 Fun-ASR WebUI 进行语音识别时&#xff0c;实时流式识别功能是提升交互效率的核心能力之一。然而&#xff0c;许多用户在首次尝试通过麦克风进行实时录音时&#xff0c;常常遇到“无法启用麦克风”或“浏览器拒…

作者头像 李华
网站建设 2026/4/18 9:56:09

BongoCat桌面宠物:三种使用场景下的完整配置指南

BongoCat桌面宠物&#xff1a;三种使用场景下的完整配置指南 【免费下载链接】BongoCat 让呆萌可爱的 Bongo Cat 陪伴你的键盘敲击与鼠标操作&#xff0c;每一次输入都充满趣味与活力&#xff01; 项目地址: https://gitcode.com/gh_mirrors/bong/BongoCat 你是不是也厌…

作者头像 李华
网站建设 2026/4/23 14:15:51

小白也能懂的gpt-oss-20b部署教程,网页推理超简单

小白也能懂的gpt-oss-20b部署教程&#xff0c;网页推理超简单 1. 引言&#xff1a;为什么选择 gpt-oss-20b&#xff1f; 你是否曾幻想过&#xff0c;在自己的设备上运行一个接近 GPT-4 水平的大语言模型&#xff1f;无需依赖云端 API&#xff0c;不担心数据泄露&#xff0c;还…

作者头像 李华