Gradio TTS 交互界面实操指南:20 行代码接入语音合成
【免费下载链接】gradioBuild and share delightful machine learning apps, all in Python. 🌟 Star to support our work!项目地址: https://gitcode.com/GitHub_Trending/gr/gradio
上周帮隔壁组看语音合成效果,对方模型能跑,但验收只能把文本塞进命令行、等一段 wav 落盘再拖进播放器——来回折腾,谁都没法快速判断音色到底行不行。其实他们缺的只是一层能点、能听、能分享的 Web 壳,而这层壳用 Gradio 二十来行 Python 就能补齐。
先把目标定死:浏览器里一个输入框、一排语言单选、一个 Submit 按钮,点一下右侧就出现音频播放器,直接听结果。要拿到这个效果,倒过来拆就三件事:装上依赖、写出那个"文本进、音频出"的函数、把输入输出组件挂到gr.Interface上。下面按这个顺序走。
🧩 依赖只有两个:Gradio 加一个 TTS 插件
结论先说:这个 demo 的额外依赖就一行,别的不用装。
pip install gradio neon-tts-plugin-coqui上面这段干了一件事:把 UI 框架和语音引擎的封装层都拉进环境。仓库里 demo/neon-tts-plugin-coqui/requirements.txt 里也只有一个版本约束,
run.py里真正 import 的第三方库同样只有CoquiTTS这一个。引擎底层模型比较重,第一次初始化会拉资源,耐心等它走完。
依赖装完,接下来就是整个应用的全部业务逻辑。
⌨️ 10 行写完"文本进、音频出":Interface 的三个必配参数
整个功能的核心,就是下面这一小段:
import tempfile import gradio as gr from neon_tts_plugin_coqui import CoquiTTS coquiTTS = CoquiTTS() def tts(text: str, language: str): with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as fp: coquiTTS.get_tts(text, fp, speaker={"language": language}) return fp.name这段做了三件事:① 建一个 wav 临时文件;② 让引擎把文本直接合成进这个文件;③ 把文件路径还回去。注意
get_tts要的是文件对象而不是路径字符串,别急着改调用方式。
再往上是界面骨架,demo/neon-tts-plugin-coqui/run.py 里剩下的就这几行:
demo = gr.Interface( fn=tts, inputs=[gr.Textbox(label="Input", max_lines=3), gr.Radio(label="Language", choices=list(CoquiTTS.langs.keys()), value="en")], outputs=gr.Audio(label="Output"), ) demo.launch()关键是
Interface的三个必填参数:fn、inputs、outputs。表单、提交按钮、按钮点亮时的转圈、输出区刷新,全是 Gradio 自动接好的,一行事件绑定都不用写。launch()默认起 7860 端口,改不改随你。
上面这张来自仓库另一个 audio 组件 demo 的截图,组件形态和 TTS 应用里完全一样:左边输入、右边gr.Audio播放器,这就是你launch()之后拿到的样子。
一个新手高频翻车点:delete=False 别删
NamedTemporaryFile默认在上下文退出时把文件删掉,而音频要等前端来下载,文件必须留在磁盘上——所以delete=False是故意写的。删了它,现象就是按钮能点、播放器是空的,排查半天。这里还有个坑:临时文件会越积越多,介意的话可以在返回前自己管理一下路径,别动框架的代码。
骨架跑通之后,直接发给同事用还差点意思,差在细节配置上。
🎛️ 默认示例文本与主题:体验细节全在 inputs 列表里
界面能不能一眼看懂,基本取决于输入组件怎么配。仓库 demo 里的原始写法:
inputs = [ gr.Textbox(label="Input", value=CoquiTTS.langs["en"]["sentence"], max_lines=3), gr.Radio(label="Language", choices=LANGUAGES, value="en"), ]两行各管一件事:①
value从语言元数据里取示例句,页面打开就有内容可点,验收不用自己敲字;②max_lines=3把输入框压成三行,不会把屏幕撑掉一半。
主题走theme参数,一行切换,仓库 gradio/themes/ 下有现成模板,不用手写 CSS:
demo = gr.Interface(..., theme=gr.themes.Soft())🌍 语言列表动态取 + MP3 导出:改两行的事
语言下拉不用手抄,直接取引擎元数据的键:
LANGUAGES = list(CoquiTTS.langs.keys())列表长度由插件版本决定,升级后支持更多语言时界面自动跟着变,不需要回来改代码。这个 demo 目前覆盖 14 种语言,见 demo/neon-tts-plugin-coqui/DESCRIPTION.md。
导出格式同理。合成引擎如果支持 MP3,把临时文件后缀换掉即可,gr.Audio会按实际内容识别:
with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as fp:本地跑通了,下一步就是怎么让别人也能跑。
📦 7860 端口本地跑,share=True 给临时公网链接
python run.py一行启动,本机浏览器直接能开;局域网里的同事把
localhost换成你的 IP 也能访问。想发给网外的人,把launch()改成launch(share=True),控制台会吐出一个临时公网地址——注意有效期只有 72 小时,别拿它当正式部署方案。
顺手一个验证动作:把language默认值从en换成列表里其他语言再跑一遍,对比音色差异;再顺手把 demo/generate_tone/ 和 demo/spectogram/ 这两个 audio 组件 demo 跑一遍,看看同一个gr.Audio在"音频出"和"音频进"两种方向上各能挂哪些玩法。
【免费下载链接】gradioBuild and share delightful machine learning apps, all in Python. 🌟 Star to support our work!项目地址: https://gitcode.com/GitHub_Trending/gr/gradio
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考