WeNet语音识别分词制作词云图

在线体验 ,点击识别语音需要等待一会,文件太大缓存会报错
在这里插入图片描述

介绍

本篇博客将介绍如何使用 Streamlit、jieba、wenet 和其他 Python 库,结合语音识别(WeNet)和词云生成,构建一个功能丰富的应用程序。我们将深入了解代码示例中的不同部分,并解释其如何实现音频处理、语音识别和文本可视化等功能。

代码概览

首先,让我们来看一下这个应用的主要功能和组成部分:

  1. 导入必要的库和模型加载

    import streamlit as st
    import jieba
    from wordcloud import WordCloud
    import matplotlib.pyplot as plt
    from pydub import AudioSegment
    from noisereduce import reduce_noise
    import wenet
    import base64
    import os
    

    在这一部分,我们导入了必要的 Python 库,包括 Streamlit、jieba(用于中文分词)、WordCloud(用于生成词云)、matplotlib(用于图表绘制)、pydub(用于音频处理)等。同时,我们还加载了 wenet 库,该库包含用于中英文语音识别的预训练模型。

  2. 语音识别的函数定义

    def recognition(audio, lang='CN'):# 识别语音内容并返回文本# ...
    

    这个函数利用 wenet 库中的预训练模型,根据上传的音频文件进行语音识别。根据用户选择的语言(中文或英文),函数返回识别出的文本。

  3. 音频处理函数定义

    def reduce_noise_and_export(input_file, output_file):# 降噪并导出处理后的音频文件# ...
    

    这个函数对上传的音频文件进行降噪处理,并导出处理后的音频文件,以提高语音识别的准确性。

  4. 关键词提取函数定义

    def extract_keywords(result):# 提取识别文本中的关键词# ...
    

    此函数使用 jieba 库对识别出的文本进行分词,并返回关键词列表。

  5. Base64 编码和下载链接函数定义

    def save_base64(uploaded_file):# 将上传文件转换为 Base64 编码# ...def get_base64_link(file_path, link_text):# 生成下载处理后音频的 Base64 链接# ...
    

    这两个函数分别用于将上传的音频文件转换为 Base64 编码,并生成可下载处理后音频的链接。

  6. 主函数 main()

    def main():# Streamlit 应用的主要部分# ...
    

    主函数包含了 Streamlit 应用程序的主要逻辑,包括文件上传、语言选择、按钮触发的操作等。

  7. 运行主函数

    if __name__ == "__main__":main()
    

    此部分代码确保主函数在运行时被调用。

应用程序功能

通过上述功能模块的组合,这个应用程序可以完成以下任务:

  • 用户上传 WAV 格式的音频文件。
  • 选择要进行的语言识别类型(中文或英文)。
  • 降噪并处理上传的音频文件,以提高识别准确性。
  • 对处理后的音频进行语音识别,返回识别结果。
  • 从识别结果中提取关键词,并将其显示为词云图。
  • 提供处理后音频的下载链接,方便用户获取处理后的音频文件。

希望这篇博客能够帮助你理解代码示例的每个部分,并激发你探索更多有趣应用的灵感!

streamlit应用程序

import streamlit as st
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from pydub import AudioSegment
from noisereduce import reduce_noise
import wenet
import base64
import os
# 载入模型
chs_model = wenet.load_model('chinese')
en_model = wenet.load_model('english')# 执行语音识别的函数
def recognition(audio, lang='CN'):if audio is None:return "输入错误!请上传音频文件!"if lang == 'CN':ans = chs_model.transcribe(audio)elif lang == 'EN':ans = en_model.transcribe(audio)else:return "错误!请选择语言!"if ans is None:return "错误!没有文本输出!请重试!"txt = ans['text']return txt# 降噪并导出处理后的音频的函数
def reduce_noise_and_export(input_file, output_file):try:audio = AudioSegment.from_wav(input_file)audio_array = audio.get_array_of_samples()reduced_noise = reduce_noise(audio_array, audio.frame_rate)reduced_audio = AudioSegment(reduced_noise.tobytes(),frame_rate=audio.frame_rate,sample_width=audio.sample_width,channels=audio.channels)reduced_audio.export(output_file, format="wav")return output_fileexcept Exception as e:return f"发生错误:{str(e)}"def extract_keywords(result):word_list = jieba.lcut(result)return word_listdef save_base64(uploaded_file):with open(uploaded_file, "rb") as file:audio_content = file.read()encoded = base64.b64encode(audio_content).decode('utf-8')return encodeddef main():st.title("语音识别与词云生成")uploaded_file = st.file_uploader("上传 WAV 文件", type="wav")if uploaded_file:st.audio(uploaded_file, format='audio/wav')language_choice = st.radio("选择语言", ('CN', 'EN'))bu=st.button("识别语音")if bu:if uploaded_file:output_audio_path = os.path.basename(uploaded_file.name)processed_audio_path = reduce_noise_and_export(uploaded_file, output_audio_path)if not processed_audio_path.startswith("发生错误"):result = recognition(processed_audio_path, language_choice)st.write("识别结果:" + result)keywords = extract_keywords(result)st.write("提取的关键词:", keywords)text = " ".join(keywords)wc = WordCloud(font_path="SimSun.ttf",collocations=False, width=800, height=400, margin=2, background_color='white').generate(text.lower())st.image(wc.to_array(), caption='词云')# 提供处理后音频的下载链接st.markdown(get_base64_link(processed_audio_path, '下载降噪音频'), unsafe_allow_html=True)    else:st.warning("请上传文件")
def get_base64_link(file_path, link_text):with open(file_path, "rb") as file:audio_content = file.read()encoded = base64.b64encode(audio_content).decode('utf-8')href = f'<a href="data:audio/wav;base64,{encoded}" download="processed_audio.wav">{link_text}</a>'return hrefif __name__ == "__main__":main()

requirements.txt

wenet @ git+https://github.com/wenet-e2e/wenet
streamlit
wordcloud
pydub
jieba
noisereduce

在这里插入图片描述

体验链接: 长音频切换识别

import streamlit as st
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from pydub import AudioSegment
from noisereduce import reduce_noise
import wenet
import base64
import os
import numpy as np# 载入模型
chs_model = wenet.load_model('chinese')
en_model = wenet.load_model('english')# 执行语音识别的函数
def recognition(audio, lang='CN'):if audio is None:return "输入错误!请上传音频文件!"if lang == 'CN':ans = chs_model.transcribe(audio)elif lang == 'EN':ans = en_model.transcribe(audio)else:return "错误!请选择语言!"if ans is None:return "错误!没有文本输出!请重试!"txt = ans['text']return txtdef reduce_noise_segmented(input_file,chunk_duration_ms,frame_rate):try:audio = AudioSegment.from_file(input_file,format="wav")# 将双声道音频转换为单声道audio = audio.set_channels(1)# 压缩音频的帧率为 16000audio = audio.set_frame_rate(frame_rate)duration = len(audio)# 分段处理音频chunked_audio = []start = 0while start < duration:end = min(start + chunk_duration_ms, duration)chunk = audio[start:end]chunked_audio.append(chunk)start = endreturn chunked_audioexcept Exception as e:st.error(f"发生错误:{str(e)}")return Nonedef extract_keywords(result):word_list = jieba.lcut(result)return word_listdef get_base64_link(file_path, link_text):with open(file_path, "rb") as file:audio_content = file.read()encoded = base64.b64encode(audio_content).decode('utf-8')href = f'<a href="data:audio/wav;base64,{encoded}" download="processed_audio.wav">{link_text}</a>'return hrefdef main():st.title("语音识别与词云生成")uploaded_file = st.file_uploader("上传音乐文件", type="wav")if uploaded_file:st.audio(uploaded_file, format='audio/wav')segment_duration = st.slider("分段处理时长(毫秒)", min_value=1000, max_value=10000, value=5000, step=1000)frame_rate = st.slider("压缩帧率", min_value=8000, max_value=48000, value=16000, step=1000)language_choice = st.selectbox("选择语言", ('中文', '英文'))bu=st.button("识别语音")if bu:if uploaded_file:st.success("正在识别中,请稍等...")output_audio_path = os.path.basename(uploaded_file.name)chunked_audio = reduce_noise_segmented(uploaded_file,  segment_duration, frame_rate)# 计算总的音频段数total_chunks = len(chunked_audio)if total_chunks>0:# 创建进度条progress_bar = st.progress(0)# 对每个音频段进行降噪并合并reduced_noise_chunks = []result_array = []for i, chunk in enumerate(chunked_audio):audio_array = chunk.get_array_of_samples()reduced_noise = reduce_noise(np.array(audio_array), chunk.frame_rate)reduced_chunk = AudioSegment(reduced_noise.tobytes(),frame_rate=chunk.frame_rate,sample_width=chunk.sample_width,channels=chunk.channels)reduced_noise_chunks.append(reduced_chunk)language=""if language_choice=='中文':language="CN"else:language="EN"path="第"+str(i+1)+"段音频.wav"reduced_chunk.export(path,format="wav")while os.path.exists(path):result = recognition(path, language)if result:st.write(f"第{i+1}段音频识别结果:" + result)result_array.append(result)break# 更新进度条的值progress = int((i + 1) / total_chunks * 100)progress_bar.progress(progress)st.write("识别的结果为:","".join(result_array))keywords = extract_keywords("".join(result_array))st.write("提取的关键词:", keywords)text=" ".join(keywords)wc = WordCloud(font_path="SimSun.ttf",collocations=False, width=800, height=400, margin=2, background_color='white').generate(text.lower())st.image(wc.to_array(), caption='词云')# 合并降噪后的音频段reduced_audio = reduced_noise_chunks[0]for i in range(1, len(reduced_noise_chunks)):reduced_audio += reduced_noise_chunks[i]# 导出处理后的音频文件reduced_audio.export(output_audio_path,format="wav")while os.path.exists(output_audio_path):# 提供处理后音频的下载链接st.markdown(get_base64_link(output_audio_path, '下载降噪音频'), unsafe_allow_html=True)    breakelse:st.warning("请上传文件")if __name__ == "__main__":main()

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

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

相关文章

第2课 使用FFmpeg读取rtmp流并用openCV显示视频

本课对应源文件下载链接&#xff1a; https://download.csdn.net/download/XiBuQiuChong/88680079 这节课我们开始利用ffmpeg和opencv来实现一个rtmp播放器。播放器的最基本功能其实就两个:显示画面和播放声音。在实现这两个功能前&#xff0c;我们需要先用ffmpeg连接到rtmp服…

LVS负载均衡配置虚拟引起微服务注册混乱

线上小程序突然报错&#xff0c;查看网关日志&#xff0c;访问下游微服务A时大量报错&#xff1a; 1&#xff09;检查微服务是否未注册。登录eureka页面&#xff0c;发现三个节点均正常注册 三个微服务节点地址分别为&#xff1a;13.9.1.91:8080&#xff0c;13.9.1.92:8080和1…

ARM CCA机密计算软件架构之软件堆栈概述

Arm CCA平台通过硬件添加和固件组件的混合方式实现,例如在处理元素(PEs)中的RME以及特定的固件组件,特别是监视器和领域管理监视器。本节介绍Arm CCA平台的软件堆栈。 软件堆栈概述 领域VM的执行旨在与Normal world(正常世界)隔离,领域VM由Normal world Host(正常世界…

【软件工程】融通未来的工艺:深度解析统一过程在软件开发中的角色

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 软件工程 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言&#xff1a; 正文 统一过程&#xff08;Unified Process&#xff09; 介绍和解释&#xff1a; 应用&#xff1a; 优缺点&#xf…

C/C++ 函数的默认参数

下面介绍一项新内容 - 默认参数。 默认参数指的是当函数调用中省略了实参时自动使用的一个值。 例如&#xff0c;如果将 void wow (int n)设置成n 有默认值为1&#xff0c;则函数调用 wow()相当于 wow(1)这极大地提高了使用函数的灵活性。 假设有一个名为left()的函数&#xff…

SpringIOC之ApplicationObjectSupport

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

<JavaEE> TCP 的通信机制(一) -- 确认应答 和 超时重传

目录 TCP的通信机制的核心特性 一、确认应答 1&#xff09;什么是确认应答&#xff1f; 2&#xff09;如何“确认”&#xff1f; 3&#xff09;如何“应答”&#xff1f; 二、超时重传 1&#xff09;丢包的概念 2&#xff09;什么是超时重传&#xff1f; 3&#xff09…

详解信道容量,信道速率,安全速率的区别

目录 一. 信道容量与信道速率 二. 小结 三. 安全速率与物理层安全 3.1 香农物理层安全模型 3.2 安全信道速率 四. 补充安全中断概率&#xff08;Secrecy Outage Probability, SOP&#xff09; 五. 补充安全分集度&#xff08;Secrecy Diversity Order, SDO&#xff09; …

AAAI 2024 | 用逆向思维图(ReX-GoT)进行多选对话常识推理

©PaperWeekly 原创 作者 | 郑理 单位 | 武汉大学硕士生 研究方向 | 自然语言处理 论文题目&#xff1a; Reverse Multi-Choice Dialogue Commonsense Inference with Graph-of-Thought 论文作者&#xff1a; 郑理&#xff0c;费豪&#xff0c;李霏&#xff0c;李波波&am…

EI级 | Matlab实现TCN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测

EI级 | Matlab实现TCN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测 目录 EI级 | Matlab实现TCN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.【EI级】 Matlab实现TCN-BiGRU-Mult…

2023年03月09日_谷歌视觉语言模型PaLM-E的介绍

自从最近微软凭借OpenAI 和ChatGPT火了一把之后呢 老对手Google就总想着扳回一局 之前发布了硬刚ChatGPT的Bard 但是没想到翻车了 弄巧成拙 所以呢Google这一周又发了个大招 发布了史上最大的视觉语言模型PaLM-E 这个模型有多夸张呢 参数量高达5,620亿 是ChatGTP-3的三…

nextTick的原理

开发中有这么一个需求&#xff0c;回显的适合&#xff0c;el-tree的检查严格标志属性更新为true。当更新完成后&#xff0c;又要改为false。还原。 <template><div><el-tree:data"data"show-checkbox:check-strictly"checkStrictly"default…

linux安装java8

1、下载java 根据自己系统的位数下载 查看系统位数命令&#xff1a;getconf LONG_BIT 下载地址 https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html 2、解压、移动 将下载的文件上传到linux系统中并解压 tar -zxvf jdk-8u333-linux…

条件编译处理多端差异

条件编译https://uniapp.dcloud.net.cn/tutorial/platform.html#%E4%B8%BA%E4%BB%80%E4%B9%88%E9%80%89%E6%8B%A9%E6%9D%A1%E4%BB%B6%E7%BC%96%E8%AF%91%E5%A4%84%E7%90%86%E8%B7%A8%E7%AB%AF%E5%85%BC%E5%AE%B9 <template><view class"container"><…

OSPF ROUTER-ID-新版(15)

目录 整体拓扑 操作步骤 1.INT 验证Router-ID选举规则 1.1 查看路由器Router-ID 1.2 配置R1地址 1.3 查看R1接口信息 1.4 查看R1Router-ID 1.5 删除接口IP并查看Router-ID 1.6 手工配置Router-ID 2.基本配置 2.1 配置R1的IP 2.2 配置R2的IP 2.3 配置R3的IP 2.4 配…

c++ 简单实用万能异常捕获

多层捕获异常&#xff0c;逐渐严格。并打印出错信息和位置&#xff1a;哪个文件&#xff0c;哪个函数&#xff0c;具体哪一行代码。 #include <stdexcept> // 包含标准异常类的头文件try {int a 2 / 0; }catch (const std::runtime_error& e) {// 捕获 std::runt…

游戏任务系统实现思路

文章目录 一、需求介绍二、数据库设计3、代码部分实现 一、需求介绍 1、首先任务的类型不同&#xff0c;可以分为&#xff1a;日常任务、成长任务、活动任务等等。 2、当达到任务目标时&#xff0c;自动发放任务奖励。 3、任务需要后台可配置&#xff0c;例如&#xff1a;任务…

访问公网视频监控平台,看不到实时视频的问题查处

一、实时监控视频看不到了的问题出现 今天在给客户演示实时视频监控&#xff0c;通过公网平台能够正常查看各个品牌IPC的实时视频&#xff08;在浏览器页面输入“http://公网平台IP地址”&#xff0c;关于IP地址详细介绍&#xff0c;可以看以前文章&#xff09;&#xff0c;如下…

Python集成开发工具

第二章、IDE&#xff08;PyCharm&#xff09; 一、设置py文件模板 设置模版 二、格式化代码设置 三、PyCharm运行python源文件的模式 第一次按照何种模式执行测试用例&#xff0c;后续都会按照这种方式去执行 普通模式&#xff0c;unittest模式&#xff0c;pytest模式介绍 四…

记录DevEco Studio 模拟器启动失败问题

启动模拟器报错 解决步骤 1、“启用或关闭windows功能"勾选"hyper-v”、“windows虚拟机监控程序平台”、“虚拟机平台” 2、打开cpu虚拟化 打开bios&#xff0c;打开Intel Virtualization Technology 这样就可以了 在任务管理器可以看到已开启&#xff0c;编辑器…