news 2026/3/4 2:56:07

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/3/3 5:20:38

3分钟快速上手:DSU Sideloader安卓系统切换终极指南

3分钟快速上手&#xff1a;DSU Sideloader安卓系统切换终极指南 【免费下载链接】DSU-Sideloader A simple app made to help users easily install GSIs via DSUs Android feature. 项目地址: https://gitcode.com/gh_mirrors/ds/DSU-Sideloader DSU Sideloader是一个专…

作者头像 李华
网站建设 2026/2/28 17:01:42

麦橘超然配置教程:云端GPU解决环境冲突,快速体验

麦橘超然配置教程&#xff1a;云端GPU解决环境冲突&#xff0c;快速体验 作为一名计算机专业的学生&#xff0c;你肯定遇到过这种让人抓狂的场景&#xff1a;为了完成一个AI项目&#xff0c;你需要安装特定版本的PyTorch&#xff0c;但你的电脑上已经装了另一个版本。更糟的是…

作者头像 李华
网站建设 2026/3/1 7:09:41

YOLOv12镜像验证模型准确率操作指南

YOLOv12镜像验证模型准确率操作指南 在目标检测技术快速演进的今天&#xff0c;YOLOv12作为新一代以注意力机制为核心的实时检测器&#xff0c;凭借其卓越的精度与效率表现&#xff0c;正在成为工业质检、智能监控和自动驾驶等场景中的首选方案。然而&#xff0c;模型的实际性…

作者头像 李华
网站建设 2026/3/1 13:17:47

ms-swift实测:GRPO算法让模型智能提升的秘密

ms-swift实测&#xff1a;GRPO算法让模型智能提升的秘密 1. 引言&#xff1a;从“能说”到“会想”的智能跃迁 在大模型迈向真正“智能体”的道路上&#xff0c;一个核心挑战逐渐浮现&#xff1a;如何让模型不只是复述知识、生成通顺语句&#xff0c;而是能在复杂任务中做出有…

作者头像 李华
网站建设 2026/2/27 5:00:39

Arduino循迹小车从零实现:Uno平台传感器布局详解

从零打造高鲁棒性Arduino循迹小车&#xff1a;传感器布局与控制逻辑深度实践你有没有试过自己动手做一个能自动沿着黑线跑的小车&#xff1f;看起来简单&#xff0c;但真正做起来才发现——它总是“抽风”&#xff1a;直道上左右摇摆&#xff0c;弯道直接冲出去&#xff0c;遇到…

作者头像 李华
网站建设 2026/2/28 21:59:59

3分钟掌握QtScrcpy键鼠映射:让键盘鼠标成为你的手机游戏手柄

3分钟掌握QtScrcpy键鼠映射&#xff1a;让键盘鼠标成为你的手机游戏手柄 【免费下载链接】QtScrcpy Android实时投屏软件&#xff0c;此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限 项目地址: https://gitcode.com/barry-ran/QtS…

作者头像 李华