写一个gradio录音的webui界面并展现波形图

news2024/12/22 16:34:59

如图下:这是需求

要创建一个 Gradio 录音的 Web UI 界面,你可以使用 Gradio 的 Audio 组件来实现。下面是一个简单的示例,展示了如何创建一个 Gradio 应用程序,其中包含一个录音按钮,用户可以录制音频并提交给服务器处理。
示例代码
import gradio as gr

def process_audio(audio):
    # 这里可以添加音频处理的逻辑
    # 例如打印音频的长度
    print(f"Received audio with length: {len(audio)} samples")
    return audio

# 创建 Gradio 界面
iface = gr.Interface(
    fn=process_audio,
    inputs=gr.inputs.Audio(
        source="microphone",
        type="numpy",
        label="Record Audio",
        interactive=True,
        format="wav",
        editable=True,
        min_length=1,
        max_length=10
    ),
    outputs="audio",
    title="Audio Recording App"
)

# 启动 Gradio 服务器
iface.launch()

代码解释
1. 定义处理函数:
•  process_audio 函数接收音频数据作为输入,并执行一些处理逻辑。在这个示例中,我们只是简单地打印音频的长度。
2. 创建 Gradio 界面:
•  使用 gr.Interface 创建一个 Gradio 界面。
•  fn 参数指定处理函数。
•  inputs 参数指定输入组件,这里使用 gr.inputs.Audio。
•  outputs 参数指定输出组件,这里同样使用 Audio 组件。
3. 配置 Audio 组件:
•  source="microphone" 表示音频来源为麦克风。
•  type="numpy" 表示音频数据将以 NumPy 数组的形式传递给处理函数。
•  label="Record Audio" 表示组件旁边的标签文本。
•  interactive=True 表示用户可以与组件交互。
•  format="wav" 表示音频文件的格式为 .wav。
•  editable=True 表示用户可以编辑音频。
•  min_length=1 和 max_length=10 表示音频的最小和最大长度(单位:秒)。
4. 启动 Gradio 服务器:
•  使用 iface.launch() 启动 Gradio 服务器。
运行应用程序
将上述代码保存为一个 Python 文件,例如 recording_app.py,然后在命令行中运行:
python recording_app.py

这将启动一个本地服务器,你可以在浏览器中通过 http://localhost:7860 访问。
注意事项
•  确保你已经安装了 Gradio 库。如果没有安装,可以通过 pip install gradio 安装。
•  确保麦克风已连接到计算机,并且在操作系统的声音设置中被正确识别。
•  如果你想使用 HTTPS 来启动 Gradio 服务器,请参考前面的回答中关于使用自签名证书或 OpenSSL 生成的证书的部分。
 

要在 Gradio 中显示录音的波形图,你需要使用 matplotlib 或 librosa 等库来绘制波形图,并将其作为图像输出。下面是一个修改后的示例,它将在用户录制音频后显示音频的波形图。
首先,确保你已经安装了必要的库:
pip install gradio matplotlib librosa

接下来是修改后的代码:
import gradio as gr
import numpy as np
import matplotlib.pyplot as plt
import librosa.display

def plot_waveform(signal, sample_rate):
    plt.figure(figsize=(10, 4))
    librosa.display.waveshow(signal, sr=sample_rate)
    plt.xlabel("Time (seconds)")
    plt.ylabel("Amplitude")
    plt.title("Waveform")
    plt.tight_layout()
    plt.show()

def process_audio(audio):
    # 音频信号通常是 float32 类型,需要转换为 numpy 数组
    signal = audio.astype(np.float32)
    
    # 假设采样率为 16 kHz
    sample_rate = 16000
    
    # 绘制波形图
    plot_waveform(signal, sample_rate)
    
    # 返回音频数据,以便在界面上显示
    return signal

# 创建 Gradio 界面
iface = gr.Interface(
    fn=process_audio,
    inputs=gr.inputs.Audio(
        source="microphone",
        type="numpy",
        label="Record Audio",
        interactive=True,
        format="wav",
        editable=True,
        min_length=1,
        max_length=10
    ),
    outputs="audio",
    title="Audio Recording App"
)

# 启动 Gradio 服务器
iface.launch()

代码解释
1. 定义 plot_waveform 函数:
•  使用 librosa.display.waveshow 绘制波形图。
•  设置图表的标题、轴标签等。
•  使用 plt.show() 显示图像。注意,在 Gradio 中直接使用 plt.show() 不会显示图像,而是需要将图像返回给 Gradio。
2. 定义 process_audio 函数:
•  将音频信号转换为 float32 类型。
•  调用 plot_waveform 函数来绘制波形图。
•  返回处理后的音频信号。
3. 创建 Gradio 界面:
•  与之前的代码相似,但是输出仍然是音频,因为我们直接返回了音频信号而不是图像。如果要同时显示波形图,我们需要调整 Gradio 的输出类型。
修改 Gradio 输出
为了显示波形图,我们需要修改 Gradio 的输出类型,让它能够同时显示音频和波形图。由于 Gradio 默认不支持同时输出多个组件,我们需要稍微修改一下代码:
import io
from PIL import Image

def process_audio(audio):
    # 音频信号通常是 float32 类型,需要转换为 numpy 数组
    signal = audio.astype(np.float32)
    
    # 假设采样率为 16 kHz
    sample_rate = 16000
    
    # 绘制波形图
    fig = plot_waveform(signal, sample_rate)
    
    # 将图像转换为 PIL 图像对象
    buf = io.BytesIO()
    fig.savefig(buf, format='png')
    buf.seek(0)
    image = Image.open(buf)
    
    # 清除图像以释放内存
    plt.close(fig)
    
    # 返回音频数据和波形图像
    return signal, image

# 创建 Gradio 界面
iface = gr.Interface(
    fn=process_audio,
    inputs=gr.inputs.Audio(
        source="microphone",
        type="numpy",
        label="Record Audio",
        interactive=True,
        format="wav",
        editable=True,
        min_length=1,
        max_length=10
    ),
    outputs=["audio", "image"],
    title="Audio Recording App"
)

# 启动 Gradio 服务器
iface.launch()

代码解释
1. 修改 process_audio 函数:
•  创建一个图像缓冲区,并保存波形图。
•  使用 PIL 将图像缓冲区转换为图像对象。
•  清除波形图以释放内存。
•  返回音频信号和图像对象。
2. 修改 Gradio 界面:
•  将 outputs 改为 ["audio", "image"],这意味着输出包含音频和图像两个部分。
现在当你运行这个脚本时,Gradio 应用程序将允许用户录制音频,并在提交后显示音频的波形图。

 

python
import gradio as gr
import numpy as np
import matplotlib.pyplot as plt
def show_waveform(audio):
    sr, data = audio
    
    # 如果音频是立体声,我们只取第一个通道
    if len(data.shape) > 1:
        data = data[:, 0]
    
    # 创建时间轴
    time = np.linspace(0., len(data) / sr, len(data))
    
    # 创建图形
    fig, ax = plt.subplots(figsize=(12, 4))
    ax.plot(time, data)
    ax.set_xlabel('Time (s)')
    ax.set_ylabel('Amplitude')
    ax.set_title('Audio Waveform')
    
    return fig
# 创建Gradio接口
iface = gr.Interface(
    fn=show_waveform,
    inputs=gr.Audio(source="microphone", type="numpy"),
    outputs="plot",
    title="音频录制与波形显示",
    description="点击录音按钮开始录音,录音结束后将显示音频波形。"
)
# 启动接口
iface.launch()
```
这个脚本做了以下几件事:
1. 导入必要的库:Gradio、NumPy和Matplotlib。
2. 定义了一个`show_waveform`函数,它接收音频数据,并生成一个波形图。
3. 创建了一个Gradio接口,使用`gr.Audio`组件作为输入(设置为使用麦克风),使用`plot`作为输出。
4. 设置了界面的标题和描述。
5. 最后启动了接口。
使用这个脚本,你将得到一个网页界面,其中包含:
- 一个录音按钮,允许用户通过麦克风录音。
- 录音完成后,页面将显示录制的音频波形图。
要运行这个脚本,确保你已经安装了必要的库:
```
pip install gradio numpy matplotlib 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1985141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM详解(个人学习笔记)

前言 本篇文章为我个人在学习JVM时所记录的笔记,内容把部分来自《深入理解java虚拟机》一书,笔记中总结了JVM中一些比较重要的知识点并作出了自己的解释。 java运行时数据区域 程序计数器(线程内私有) 程序计数器(P…

Java每日一练_模拟面试题4(volatile和synchronized)

volatile加原子操作能取代synchronized和锁吗?答案是否定的。它能保证单操作原子性,对任意单个volatile变量的读写具有原子性,但对于复合操作不保证原子性,如x。

智慧公厕系统的重要性与发展

在城市发展的进程中,智慧公厕系统正逐渐成为一项不可或缺的重要设施。智慧公厕系统利用信息技术和物联网等先进手段,将公共厕所的建设、使用、运营和管理进行信息化整合与优化,实现了公厕运行的高效、智能和可持续发展。 智慧公厕系统的重要性…

MySQL —— CRUD

CRUD CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写。 我们常说增删查改,增删改查… 这里我们的增删查改是对表格的数据行进行操作的~~ 新增 1.1.1 单行数据 全列插入 插入一行新数据行,使用 insert into t…

【Bug记录】函数错误匹配,非法的间接寻址

项目场景: 当我写模拟vector的时候,写出下面测试代码准备稍微测试一下新写的构造函数 新写的构造函数,n个value构造 问题描述 当写出上面测试代码的时候,会报错: 这是什么鬼??&#xff1f…

【老张的程序人生】我命由我不由天:我的计算机教师中级岗之旅

在计算机行业的洪流中,作为一名20年计算机专业毕业的博主,我深知这几年就业的坎坷与辉煌。今天,我想与大家分享我的故事,一段关于梦想、挑战与坚持的计算机教师中级岗之旅。希望我的经历能为大家提供一个发展方向,在计…

CCRC-CISAW信息安全保障人员证书含金量

在数字化时代背景下,CISAW认证受到越来越多个人的青睐。 特别是在互联网技术高速发展的今天,随着5G技术的广泛应用,市场对CISAW专业人才的需求急剧增加。 这种职业不仅地位显著,而且职业生涯相对较长。 目前市场上,…

SAP MIGO新增字段 自定义字段

效果 原先是没有的 清单里面找了没有 自定义字段 待新增字段 F1打开200 screen 加字段 zzplusl

非负数(0和正数) 限制最大值且保留两位小数,在elementpuls表单中正则自定义验证传更多参数

一、结构 <el-form-item label="单价:" prop="price"><el-inputv-model.trim="formData.price"placeholder="请输入"><template #append>(元)</template></el-input></el-form-item>二、验证方…

一个为90后设计的Shell,早知道,当年学Shell也不至于那么痛苦了,Star 25K+!

一个现代、用户友好的命令行界面&#xff0c;以其智能特性、语法高亮、实时自动建议、花式标签补全、直观的历史搜索和跨平台支持而著称。它提供了一个美观、易用且功能丰富的Shell环境&#xff0c;旨在简化Shell命令行操作&#xff0c;提高用户的工作效率。号称一个为90后设计…

数据库|SQLServer数据库:企业管理器的使用

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 之前学习了通过脚本创建数据库数据表以及增删改查的相关操作。 接下来了解企业管理器的使用。 以下为学习笔记。 01 新建数据库 1.1、登录数据库后&#xff0c;选中【数据库】-->右击【新建数据库】。 1.2、可以…

swift 自定义DatePacker

import Foundationenum AppDatePickerStyle {case KDatePickerDate //年月日case KDatePickerTime //年月日时分case kDatePickerMonth // 年月case KDatePickerSecond //秒}class AppDatePicker: UIView {private let jk_rootView UIApplication.shared.keyWindow!pri…

电池放电的速率对电池寿命有影响吗?

电池放电的速率对电池寿命确实有很大的影响&#xff0c;电池的寿命通常是指电池在正常使用条件下&#xff0c;能够保持其额定容量的时间。电池的容量会随着充放电次数的增加而逐渐减少&#xff0c;这个过程被称为电池的老化。电池的老化速度受到许多因素的影响&#xff0c;其中…

自闭症的孩子有哪些症状

在自闭症这个复杂而广阔的领域中&#xff0c;作为长期从事自闭症教育的工作者&#xff0c;我们深知每一位自闭症孩子都是独一无二的&#xff0c;他们面对的世界充满了挑战与不解。自闭症&#xff0c;也被称为孤独症谱系障碍&#xff0c;其核心症状往往体现在社交互动、沟通以及…

git安装图文

1.下载 通过百度网盘分享的文件&#xff1a;git安装图文 链接&#xff1a;https://pan.baidu.com/s/17ZMiWUIULtrGGba5n-WLeA 提取码&#xff1a;anjm --来自百度网盘超级会员V3的分享 2.安装

使用Go语言绘制水平柱状图教程

使用Go语言绘制水平柱状图教程 在本教程中&#xff0c;我们将学习如何使用Go语言及gg包绘制水平柱状图&#xff0c;并将图表保存为PNG格式的图片。水平柱状图适用于展示多个类别的数据&#xff0c;且便于标签的排列和阅读。 安装gg包 首先&#xff0c;确保你已经安装了gg包。…

远程抄表,构建智能水电管理

选自成都纵横智控官网-https://www.iotrouter.com/news/1320.html 众所周知&#xff0c;传统的人工抄表方式需要耗费大量人力资源&#xff0c;同时存在抄表难、监管难、收费难、缴费难等一系列问题。在万物互联时代下&#xff0c;物联网技术迅速发展&#xff0c;智能水电联控云…

Laya3.0 调用第三方js的方法

1.新建一个js文件&#xff0c;例如&#xff1a;SuanShi.js // 暴露类到全局作用域 ; window.SuanShi window.suan {}; (function (suan) {class JiSuan {constructor() {}static computeExpression(a, b) {return this.jia(a, b);}static jia(a, b) {return a b;}}suan.JiS…

TiDB v7.5.3 发版,听说升级后又可以躺平两年

众所周知 TiDB 运维很稳、升级丝滑&#xff0c;8 月 5 日&#xff0c;TiDB v7.5.3 发版&#xff0c;作为 TiDB v7 系列的最新长期支持版本&#xff0c;有升级需求的小伙伴可以安排起来了。 TiDB 7.5.3 发版说明 兼容性&#xff1a;新增系统表 INFORMATION_SCHEMA.KEYWORDS 用来…

打造成功的知识付费平台:从技术到内容的全面解析

在现代Web开发中&#xff0c;RESTful API是一种常用的接口设计风格。它使用HTTP协议&#xff0c;允许客户端与服务器之间进行数据交互。本文将通过一个简单的例子&#xff0c;介绍如何使用Python和Flask框架构建一个RESTful API。 一、准备工作 首先&#xff0c;我们需要安装…