当前位置: 首页 > article >正文

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星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关文章:

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

Gradio UI定制化:修改SenseVoice-Small webui.py实现多语言切换结果导出功能 1. 引言:为什么需要定制化语音识别界面 如果你用过语音识别工具,可能会发现一个普遍问题:界面功能太固定。比如,你想切换识别语言&#x…...

Phi-3-mini-4k-instruct-gguf完整指南:GGUF模型加载机制与llama-cpp内存优化原理

Phi-3-mini-4k-instruct-gguf完整指南:GGUF模型加载机制与llama-cpp内存优化原理 1. 认识Phi-3-mini-4k-instruct-gguf模型 Phi-3-mini-4k-instruct-gguf是微软Phi-3系列中的轻量级文本生成模型GGUF版本。这个模型特别适合处理问答、文本改写、摘要整理和简短创作…...

OpenClaw智能监控:Qwen3-32B实现服务器异常自动告警

OpenClaw智能监控:Qwen3-32B实现服务器异常自动告警 1. 为什么选择OpenClaw做服务器监控? 去年我的个人博客经历了一次长达6小时的宕机,直到有读者发邮件反馈才发现问题。传统监控工具如Zabbix或Prometheus虽然功能强大,但配置复…...

Java应用秒级启动不是梦:GraalVM静态镜像内存优化4阶段接入法(含Spring Boot 3.2+自动配置模板)

第一章:Java应用秒级启动不是梦:GraalVM静态镜像内存优化4阶段接入法(含Spring Boot 3.2自动配置模板)为什么传统JVM启动无法突破1秒瓶颈? JVM预热、类加载、JIT编译及GC初始化共同构成启动延迟主因。Spring Boot 3.2 …...

LeetCode 最长回文子串:python 题解写

1 实用案例 1.1 表格样式生成 本示例用于生成包含富文本样式与单元格背景色的Word表格文档。 模板内容: 渲染代码: # python-docx-template/blob/master/tests/comments.py from docxtpl import DocxTemplate, RichText # data: python-docx-template/bl…...

Qwen-Image-2512-Pixel-Art-LoRA高清展示:1024×1024输出+RGB精准色彩还原实测

Qwen-Image-2512-Pixel-Art-LoRA高清展示:10241024输出RGB精准色彩还原实测 想不想亲手创造出那种充满复古魅力的像素艺术?那种让你瞬间回到童年游戏机时代的画面,现在用AI就能轻松搞定。今天,我们就来深度实测一个专门为像素艺术…...

OpenClaw安全实践:用SecGPT-14B自动生成每周风险周报

OpenClaw安全实践:用SecGPT-14B自动生成每周风险周报 1. 为什么需要自动化风险周报 作为安全团队的成员,每周五下午总是我最头疼的时候。需要手动收集各个系统的告警日志、分析潜在风险、整理成PPT格式,最后发送给管理层。这个过程通常要花…...

OpenClaw更新策略:千问3.5-9B模型与框架的版本管理

OpenClaw更新策略:千问3.5-9B模型与框架的版本管理 1. 为什么需要版本管理 上周我在本地部署的OpenClaw突然罢工了——前一天还能正常处理文件整理任务,第二天就频繁报错"模型响应格式异常"。排查后发现是自动更新机制将千问3.5-9B模型升级到…...

PPT讲解视频怎么做?3种常见方案对比

在做课程、培训或者知识分享时,很多人都会遇到一个问题:👉 如何把PPT变成一个讲解视频?目前主流方案大致可以分为3类,每种方式我都实际体验过,下面给你一个真实对比总结。一、方案一:手动录屏&a…...

鸡翅Club项目学习文档 - 第一部分

## 学习进度- [x] 第一部分:项目整体架构与核心概念 - [ ] 第二部分:设计模式详解 - [ ] 第三部分:代码实战演练---## 一、项目概述### 1.1 项目定位| 项目名称 | 鸡翅Club刷题系统 | |----------|------------------| | 英文名 | jc-club&am…...

【AutoSAR】详解PDUR模块

所谓梦想,就是让你感到痛苦的事情不再发生。一、前言在学习AUTOSAR通信栈时,我们会遇到多种PDU相关的缩写,如L-PDU、N-PDU、I-PDU等。理解这些缩写及其相互关系、以及它们与OSI七层模型的对应关系,对于掌握通信部分至关重要。接下…...

你的SSH密钥可能已经过期了评

引言 在现代软件开发中,性能始终是衡量应用质量的重要指标之一。无论是企业级应用、云服务还是桌面程序,性能优化都能显著提升用户体验、降低基础设施成本并增强系统的可扩展性。对于使用 C# 开发的应用程序而言,性能优化涉及多个层面&#x…...

HLS高层次综合开发应用

一、HLS高层次综合开发应用 1.怎么利用编译指令(pragma)来控制各种粗细粒度的流水和并行,怎么把数组进行分块等等。这样的设计结果就会远远好于使用通用CPU。然而还有一个问题是,最后性能优化的HLS C/C代码可能会很长,…...

前端面试题(九九八十一难)

⼀、JavaScript核⼼原理1.computed与watch监听变化的原理核⼼:均依赖Vue响应式系统(Proxy/Object.defifineProperty)。 -computed:⾃动收集内部依赖的响应式数据,依赖变化⾃动重新计算,有缓存。 -watch&…...

OpenClaw技能扩展教程:Qwen3-14b_int4_awq实现公众号自动发布

OpenClaw技能扩展教程:Qwen3-14b_int4_awq实现公众号自动发布 1. 为什么需要自动化公众号发布 作为一个技术博主,我每周都要在公众号上发布2-3篇技术文章。最让我头疼的不是写作本身,而是发布前的繁琐流程:手动排版Markdown、设…...

Zig : 关于@Vector,slice,array,arraylist实例

最近在看Zig,是一个有意思的语言。以一个字符串容器为例,来尝试了解一下Zig和其它语言有什么不同。 一、代码 const std import("std"); const print std.debug.print; pub fn main() !void {try print_arraylist();_ print_array();_ pri…...

mysql如何对比两个数据库备份的差异_使用mysqldiff工具

不能。mysqldiff 不解析 SQL 备份文件,仅支持连接运行中的两个数据库实例(如 server1:db1 server2:db2)对比结构元数据,需先将 dump 文件导入为库才能使用。mysqldiff 能不能直接比两个 SQL 备份文件?不能。mysqldiff …...

HTML压缩工具本地运行卡顿怎么办_在线替代或参数优化【说明】

本地HTML压缩卡顿时,可调参降载、换轻量工具、用在线服务、分块处理或禁用IDE校验功能。例如调--collapse-whitespace参数、换rust-html-minifier、分块提取body压缩、关闭VS Code HTML格式化。如果您在本地运行HTML压缩工具时遇到卡顿现象,可能是由于工…...

OpenClaw定时任务实战:Qwen3-4B驱动夜间数据抓取与处理

OpenClaw定时任务实战:Qwen3-4B驱动夜间数据抓取与处理 1. 为什么选择OpenClaw做定时数据抓取? 去年我接手了一个市场监测项目,需要每天凌晨3点抓取20多个行业网站的更新内容。最初用Python脚本APScheduler的方案,但遇到三个痛点…...

ESP32驱动MPU-9250 DMP实现硬件级运动处理

1. SparkFun MPU-9250 DMP Arduino库深度解析:面向ESP32平台的嵌入式运动处理实践指南1.1 库定位与工程价值重定义尽管原始README明确声明该库“currently only supports and is tested on SAMD processors”,但其核心设计——基于Invensense官方DMP固件…...

直播带货系统源码开发需要哪些功能?电商直播平台搭建详解

近几年,随着短视频与直播生态的快速发展,直播带货已经从一种营销玩法,逐渐演变为电商行业的重要基础设施。从品牌方自建私域直播平台,到企业打造垂直电商直播系统,越来越多的公司开始选择搭建自己的直播带货系统源码&a…...

基于STM32的多功能温室大棚环境监测系统:实时显示、远程监控与智能调节温湿度

基于stm32多路温室大棚监测 容易制作 主要功能: [1]OLED屏可以实时显示四路温湿度数据 [2]手机APP可以远程监控四路温湿度数据 [3]温度湿度阈值均可手动通过按键设置 温度或者湿度超过阈值上限打开排气扇 温度低于阈值打开加热器 湿度低于阈值打开加湿器 原理图pcb…...

品牌设计没头绪?专业公司来帮你!

“在品牌设计的茫茫大海中,你是否常常感到迷失方向,找不到头绪?别担心,专业的品牌设计公司就是你的灯塔,为你照亮前行的道路!”在当今竞争激烈的市场环境中,品牌设计对于企业的发展至关重要。一…...

后悔没早看!敏感肌日常修护全攻略,轻松养出健康厚脸皮✨

后悔没早看!敏感肌日常修护全攻略,轻松养出健康厚脸皮✨集美们!谁懂啊🥹 作为天生的薄皮敏感肌,换季泛红、刷酸烂脸、遇热就红通通这些破事我全中!折腾了五六年,踩了无数坑,终于总结…...

出海行业热点 | Apple推新款“Ultra”高端产品;Google取消30%分成,开放第三方商店;阿里云登陆MWC,支持众多中国企业出海;

- 热点总览(3.3~3.9) -1. 印尼拟限未成年人用社媒2. Apple推新款“Ultra”高端产品3. Apple限制美区下载ByteDance应用4. Google取消30%分成,开放第三方商店5. 月流水有望过千万,三七开年找到了新爆款6. 阿里云登陆MWC&#xff0c…...

智能建造知识拓展 | 施工阶段AI赋能的十大关键场景

导 读在上期文章《智能建造知识拓展 | 三维激光扫描:为数字孪生构筑精准“空间底座”》中,我们为您介绍了三维激光扫描技术如何以毫米级精度采集现场数据,为数字孪生构建提供可靠的“数字底图”。本期,我们将聚焦人工智能——这位…...

FireRed-OCR Studio部署指南:HuggingFace Spaces免费部署与限流配置

FireRed-OCR Studio部署指南:HuggingFace Spaces免费部署与限流配置 1. 引言 你是不是经常遇到这样的麻烦事?拿到一份纸质表格或者PDF扫描件,想把里面的内容整理成电子文档,结果发现表格结构复杂,手动录入费时费力&a…...

P1464 [PacNW 1999] Function

一、题目描述 题目链接: P1464 [PacNW 1999] Function - 洛谷 二、解题思路 可以使用dfs记忆化搜索的方法来解决这个问题。 通过阅读题目可知,w(a,b,c)的最小值为1,所以可以将memo数组初始化为0,第三、四种情况时,先…...

OpenClaw自动化创作:Qwen3.5-9B-AWQ-4bit生成图文小红书草稿

OpenClaw自动化创作:Qwen3.5-9B-AWQ-4bit生成图文小红书草稿 1. 为什么选择OpenClaw解决内容创作瓶颈 去年开始运营小红书账号时,我每天要花4-5小时在内容创作上——从产品截图整理、卖点提炼到排版设计,整个过程既耗时又重复。直到发现Ope…...

多租户下的ERP系统的仓储管理模块分析设计茸

springboot自动配置 自动配置了大量组件,配置信息可以在application.properties文件中修改。 当添加了特定的Starter POM后,springboot会根据类路径上的jar包来自动配置bean(比如:springboot发现类路径上的MyBatis相关类&#xff…...