基于Wenet长音频分割降噪识别

Wenet是一个流行的语音处理工具,它专注于长音频的处理,具备分割、降噪和识别功能。它的长音频分割降噪识别功能允许对长时间录制的音频进行分段处理,首先对音频进行分割,将其分解成更小的段落或语音片段。接着进行降噪处理,消除可能存在的噪音、杂音或干扰,提高语音质量和清晰度。最后,Wenet利用先进的语音识别技术对经过处理的音频段落进行识别,将其转换为文字或语音内容,从而实现对长音频内容的准确识别和转录。这种功能可以应用于许多领域,如语音识别、语音转文字、语音翻译以及音频内容分析等,为长音频数据的处理提供了高效而准确的解决方案。

支持上传(WAV、MP3、M4A、FLAC、AAC)

体验一下
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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 txt
    
def reduce_noise_segmented(input_file,chunk_duration_ms,frame_rate):
    try:
        audio = AudioSegment.from_file(input_file,format=input_file.name.split(".")[-1])
        # 将双声道音频转换为单声道
        audio = audio.set_channels(1)
        # 压缩音频的帧率为 16000
        audio = audio.set_frame_rate(frame_rate)
        duration = len(audio)

        # 分段处理音频
        chunked_audio = []
        start = 0

        while start < duration:
            end = min(start + chunk_duration_ms, duration)
            chunk = audio[start:end]
            chunked_audio.append(chunk)
            start = end
        return chunked_audio
    except Exception as e:
        st.error(f"发生错误:{str(e)}")
        return None


def extract_keywords(result):
    word_list = jieba.lcut(result)
    return word_list

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 href


def main():
    st.title("语音识别与词云生成")
    uploaded_file = st.file_uploader("上传音乐文件", type=["wav","mp3","m4a","flac","aac"])
    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)    
                    break
        else:
            st.warning("请上传文件")


if __name__ == "__main__":
    main()

依赖

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

服务器部署

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

磁盘相关知识

一、硬盘数据结构 1.扇区&#xff1a; 盘片被分为多个扇形区域&#xff0c;每个扇区存放512字节的数据&#xff08;扇区越多容量越大&#xff09; 存放数据的最小单位 512字节 &#xff08;硬盘最小的存储单位是扇区&#xff0c;512 个字节&#xff0c;八个扇区组成一块&…

算法学习系列(十五):最小堆、堆排序

目录 引言一、最小堆概念二、堆排序模板&#xff08;最小堆&#xff09;三、模拟堆 引言 这个堆排序的话&#xff0c;考的还挺多的&#xff0c;主要是构建最小堆&#xff0c;并且在很多情况下某些东西还用得着它来优化&#xff0c;比如说迪杰斯特拉算法可以用最小堆优化&#…

Xamarin开发:商场促销(策略设计模式)

Xamarin开发:商场促销&#xff08;策略设计模式&#xff09; 一、介绍二、需求分析三、实现四、需求分析问题1解决方案问题2解决方案 五、增加新需求六、代码优化与分析总结 一、介绍 本文引用《大话设计模式》第二章节的内容进行学习分析&#xff0c;仅供学习使用 这里接着我…

Java设计模式-装饰者模式

目录 一、星巴克咖啡订单项目 二、装饰者模式 &#xff08;一&#xff09;定义 &#xff08;二&#xff09;原理 &#xff08;三&#xff09;装饰者模式解决星巴克咖啡订单 一、星巴克咖啡订单项目 星巴克咖啡订单项目&#xff08;咖啡馆&#xff09;&#xff1a; 1) 咖…

菜鸟学习vue3笔记-vue hooks初体验

import { ref } from "vue"; export default function () {let a1 ref(1);let a2 ref(5);let c ref(0);function add() {a1.value;a2.value;}return {add,a1,a2,c,}; }<template><div><p>第一个数字{{ a1 }}</p><p>第二个数字{{ a2…

java勤工助学信息管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web勤工助学信息管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境 为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为M…

Java线上问题排查思路

1、Java 服务常见问题 Java 服务的线上问题从系统表象来看大致可分成两大类: 系统环境异常、业务服务异常。 系统环境异常&#xff1a;主要从CPU、内存、磁盘、网络四个方面考虑。比如&#xff1a;CPU 占用率过高、CPU 上下文切换频率次数较高、系统可用内存长期处于较低值、…

K8s实战-基于LivenessProbe健康检查

LivenessProbe探针用于判断容器是否存活&#xff0c;如果探测到容器不健康&#xff0c;则kubelet将杀掉该容器&#xff0c;然后根据重启策略处理。 LivenessProbe的实现方式&#xff1a; ExecAction&#xff1a;在容器内部执行一个命令&#xff0c;如果该命令的返回码为0&…

计算机毕业设计 基于SpringBoot的高校危化试剂仓储管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

最短路径(数据结构实训)(难度系数100)

最短路径 描述&#xff1a; 已知一个城市的交通路线&#xff0c;经常要求从某一点出发到各地方的最短路径。例如有如下交通图&#xff1a; 则从A出发到各点的最短路径分别为&#xff1a; B&#xff1a;0 C&#xff1a;10 D&#xff1a;50 E&#xff1a;30 F&#xff1a;60 输…

白话机器学习的数学-1-回归

1、设置问题 投入的广告费越多&#xff0c;广告的点击量就越高&#xff0c;进而带来访问数的增加。 2、定义模型 定义一个函数&#xff1a;一次函数 y ax b &#xff08;a 是斜率、b 是截距&#xff09; 定义函数&#xff1a; 3、最小二乘法 例子&#xff1a; 用随便确定的参…

BDTC2023:CloudberryDB开源创新与实践

中国大数据技术大会&#xff08;BDTC&#xff09;由中国计算机学会&#xff08;CCF&#xff09;创立于2008年&#xff0c;已经成为国内外极具行业实践的专业大数据交流平台。12月22日-24日&#xff0c;第十七届中国大数据技术大会&#xff08;BDTC 2023&#xff09;在广州举行。…

文字识别技术在未来会有怎样的发展?

随着科技的不断发展&#xff0c;文字识别技术也在不断地改进和完善。未来&#xff0c;文字识别技术将会在更多的领域得到应用&#xff0c;并且将会更加智能化、高效化和个性化。 首先&#xff0c;随着深度学习技术的不断发展&#xff0c;文字识别技术将会更加智能化。目前&…

ubuntu22下安装minconda

bing 搜索 canda install 找到官方网站 https://docs.conda.io/projects/miniconda/en/latest/ 这里我们安装minconda。 官网有安装方法。 mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh…

docker的基本管理和相关概念

docker的基本管理和概念 docker&#xff1a;开源的应用容器引擎。基于go语言开发的。运行在linux系统当中的开源的&#xff0c;轻量级的“虚拟机” docker的容器技术可以在一台主机上轻松的为任何应用创建一个轻量级的&#xff0c;可移植的&#xff0c;自给自足的容器 docke…

Java 读取超大excel文件

注意&#xff1a;此参考解决方案只是针对xlsx格式的excel文件&#xff01; Maven <dependency><groupId>com.monitorjbl</groupId><artifactId>xlsx-streamer</artifactId><version>2.2.0</version> </dependency>读取方式1…

Android画布Canvas矩阵Matrix放大裁剪Rect区域的Bitmap,Kotlin

Android画布Canvas矩阵Matrix放大裁剪Rect区域的Bitmap&#xff0c;Kotlin private fun mydraw() {val originBmp BitmapFactory.decodeResource(resources, R.mipmap.pic).copy(Bitmap.Config.ARGB_8888, true)val newBmp Bitmap.createBitmap(originBmp.width, originBmp.h…

爬虫基础一(持续更新)

爬虫概念&#xff1a; 通过编写程序&#xff0c;模拟浏览器上网&#xff0c;然后让其去互联网上抓取数据的过程 分类&#xff1a; 1&#xff0c;通用爬虫&#xff1a;抓取一整张页面数据 2&#xff0c;聚焦爬虫&#xff1a;抓取页面中的局部内容 3&#xff0c;增量式爬虫&…

CUMT--Java--线程

目录 一、线程 1、概述 2、Java线程模型 3、主线程 二、创建线程 1、继承Thread类 2、实现Runnable接口 3、使用Callable和Future接口 三、线程生命周期 1、新建和就绪状态 2、运行和阻塞状态 3、死亡状态 四、线程优先级 五、线程同步 1、非同步情况 2、同步…

浅谈WPF之控件模板Control Template和数据模板Data Template

WPF不仅支持传统的Windows Forms编程的用户界面和用户体验设计&#xff0c;同时还推出了以模板为核心的新一代设计理念。在WPF中&#xff0c;通过引入模板&#xff0c;将数据和算法的“内容”和“形式”进行解耦。模板主要分为两大类&#xff1a;数据模板【Data Template】和控…