Gradio UI定制化:修改SenseVoice-Small webui.py实现多语言切换+结果导出功能

张开发
2026/4/10 4:51:07 15 分钟阅读

分享文章

Gradio UI定制化:修改SenseVoice-Small webui.py实现多语言切换+结果导出功能
Gradio UI定制化修改SenseVoice-Small webui.py实现多语言切换结果导出功能1. 引言为什么需要定制化语音识别界面如果你用过语音识别工具可能会发现一个普遍问题界面功能太固定。比如你想切换识别语言得去翻配置文件想把识别结果保存下来只能手动复制粘贴。对于SenseVoice-Small这样支持50多种语言的强大模型来说原生的Web界面没有提供语言选择和结果导出功能实在有些可惜。今天我要分享的就是如何通过修改SenseVoice-Small的webui.py文件给你的语音识别工具加上两个实用功能多语言切换- 在界面上直接选择要识别的语言结果导出- 一键把识别结果保存为文本文件整个过程不需要你懂复杂的Gradio框架只需要修改几十行代码。我会带你一步步操作从理解代码结构到实际修改最后测试效果。无论你是开发者还是普通用户都能跟着做出来。2. 准备工作了解SenseVoice-Small的Web界面2.1 模型简介SenseVoice-Small是一个多语言语音识别模型它有几个很厉害的特点支持超过50种语言识别效果比Whisper模型更好能识别语音中的情感高兴、生气、悲伤等可以检测声音事件笑声、掌声、咳嗽等推理速度很快10秒音频只要70毫秒2.2 现有界面分析默认的Web界面文件在/usr/local/bin/webui.py。打开这个文件你会看到它主要做三件事加载模型- 从ModelScope加载SenseVoice-Small模型创建界面- 用Gradio构建一个简单的网页界面处理音频- 把用户上传的音频传给模型识别界面很简单上传音频 → 点击识别 → 显示结果。但缺少了两个重要功能选择语言和保存结果。3. 第一步给界面添加语言选择功能3.1 找到界面创建代码在webui.py中找到创建Gradio界面的部分。通常代码是这样的import gradio as gr # 创建界面 with gr.Blocks() as demo: gr.Markdown(# SenseVoice-Small 语音识别) # 音频输入 audio_input gr.Audio(typefilepath, label上传音频文件) # 识别按钮 recognize_btn gr.Button(开始识别) # 结果显示 text_output gr.Textbox(label识别结果, lines10)3.2 添加语言选择下拉框在音频输入的上方添加一个语言选择的下拉框with gr.Blocks() as demo: gr.Markdown(# SenseVoice-Small 语音识别) # 添加语言选择 language_dropdown gr.Dropdown( choices[ (自动检测, auto), (中文, zh), (英文, en), (日语, ja), (韩语, ko), (粤语, yue), (法语, fr), (德语, de), (西班牙语, es), (俄语, ru) ], valueauto, label选择识别语言, info选择自动检测让模型自动判断语言 ) # 原来的音频输入 audio_input gr.Audio(typefilepath, label上传音频文件)这里我添加了10种常用语言你可以根据需要增加更多。valueauto表示默认是自动检测语言。3.3 修改识别函数找到处理音频识别的函数通常叫recognize_audio或类似的名字我们需要修改它来接收语言参数# 原来的函数可能是这样的 def recognize_audio(audio_path): # 加载音频 audio load_audio(audio_path) # 调用模型识别 result model.transcribe(audio) return result[text] # 修改后的函数 def recognize_audio(audio_path, languageauto): # 加载音频 audio load_audio(audio_path) # 设置语言参数 if language ! auto: # 这里需要根据你的模型API调整 # 如果是SenseVoice的API可能是这样 result model.transcribe(audio, languagelanguage) else: result model.transcribe(audio) return result[text]3.4 更新按钮绑定找到按钮绑定的代码把语言参数传进去# 原来的绑定 recognize_btn.click( fnrecognize_audio, inputs[audio_input], outputs[text_output] ) # 修改后的绑定 recognize_btn.click( fnrecognize_audio, inputs[language_dropdown, audio_input], # 添加语言参数 outputs[text_output] )现在运行界面你应该能看到语言选择的下拉框了。4. 第二步添加结果导出功能4.1 添加导出按钮在结果显示的下方添加一个导出按钮with gr.Blocks() as demo: # ... 前面的代码 ... # 结果显示 text_output gr.Textbox(label识别结果, lines10) # 添加导出按钮 export_btn gr.Button(导出结果, variantsecondary) # 添加文件下载组件隐藏通过按钮触发 file_output gr.File(label下载文件, visibleFalse)4.2 创建导出函数添加一个函数把文本内容保存为文件import tempfile import os from datetime import datetime def export_text(text_content): 将文本内容保存为文件 if not text_content or text_content.strip() : # 如果没有内容返回None return None # 创建临时文件 timestamp datetime.now().strftime(%Y%m%d_%H%M%S) filename fsensevoice_result_{timestamp}.txt # 保存到临时文件 temp_dir tempfile.gettempdir() filepath os.path.join(temp_dir, filename) with open(filepath, w, encodingutf-8) as f: f.write(text_content) return filepath4.3 绑定导出按钮把导出按钮和函数绑定起来# 导出按钮的绑定 export_btn.click( fnexport_text, inputs[text_output], # 输入是识别结果文本框的内容 outputs[file_output] # 输出是文件下载 )4.4 改进导出功能可选如果你想让导出功能更友好可以添加一些额外信息def export_text_with_metadata(text_content, language, audio_filenameNone): 导出文本包含元数据 if not text_content or text_content.strip() : return None # 创建带元数据的文本 timestamp datetime.now().strftime(%Y-%m-%d %H:%M:%S) metadata f SenseVoice 语音识别结果 识别时间: {timestamp} 识别语言: {language} 音频文件: {audio_filename if audio_filename else 未指定} full_content metadata text_content # 保存文件 timestamp_file datetime.now().strftime(%Y%m%d_%H%M%S) filename fsensevoice_result_{timestamp_file}.txt temp_dir tempfile.gettempdir() filepath os.path.join(temp_dir, filename) with open(filepath, w, encodingutf-8) as f: f.write(full_content) return filepath要使用这个增强版函数你需要获取音频文件名这需要稍微修改一下界面代码。5. 第三步完整代码示例下面是一个修改后的webui.py的简化版本包含了所有新增功能import gradio as gr import tempfile import os from datetime import datetime from modelscope import AutoModelForSpeechSeq2Seq # 加载模型根据你的实际代码调整 model AutoModelForSpeechSeq2Seq.from_pretrained( iic/SenseVoiceSmall, devicecpu # 或 cuda ) def load_audio(audio_path): 加载音频文件 # 这里应该是你的音频加载代码 # 示例使用librosa或soundfile import soundfile as sf audio, sr sf.read(audio_path) return audio, sr def recognize_audio(audio_path, languageauto): 识别音频支持语言选择 try: # 加载音频 audio, sr load_audio(audio_path) # 调用模型识别 # 注意这里需要根据SenseVoice的实际API调整 if language ! auto: # 假设模型支持language参数 result model.transcribe(audio, sample_ratesr, languagelanguage) else: result model.transcribe(audio, sample_ratesr) # 返回识别文本 # 实际返回结构可能需要调整 return result.get(text, 识别失败) except Exception as e: return f识别出错: {str(e)} def export_text(text_content, language, audio_filename): 导出识别结果到文件 if not text_content or text_content.strip() : return None # 创建带元数据的文本 timestamp datetime.now().strftime(%Y-%m-%d %H:%M:%S) metadata f SenseVoice 语音识别结果 识别时间: {timestamp} 识别语言: {language} 音频文件: {audio_filename} full_content metadata text_content # 保存文件 timestamp_file datetime.now().strftime(%Y%m%d_%H%M%S) filename fsensevoice_result_{timestamp_file}.txt temp_dir tempfile.gettempdir() filepath os.path.join(temp_dir, filename) with open(filepath, w, encodingutf-8) as f: f.write(full_content) return filepath # 创建界面 with gr.Blocks(titleSenseVoice-Small 语音识别) as demo: gr.Markdown( # SenseVoice-Small 语音识别 支持多语言识别、情感分析和声音事件检测 ) with gr.Row(): with gr.Column(scale1): # 语言选择 language_dropdown gr.Dropdown( choices[ (自动检测, auto), (中文, zh), (英文, en), (日语, ja), (韩语, ko), (粤语, yue), (法语, fr), (德语, de), (西班牙语, es), (俄语, ru) ], valueauto, label选择识别语言, info选择自动检测让模型自动判断语言 ) # 音频输入 audio_input gr.Audio( typefilepath, label上传音频文件, sources[upload, microphone] ) # 音频文件名用于导出 audio_filename gr.Textbox( label音频文件名, visibleFalse # 隐藏通过回调设置 ) # 按钮行 with gr.Row(): recognize_btn gr.Button(开始识别, variantprimary) export_btn gr.Button(导出结果, variantsecondary) with gr.Column(scale2): # 识别结果 text_output gr.Textbox( label识别结果, lines15, placeholder识别结果将显示在这里... ) # 文件下载隐藏 file_output gr.File(label下载文件, visibleFalse) # 获取音频文件名 def get_audio_filename(audio_path): if audio_path: return os.path.basename(audio_path) return 未指定 # 设置音频文件名 audio_input.change( fnget_audio_filename, inputs[audio_input], outputs[audio_filename] ) # 识别按钮绑定 recognize_btn.click( fnrecognize_audio, inputs[language_dropdown, audio_input], outputs[text_output] ) # 导出按钮绑定 export_btn.click( fnexport_text, inputs[text_output, language_dropdown, audio_filename], outputs[file_output] ) # 示例音频 gr.Examples( examples[ [path/to/example1.wav], [path/to/example2.wav] ], inputs[audio_input], label示例音频 ) # 启动界面 if __name__ __main__: demo.launch(server_name0.0.0.0, server_port7860)6. 测试与调试6.1 测试语言切换功能修改完代码后保存webui.py文件然后重新启动Web界面。测试步骤选择不同语言在下拉框中选择中文、英文等不同选项上传测试音频使用不同语言的音频文件进行测试观察识别结果检查识别结果是否符合选择的语言如果识别结果不对可能需要检查模型是否支持你选择的语言代码语言参数是否正确传递给模型模型API的调用方式是否正确6.2 测试导出功能识别一段音频确保有识别结果点击导出结果按钮应该会自动下载一个文本文件打开文件检查确认文件包含识别结果和元数据如果导出功能不工作检查临时文件目录是否有写入权限文件路径是否正确返回Gradio的File组件是否正确配置6.3 常见问题解决问题1语言选择无效检查recognize_audio函数是否正确接收语言参数确认模型API支持语言参数查看模型文档确认正确的语言代码问题2导出按钮没反应检查export_text函数是否返回有效的文件路径确认文本内容不为空查看浏览器控制台是否有JavaScript错误问题3界面布局混乱调整gr.Column的scale参数改变列宽比例使用gr.Row组织水平布局参考Gradio文档调整样式7. 功能扩展建议如果你想让界面更加强大这里有几个扩展方向7.1 添加批量处理功能# 添加批量上传 batch_upload gr.File( file_countmultiple, file_types[.wav, .mp3, .m4a], label批量上传音频文件 ) # 批量处理函数 def batch_process(file_list, language): results [] for file in file_list: result recognize_audio(file.name, language) results.append(f文件: {os.path.basename(file.name)}\n结果: {result}\n) return \n.join(results)7.2 添加识别参数调整# 添加参数调整 with gr.Accordion(高级设置, openFalse): temperature gr.Slider(0, 1, value0.8, label温度参数) beam_size gr.Slider(1, 10, value5, step1, label束搜索大小) # 修改识别函数接收这些参数 def recognize_audio(audio_path, languageauto, temperature0.8, beam_size5): # ... 原有代码 ... result model.transcribe( audio, sample_ratesr, languagelanguage, temperaturetemperature, beam_sizebeam_size ) # ... 原有代码 ...7.3 添加历史记录# 保存识别历史 import json HISTORY_FILE recognition_history.json def save_to_history(audio_file, language, result): 保存识别记录 history [] if os.path.exists(HISTORY_FILE): with open(HISTORY_FILE, r, encodingutf-8) as f: history json.load(f) history.append({ timestamp: datetime.now().isoformat(), audio_file: audio_file, language: language, result: result }) # 只保留最近100条记录 if len(history) 100: history history[-100:] with open(HISTORY_FILE, w, encodingutf-8) as f: json.dump(history, f, ensure_asciiFalse, indent2) return history8. 总结通过今天的修改我们把一个基础的语音识别界面变成了一个功能更完整的工具。现在它支持多语言切换- 直接在界面上选择要识别的语言结果导出- 一键保存识别结果为文本文件更好的用户体验- 添加了元数据、文件信息等整个修改过程其实很简单主要是在Gradio界面中添加新的组件下拉框、按钮修改处理函数来接收新的参数添加新的功能函数文件导出把所有组件和函数正确绑定起来这种定制化方法不仅适用于SenseVoice-Small也适用于其他基于Gradio的AI工具。你可以用同样的思路添加更多实用功能比如识别结果翻译音频剪辑功能识别统计信息自定义主题样式最重要的是你不需要从头开始写一个Web应用只需要在现有代码基础上做加法。这大大降低了开发门槛让你能快速打造符合自己需求的工具。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章