Gradio语音识别插件开发:SenseVoice-Small ONNX模型集成到VS Code教程

Gradio语音识别插件开发:SenseVoice-Small ONNX模型集成到VS Code教程 Gradio语音识别插件开发SenseVoice-Small ONNX模型集成到VS Code教程1. 开篇为什么要在VS Code里做语音识别想象一下你正在写代码突然有个想法需要快速记下来但双手离不开键盘。或者你在分析一段音频采访需要把对话转成文字但不想离开熟悉的开发环境。这时候如果能在VS Code里直接搞定语音转文字是不是很方便今天我要分享的就是把一个强大的语音识别模型——SenseVoice-Small ONNX带量化版本——集成到VS Code里通过Gradio做个简单好用的界面。这个模型有个特点它不仅能识别语音还能听出说话人的情绪甚至能检测出背景里的笑声、掌声这些声音事件。最吸引人的是它的速度。官方说10秒的音频推理只要70毫秒比大家熟悉的Whisper-Large快15倍。而且支持超过50种语言中文、粤语、英语、日语、韩语都不在话下。下面我就带你一步步把这个“耳朵”装进你的VS Code。2. 准备工作环境与模型2.1 你需要准备什么在开始之前确保你的电脑上有这些基础环境Python 3.8或更高版本这是必须的VS Code咱们的开发主战场稳定的网络下载模型需要2.2 安装必要的Python包打开VS Code的终端快捷键Ctrl创建一个新的Python虚拟环境是个好习惯python -m venv asr_env source asr_env/bin/activate # Linux/Mac # 或者 asr_env\Scripts\activate # Windows然后安装核心依赖pip install gradio pip install modelscope pip install torch torchaudio pip install onnxruntime这里简单说一下这几个包是干什么的gradio用来快速搭建Web界面不用写HTML/CSS/JSmodelscope阿里的模型平台咱们从这里下载模型torch虽然我们用ONNX模型但有些预处理可能用到PyTorchonnxruntime运行ONNX模型的核心3. 核心步骤加载模型与搭建界面3.1 下载SenseVoice-Small ONNX模型我们先写个简单的脚本来下载模型。在VS Code里新建一个文件比如叫download_model.pyfrom modelscope import snapshot_download # 模型在ModelScope上的地址 model_id iic/SenseVoiceSmall # 下载模型到本地 model_dir snapshot_download(model_id, cache_dir./models) print(f模型已下载到: {model_dir})运行这个脚本模型就会下载到当前目录的models文件夹里。第一次下载可能需要一些时间因为模型文件不小。3.2 理解模型结构SenseVoice-Small是个多功能的音频理解模型。简单来说它把一段音频送进去能同时做好几件事语音识别把说的话转成文字语种识别判断说的是什么语言情感识别听出说话人的情绪事件检测发现背景里的特殊声音笑声、掌声等文本规整把转写结果整理得更规范它的厉害之处在于所有这些功能都在一个模型里完成不需要分别调用多个模型。3.3 创建Gradio界面现在我们来创建主界面文件。在VS Code里新建webui.py注意根据输入信息这是指定的路径/usr/local/bin/webui.py但在本地开发时你可以放在任何方便的位置import gradio as gr import numpy as np import torch import torchaudio from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks import os # 初始化语音识别管道 def init_asr_pipeline(): 初始化语音识别模型 try: # 创建语音识别管道 asr_pipeline pipeline( taskTasks.auto_speech_recognition, modeliic/SenseVoiceSmall, model_revisionv1.0.0 ) print(模型加载成功) return asr_pipeline except Exception as e: print(f模型加载失败: {e}) return None # 全局变量避免重复加载 asr_pipe init_asr_pipeline() def transcribe_audio(audio_path, languageNone): 转录音频文件 Args: audio_path: 音频文件路径 language: 指定语言可选 Returns: 转录结果文本 if asr_pipe is None: return 错误模型未加载成功请检查模型文件。 try: # 构建推理参数 inference_args { audio_format: wav } # 如果指定了语言添加到参数中 if language and language ! auto: inference_args[language] language # 执行语音识别 result asr_pipe(audio_path, **inference_args) # 提取转录文本 if result and text in result: transcript result[text] # 如果有其他信息情感、事件等也一并显示 additional_info [] if lang in result: additional_info.append(f检测语言: {result[lang]}) if emotion in result: additional_info.append(f情感分析: {result[emotion]}) if events in result: events result[events] if events: additional_info.append(f声音事件: {, .join(events)}) if additional_info: transcript f\n\n【附加信息】\n \n.join(additional_info) return transcript else: return 识别失败未获取到有效结果。 except Exception as e: return f识别过程中出错: {str(e)} def process_uploaded_file(file): 处理上传的音频文件 if file is None: return 请先上传音频文件。 # Gradio上传的文件是临时路径 transcript transcribe_audio(file.name) return transcript def process_recorded_audio(audio): 处理录制的音频 if audio is None: return 请先录制音频。 # audio是(sample_rate, audio_data)的元组 sample_rate, audio_data audio # 保存临时文件 temp_path temp_recorded_audio.wav torchaudio.save(temp_path, torch.tensor(audio_data).float().unsqueeze(0), sample_rate) # 转录 transcript transcribe_audio(temp_path) # 清理临时文件 if os.path.exists(temp_path): os.remove(temp_path) return transcript # 创建Gradio界面 def create_interface(): 创建语音识别界面 # 示例音频文件你可以准备一些示例 example_audios [ [examples/chinese_sample.wav, 中文示例], [examples/english_sample.wav, 英文示例], ] # 过滤掉不存在的示例文件 existing_examples [] for audio_path, label in example_audios: if os.path.exists(audio_path): existing_examples.append([audio_path, label]) with gr.Blocks(titleSenseVoice 语音识别工具, themegr.themes.Soft()) as demo: gr.Markdown(# SenseVoice-Small 语音识别工具) gr.Markdown(上传或录制音频体验多语言语音识别、情感分析和声音事件检测) with gr.Row(): with gr.Column(scale1): gr.Markdown(### 音频输入) # 语言选择 language_choice gr.Dropdown( choices[auto, zh, en, yue, ja, ko], valueauto, label选择语言auto为自动检测, info指定语言可能提高识别准确率 ) # 音频上传 audio_input gr.Audio( label上传音频文件, typefilepath ) # 录音功能 record_input gr.Audio( label或直接录制音频, sourcemicrophone, typenumpy ) # 示例音频 if existing_examples: gr.Markdown(### 试试示例音频) for audio_path, label in existing_examples: gr.Examples( examples[[audio_path]], inputs[audio_input], labellabel ) # 识别按钮 transcribe_btn gr.Button(开始识别, variantprimary) with gr.Column(scale2): gr.Markdown(### 识别结果) # 结果显示 output_text gr.Textbox( label转录文本, lines10, placeholder识别结果将显示在这里..., interactiveFalse ) # 附加信息显示 info_text gr.Textbox( label处理信息, lines3, placeholder模型状态和信息..., interactiveFalse ) # 按钮点击事件 transcribe_btn.click( fnprocess_uploaded_file, inputs[audio_input], outputs[output_text] ) # 录音处理 record_input.stop_recording( fnprocess_recorded_audio, inputs[record_input], outputs[output_text] ) # 语言选择变化时更新信息 def update_language_info(lang): lang_names { auto: 自动检测, zh: 中文, en: 英语, yue: 粤语, ja: 日语, ko: 韩语 } return f当前语言设置: {lang_names.get(lang, lang)} language_choice.change( fnupdate_language_info, inputs[language_choice], outputs[info_text] ) # 初始信息 info_text.value 模型已加载请上传或录制音频开始识别。支持50种语言自动检测情感和声音事件。 gr.Markdown(---) gr.Markdown(### 使用说明) gr.Markdown( 1. **上传音频**支持wav、mp3等常见格式 2. **或直接录制**点击麦克风图标录制 3. **选择语言**指定语言可提高准确率或选auto自动检测 4. **点击识别**获取转录文本和附加信息 **功能特点** - 极速识别10秒音频仅需70ms - 多语言支持50种语言 - 情感识别分析说话人情绪 - 事件检测识别笑声、掌声等声音 - 富文本输出包含多种信息 ) return demo # 主函数 if __name__ __main__: # 创建界面 demo create_interface() # 启动服务 print(启动Gradio服务...) print(请在浏览器中打开: http://localhost:7860) demo.launch( server_name0.0.0.0, server_port7860, shareFalse )这个代码做了几件重要的事初始化模型通过ModelScope加载SenseVoice-Small模型创建界面用Gradio搭建一个美观的Web界面处理音频支持上传文件和直接录音两种方式显示结果不仅显示转写文本还显示情感、语言、声音事件等附加信息3.4 添加示例音频为了让用户快速体验我们可以准备一些示例音频。在项目目录下创建examples文件夹放一些测试音频mkdir examples你可以找一些短的音频文件wav格式效果最好比如中文对话片段英文演讲片段带笑声的音频不同情感的语音如果没有现成的可以用Python生成一些简单的测试音频# create_test_audio.py import numpy as np import soundfile as sf import os # 创建示例目录 os.makedirs(examples, exist_okTrue) # 生成一个简单的测试音频1秒的440Hz正弦波 def create_test_audio(filename, text_description): sample_rate 16000 duration 1.0 # 1秒 t np.linspace(0, duration, int(sample_rate * duration), False) # 生成440Hz的正弦波A4音 frequency 440.0 audio 0.5 * np.sin(2 * np.pi * frequency * t) # 保存为wav文件 sf.write(filename, audio, sample_rate) print(f创建测试音频: {filename} ({text_description})) # 创建几个测试文件 create_test_audio(examples/chinese_sample.wav, 中文测试音频) create_test_audio(examples/english_sample.wav, 英文测试音频)4. 运行与测试4.1 启动Gradio服务在VS Code终端中运行我们的主程序python webui.py你会看到类似这样的输出启动Gradio服务... 请在浏览器中打开: http://localhost:7860 Running on local URL: http://0.0.0.0:78604.2 测试功能打开浏览器访问http://localhost:7860你会看到这样的界面现在可以测试几个功能上传音频测试点击上传音频文件选择一个wav或mp3文件点击开始识别查看转写结果和附加信息录音测试点击麦克风图标开始录音说几句话停止录音后自动识别看看识别准确率如何示例音频如果有示例音频直接点击示例观察不同语言、不同情感的识别效果4.3 可能遇到的问题和解决第一次运行可能会遇到一些问题这里列几个常见的问题1模型下载慢或失败# 解决方案使用国内镜像 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple # 或者在代码中指定镜像 import os os.environ[MODELSCOPE_CACHE] ./models os.environ[MODELSCOPE_MIRROR] https://mirror.sjtu.edu.cn/modelscope问题2内存不足SenseVoice-Small模型相对较小但如果你内存很小可以尝试关闭其他占用内存的程序使用pip install onnxruntime而不是onnxruntime-gpu如果你不用GPU问题3音频格式不支持# 添加格式转换功能 def convert_audio_format(input_path, output_pathconverted.wav): 转换音频格式为wav import subprocess try: subprocess.run([ ffmpeg, -i, input_path, -ar, 16000, # 采样率 -ac, 1, # 单声道 output_path ], checkTrue) return output_path except: # 如果ffmpeg不可用尝试用pydub from pydub import AudioSegment audio AudioSegment.from_file(input_path) audio audio.set_frame_rate(16000).set_channels(1) audio.export(output_path, formatwav) return output_path5. 进阶功能与优化5.1 添加批量处理功能如果你需要处理多个音频文件可以添加批量处理功能def batch_process(files): 批量处理多个音频文件 if not files: return 请先选择文件 results [] for i, file in enumerate(files, 1): transcript transcribe_audio(file.name) results.append(f文件 {i}: {os.path.basename(file.name)}) results.append(transcript) results.append(- * 50) return \n.join(results) # 在Gradio界面中添加 with gr.Tab(批量处理): file_input gr.File( label选择多个音频文件, file_countmultiple, file_types[.wav, .mp3, .m4a] ) batch_output gr.Textbox(label批量识别结果, lines20) batch_btn gr.Button(批量识别, variantprimary) batch_btn.click( fnbatch_process, inputs[file_input], outputs[batch_output] )5.2 添加进度显示长时间处理时显示进度条提升用户体验import time def transcribe_with_progress(audio_path): 带进度显示的转录 # 模拟进度更新 yield 开始加载音频..., 0 time.sleep(0.5) yield 正在识别语音..., 30 transcript transcribe_audio(audio_path) yield 分析情感和事件..., 70 time.sleep(0.3) yield 整理输出结果..., 90 time.sleep(0.2) yield transcript, 100 # 在Gradio中使用 import gradio as gr with gr.Row(): progress_bar gr.Progress() status_text gr.Textbox(label状态, interactiveFalse) transcribe_btn.click( fntranscribe_with_progress, inputs[audio_input], outputs[output_text, progress_bar] )5.3 保存历史记录添加保存功能方便回顾之前的识别结果import json from datetime import datetime def save_result(transcript, audio_info): 保存识别结果到文件 if not transcript or transcript.startswith(错误): return 结果为空或出错未保存 history_file recognition_history.json # 读取现有历史 history [] if os.path.exists(history_file): with open(history_file, r, encodingutf-8) as f: history json.load(f) # 添加新记录 new_record { timestamp: datetime.now().strftime(%Y-%m-%d %H:%M:%S), transcript: transcript, audio_info: audio_info } history.append(new_record) # 保存只保留最近100条 history history[-100:] with open(history_file, w, encodingutf-8) as f: json.dump(history, f, ensure_asciiFalse, indent2) return f已保存到 {history_file} # 在界面中添加保存按钮 save_btn gr.Button(保存结果, variantsecondary) save_status gr.Textbox(label保存状态, interactiveFalse) save_btn.click( fnsave_result, inputs[output_text, audio_input], outputs[save_status] )5.4 性能优化建议如果你发现识别速度不够快可以尝试这些优化使用ONNX Runtime优化# 在初始化时指定优化选项 import onnxruntime as ort # 创建ONNX Runtime会话选项 so ort.SessionOptions() so.graph_optimization_level ort.GraphOptimizationLevel.ORT_ENABLE_ALL so.intra_op_num_threads 4 # 根据CPU核心数调整 # 在pipeline中指定 asr_pipeline pipeline( taskTasks.auto_speech_recognition, modeliic/SenseVoiceSmall, model_revisionv1.0.0, devicecpu, # 或 cuda:0 如果有GPU session_optionsso )音频预处理优化def preprocess_audio(audio_path, target_sr16000): 预处理音频提高识别效率 # 加载音频 waveform, sample_rate torchaudio.load(audio_path) # 重采样到目标采样率 if sample_rate ! target_sr: resampler torchaudio.transforms.Resample(sample_rate, target_sr) waveform resampler(waveform) # 转换为单声道 if waveform.shape[0] 1: waveform waveform.mean(dim0, keepdimTrue) # 标准化音量 waveform waveform / waveform.abs().max() return waveform, target_sr6. 部署与分享6.1 打包为VS Code扩展如果你想把这个工具做成真正的VS Code扩展创建扩展项目结构sensevoice-asr-extension/ ├── .vscode/ │ └── launch.json ├── src/ │ └── extension.ts ├── media/ │ └── icon.png ├── webui.py ├── requirements.txt ├── package.json └── README.md创建package.json{ name: sensevoice-asr, displayName: SenseVoice语音识别, description: 在VS Code中使用SenseVoice进行语音识别, version: 1.0.0, engines: { vscode: ^1.60.0 }, categories: [Other], activationEvents: [ onCommand:sensevoice.startTranscription ], main: ./src/extension.js, contributes: { commands: [{ command: sensevoice.startTranscription, title: SenseVoice: 开始语音识别 }] } }创建扩展主文件// src/extension.ts import * as vscode from vscode; import { spawn } from child_process; import * as path from path; export function activate(context: vscode.ExtensionContext) { let disposable vscode.commands.registerCommand( sensevoice.startTranscription, async () { // 启动Gradio服务 const pythonPath python; const scriptPath path.join( context.extensionPath, webui.py ); const gradioProcess spawn(pythonPath, [scriptPath]); gradioProcess.stdout.on(data, (data) { console.log(Gradio: ${data}); }); gradioProcess.stderr.on(data, (data) { console.error(Gradio Error: ${data}); }); // 打开浏览器 setTimeout(() { vscode.env.openExternal( vscode.Uri.parse(http://localhost:7860) ); }, 2000); vscode.window.showInformationMessage( SenseVoice语音识别工具已启动 ); } ); context.subscriptions.push(disposable); }6.2 分享给其他人如果你想把整个项目分享给同事或朋友创建requirements.txtgradio4.0.0 modelscope1.9.0 torch2.0.0 torchaudio2.0.0 onnxruntime1.15.0 numpy1.21.0 soundfile0.12.0创建一键安装脚本#!/bin/bash # install.sh echo 安装SenseVoice语音识别工具... # 创建虚拟环境 python -m venv venv # 激活虚拟环境 source venv/bin/activate # Linux/Mac # venv\Scripts\activate # Windows # 安装依赖 pip install -r requirements.txt # 下载模型 python -c from modelscope import snapshot_download; snapshot_download(iic/SenseVoiceSmall, cache_dir./models) echo 安装完成 echo 运行: python webui.py编写使用说明 创建一个简单的README.md说明如何安装和使用。7. 总结通过这个教程我们完成了一个完整的语音识别工具开发环境搭建安装了必要的Python包和模型核心开发用Gradio创建了友好的Web界面功能实现实现了上传、录音、识别、结果显示等核心功能进阶优化添加了批量处理、进度显示、历史记录等实用功能部署分享探讨了打包为VS Code扩展和分享项目的方法SenseVoice-Small模型的优势很明显速度快10秒音频70毫秒完成实时处理无压力功能全不只是转文字还能分析情感、检测事件语言多支持50多种语言覆盖主要使用场景易集成ONNX格式部署方便资源占用少这个工具可以用于很多实际场景会议记录自动转录会议内容采访整理快速整理采访录音内容创作语音转文字提高写作效率学习辅助外语学习中的发音检查客服分析分析客户情绪和对话内容最重要的是整个过程都在VS Code里完成不需要切换其他工具。对于开发者来说这大大提高了工作效率。如果你在实现过程中遇到问题或者有改进的想法欢迎交流讨论。技术总是在不断进步我们的工具也可以持续优化。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。