python实现ASR能力实践

server/2024/9/24 11:24:28/

背景

本文介绍了一个python实现ASR语音识别)能力的基础实现,供有需要的人参考。

方案内容

导出语音

使用python的三方库,将视频中的语音导出为 mp3格式。

安装依赖:

pip install moviepy

代码如下:

from moviepy.editor import VideoFileClipdef extract_audio_from_video(video_path, audio_path):# 加载视频文件video_clip = VideoFileClip(video_path)# 从视频中提取音频audio_clip = video_clip.audio# 写入音频文件audio_clip.write_audiofile(audio_path)# 使用示例
video_path = r'\path\to\source\vedio\source.mp4'  # 视频文件路径
audio_path = r'\path\to\export\voice\export_voice.mp3'  # 提取的音频文件保存路径
extract_audio_from_video(video_path, audio_path)

语音切割

对于一个培训视频来说,市场一般在半小时到一小时之间,有些甚至长达几个小时。对于这种长视频,需要对音频进行切分,才能更加快速的生成语音和准确的生成概要内容。参考通义 · 听悟中对于音频内容分割的做法,将音频按分钟在静音处切分,然后每3-5个片段生成一个概要内容,作为章节。

实际落地中,使用PyDub库对语音文件进行切分。

语音识别

将分离出来的语音识别成带时间戳的文本。

视频语音识别方面,做的比较好的就是阿里的听悟。这个产品将视频语音识别出来后,做了视频定位,内容分段,段落摘要和全文摘要等。不仅是语音识别,而是通过语音识别衍生出很多其他服务。从产品角度来说,有很多能力和我们要做的事情是吻合的。但由于听悟并不开源,所以只能是找一些开源模型作为替代。

语音识别目前市面上有很多开源的框架可以使用,有大厂背景的模型有:百度-PaddleSpeech,阿里-MMSpeech,阿里-Paraformer,openai-whisper。网上找了一篇介绍的文章,直接引用文章结论,使用 Paraformer作为语音识别工具。正好 Paraformer也是支持时间戳导出的。

>>基于百度、阿里、openai的中文语音识别研究测试报告<<

Paraformer模型发布在魔搭社区,通过魔搭社区的示例代码直接引用测试。Paraformer可以运行在 modescope框架上,也可以运行在 funasr框架上。以下是funasr版本的示例。

以下示例采用的是在线模型,实际应用时,应切换到本地离线模型。

from funasr import AutoModel
# paraformer-zh is a multi-functional asr model
# use vad, punc, spk or not as you need
model = AutoModel(model="paraformer-zh", model_revision="v2.0.4",vad_model="fsmn-vad", vad_model_revision="v2.0.4",punc_model="ct-punc-c", punc_model_revision="v2.0.4",# spk_model="cam++", spk_model_revision="v2.0.2",)
res = model.generate(input=r'D:\工作资料\15-浩鲸大模型\视频检索\录音.mp3',batch_size_s=300, sentence_timestamp=True,hotword='魔搭')
print(res)

通过指定 sentence_timestamp=True来输出子句信息。使用测试语音,识别出来的结果如下:

[{"key": "rand_key_2yW4Acq9GFz6Y","text": "支持数据库的清洗、转储操作。支持mysql oracle等多个数据库。","timestamp": [[1480, 1660], [1660, 1900], [1980, 2140], [2140, 2320], [2320, 2560], [2560, 2800], [3100, 3340], [3400, 3640], [3740, 3980], [3980, 4220], [4240, 4460], [4460, 4700], [5220, 5460], [5480, 5720], [5780, 6560], [6560, 7140], [7180, 7420], [7440, 7660], [7660, 7880], [7880, 8080], [8080, 8320], [8320, 8645]],"sentence_info": [{"text": "支持数据库的清洗、","start": 1480,"end": 3640,"timestamp": [[1480, 1660], [1660, 1900], [1980, 2140], [2140, 2320], [2320, 2560], [2560, 2800], [3100, 3340], [3400, 3640]]},{"text": "转储操作。","start": 3640,"end": 4700,"timestamp": [[3740, 3980], [3980, 4220], [4240, 4460], [4460, 4700]]},{"text": "支持 mysql oracle 等多个数据库。","start": 4700,"end": 8645,"timestamp": [[5220, 5460], [5480, 5720], [5780, 6560], [6560, 7140], [7180, 7420], [7440, 7660], [7660, 7880], [7880, 8080], [8080, 8320], [8320, 8645]]}]}
]

取结果中的 sentence_info下的数据,作为识别结果。其中 text为文本内容,start/end为该句子的起止时间。单位是 ms,在转化为视频定位时,需要进行转化。

内容摘要

后续,可继续优化结果。定位到句子对于一个长视频来说意义不大,所以,最终还是需要将识别出来的内容,按照语义进行分段,然后概括段落概要,并记录段落的起止时间。该操作需要基于上述的处理结果,通过gpt大模型来实现。实际后续的检索,也是基于段落概要来进行的。


http://www.ppmy.cn/server/24702.html

相关文章

web server apache tomcat11-23-APR

前言 整理这个官方翻译的系列&#xff0c;原因是网上大部分的 tomcat 版本比较旧&#xff0c;此版本为 v11 最新的版本。 开源项目 从零手写实现 tomcat minicat 别称【嗅虎】心有猛虎&#xff0c;轻嗅蔷薇。 系列文章 web server apache tomcat11-01-官方文档入门介绍 web…

K8S - 各节点的kube-flannel-ds-amd64-xxxxx不能正常启动的问题

- kubectl get pods -A -o wide - 查看日志发现 - pods "kube-flannel-ds-amd64-xxxxx" is forbidden: User "system:serviceaccount:kube-system:flannel" cannot get resource "pods" in API group "" in the namespace "kube-…

pgvector扩展在IvorySQL Oracle兼容模式下的应用实践

向量数据库是生成式人工智能(GenAI)的关键组成部分。作为PostgreSQL的重要扩展&#xff0c;pgvector支持高达16000维的向量计算能力&#xff0c;使得PostgreSQL能够直接转化为高效的向量数据库。 IvorySQL基于PostgreSQL开发&#xff0c;因此它同样支持添加pgvector扩展。在Ora…

【LangChain系列 14】语言模型概述

本文速读 LLMs 对话模型 LangChain集成了两种语言模型&#xff1a; LLM&#xff1a;输入文本&#xff0c;返回文本 对话模型&#xff1a;基于LLM&#xff0c;输入Message列表&#xff0c;返回一条Message LLM和对话模型之间有着细微且重要的不同。在LangChain中&#xff0…

【C++刷题】优选算法——动态规划第六辑

【模板】01背包 状态表示:dp1[i][j]: 表示从前i个物品中挑选总体积不超过j的物品&#xff0c;在所有的选法中&#xff0c;能挑选出的最大价值dp2[i][j]: 表示从前i个物品中挑选总体积正好等于j的物品&#xff0c;在所有的选法中&#xff0c;能挑选出的最大价值 优化:利用滚动数…

spring的CacheManager

org.springframework.cache.CacheManager是Spring框架中的一个接口&#xff0c;用于管理应用程序中的缓存。它提供了一种抽象的方式来访问缓存&#xff0c;使得应用程序可以使用不同的缓存实现&#xff08;如内存、Redis等&#xff09;而不需要修改代码。 在Spring Boot项目中…

海外私人IP和原生IP有什么区别,谁更有优势?

海外私人IP和原生IP在定义、特性以及应用场景上均存在显著的差异&#xff0c;各自的优势也因其特性而异。下面将详细探讨这两者的区别及各自的优势。 海外私人IP通常指的是一种位于海外的网络服务&#xff0c;它允许用户通过代理服务器访问海外网络&#xff0c;获取并使用位于…

使用递归方式实现多级菜单树 Java实现

在Java中&#xff0c;使用递归来实现菜单树通常涉及到遍历原始菜单列表&#xff0c;并为每个菜单项找到其对应的子菜单项。这个过程可以通过创建一个方法来完成&#xff0c;该方法会检查每个菜单项的parentId&#xff0c;并将其作为子菜单项添加到具有相应id的父菜单项的childr…