Whisper对于中文语音识别与转写中文文本优化的实践(Python3.10)

2024-04-04 07:20

本文主要是介绍Whisper对于中文语音识别与转写中文文本优化的实践(Python3.10),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文:Whisper对于中文语音识别与转写中文文本优化的实践(Python3.10) - 知乎

阿里的FunAsr对Whisper中文领域的转写能力造成了一定的挑战,但实际上,Whisper的使用者完全可以针对中文的语音做一些优化的措施,换句话说,Whisper的“默认”形态可能在中文领域斗不过FunAsr,但是经过中文特殊优化的Whisper就未必了。

中文文本标注优化

Whisper经常被人诟病的一点是对中文语音转写后标点符号的支持不够完备。首先安装whisper:

pip install -U openai-whisper

编写转写脚本:

import whisper  
device = "cuda:0" if torch.cuda.is_available() else "cpu"
audio = whisper.load_audio(audio_path)  
audio = whisper.pad_or_trim(audio)model = whisper.load_model("large-v2",download_root="./whisper_model/")mel = whisper.log_mel_spectrogram(audio).to(model.device)options = whisper.DecodingOptions(beam_size=5)result = whisper.decode(model, mel, options)  
print(result.text)

程序返回:

Erwin_0.wav|Erwin|ZH|如果这个作战顺利。  
Erwin_1.wav|Erwin|ZH|你也许可以趁此机会干掉狩之巨人  
Erwin_10.wav|Erwin|ZH|如果到時候我不衝在最前面  
Erwin_11.wav|Erwin|ZH|他们根本不会往前冲然后我会第一个去死  
Erwin_12.wav|Erwin|ZH|地下室里到底有什么  
Erwin_13.wav|Erwin|ZH|也就无从知晓了好想去地下室看一看我之所以能撑着走到今天  
Erwin_14.wav|Erwin|ZH|就是因为相信这一天的到来。  
Erwin_15.wav|Erwin|ZH|因为艰辛着  
Erwin_16.wav|Erwin|ZH|我才想能够得到证实  
Erwin_17.wav|Erwin|ZH|我之前無數次的想過,要不然乾脆死了算了。  
Erwin_18.wav|Erwin|ZH|可即便如此,我還是想要實現父親的夢想。  
Erwin_19.wav|Erwin|ZH|然而现在  
Erwin_2.wav|Erwin|ZH|但得拿所有新兵不管選擇哪條路  
Erwin_20.wav|Erwin|ZH|她的答案就在我触手可及的地方  
Erwin_21.wav|Erwin|ZH|仅在咫尺死去的同伴们也是如此吗  
Erwin_22.wav|Erwin|ZH|那些流血的棲身,都是沒有意義的嗎?  
Erwin_23.wav|Erwin|ZH|不!不對!  
Erwin_24.wav|Erwin|ZH|那些死去士兵的意义将由我们来赋予  
Erwin_25.wav|Erwin|ZH|那些勇敢的死者可憐的死者  
Erwin_26.wav|Erwin|ZH|是他们的牺牲换来了我们活着的今天  
Erwin_27.wav|Erwin|ZH|让我们能站在这里否则今天我们将会死去  
Erwin_28.wav|Erwin|ZH|将依依托福给下一个活着的人  
Erwin_29.wav|Erwin|ZH|这就是我们与这个残酷的世界  
Erwin_3.wav|Erwin|ZH|我们基本都会死吧是的全灭的可能性相当的高  
Erwin_30.wav|Erwin|ZH|抗爭的意義  
Erwin_4.wav|Erwin|ZH|但事到如今,也只能做好玉石俱焚的觉悟。  
Erwin_5.wav|Erwin|ZH|將一切賭在獲勝渺茫的戰術上  
Erwin_6.wav|Erwin|ZH|到了这一步  
Erwin_7.wav|Erwin|ZH|要让那些年轻人们去死  
Erwin_8.wav|Erwin|ZH|就必须像一个一流的诈骗犯一样  
Erwin_9.wav|Erwin|ZH|对他们花言巧语一番

可以看到,除了语气特别强烈的素材,大部分都没有进行标点符号的标注。

但事实上,Whisper完全可以针对中文进行标注,只需要添加对应的引导词:

options = whisper.DecodingOptions(beam_size=5,prompt="生于忧患,死于欢乐。不亦快哉!")

这里通过prompt对其进行引导,通过逗号、句号以及感叹号对文本标注,引导后的效果:

Erwin_0.wav|Erwin|ZH|如果这个作战顺利。  
Erwin_1.wav|Erwin|ZH|你也许可以趁此机会干掉受之虚人。  
Erwin_10.wav|Erwin|ZH|如果到时候我不冲在最前面  
Erwin_11.wav|Erwin|ZH|他们根本不会往前冲,然后我会第一个去死。  
Erwin_12.wav|Erwin|ZH|地下室里到底有什么?  
Erwin_13.wav|Erwin|ZH|好想去地下室看一看,我之所以能撑着走到今天。  
Erwin_14.wav|Erwin|ZH|就是因为相信这一天的到来。  
Erwin_15.wav|Erwin|ZH|因为艰辛着D  
Erwin_16.wav|Erwin|ZH|我的猜想能够得到证实。  
Erwin_17.wav|Erwin|ZH|我之前无数次地想过,要不然干脆死了算了。  
Erwin_18.wav|Erwin|ZH|可即便如此,我还是想要实现父亲的梦想。  
Erwin_19.wav|Erwin|ZH|然而现在  
Erwin_2.wav|Erwin|ZH|但得拿所有新兵,不管选择哪条路。  
Erwin_20.wav|Erwin|ZH|他的答案就在我触手可及的地方。  
Erwin_21.wav|Erwin|ZH|竟在咫尺。死去的同伴们也是如此吗?  
Erwin_22.wav|Erwin|ZH|那些流血的牺牲,都是没有意义的吗?  
Erwin_23.wav|Erwin|ZH|不!不对!  
Erwin_24.wav|Erwin|ZH|那些死去士兵的意义将由我们来赋予!  
Erwin_25.wav|Erwin|ZH|那些勇敢的死者,可怜的死者!  
Erwin_26.wav|Erwin|ZH|是他们的牺牲换来了我们活着的今天!  
Erwin_27.wav|Erwin|ZH|让我们能站在这里,而今天我们将会死去!  
Erwin_28.wav|Erwin|ZH|将依依托福给下一个活着的人!  
Erwin_29.wav|Erwin|ZH|这就是我们与这个残酷的世界。  
Erwin_3.wav|Erwin|ZH|是的,全灭的可能性相当的高。  
Erwin_30.wav|Erwin|ZH|抗争的意义!  
Erwin_4.wav|Erwin|ZH|但事到如今,也只能做好玉石俱焚的觉悟。  
Erwin_5.wav|Erwin|ZH|将一切赌在获胜渺茫的战术上。  
Erwin_6.wav|Erwin|ZH|到了这一步  
Erwin_7.wav|Erwin|ZH|要让那些年轻人们去死。  
Erwin_8.wav|Erwin|ZH|就必须像一个一流的诈骗犯一样。  
Erwin_9.wav|Erwin|ZH|对他们花言巧语一番。

通过transformers来调用中文模型

transformers是一个用于自然语言处理(NLP)的开源库,由Hugging Face开发和维护。它提供了各种预训练的模型,包括文本生成、文本分类、命名实体识别等多种NLP任务的模型。transformers库基于Transformer模型架构,这是一种用于处理序列数据的深度学习模型。Transformer模型在NLP领域取得了巨大成功,因为它能够处理长距离依赖关系,并且在各种NLP任务上取得了优异的性能。

使用transformers库,开发人员可以轻松地访问和使用各种预训练的NLP模型,也可以使用该库进行模型的微调和训练。transformers库支持多种主流深度学习框架,包括PyTorch和TensorFlow。

首先安装transformers:

pip install -U transformers

编写转写代码:

from transformers import pipeline  device = "cuda:0" if torch.cuda.is_available() else "cpu"  def transcribe_bela(audio_path):  transcriber = pipeline(  "automatic-speech-recognition",   model="BELLE-2/Belle-whisper-large-v2-zh",  device=device  )  transcriber.model.config.forced_decoder_ids = (  transcriber.tokenizer.get_decoder_prompt_ids(  language="zh",   task="transcribe",  )  )  transcription = transcriber(audio_path)   print(transcription["text"])  return transcription["text"]

这里通过BELLE-2/Belle-whisper-large-v2-zh模型来进行转写,提高中文的识别准确度和效率。

这个模型是在whisper的large-v2模型上针对中文进行了微调,以增强中文语音识别能力, Belle-whisper-large-v2-zh 在中国 ASR 基准测试(包括 AISHELL1、AISHELL2、WENETSPEECH 和 HKUST)上表现出 30-70% 的相对改进。

该模型的官方地址:

https://huggingface.co/BELLE-2/Belle-whisper-large-v2-zh

当然,也不是没有缺陷,BELLE-2模型目前基于AISHELL、WENETSPEECH等数据做的微调,弱化了标点能力。

换句话说,没法通过引导词来打标,但其实也有其他解决方案,即可以基于标点模型 对转写文本加标点。比如这个方案:

https://modelscope.cn/models/damo/punc_ct-transformer_cn-en-common-vocab471067-large/summary

BELLE-2模型的作者相当热心,有问必答,这是笔者对其模型提的Issues:

https://github.com/LianjiaTech/BELLE/issues/571

现在该模型的瓶颈是,如果微调带标点的中文数据,这块开源数据相对比较少,无法进行有效的训练。

除了大模型的中文优化版本,也有针对small模型的中文优化版本:

https://huggingface.co/Jingmiao/whisper-small-chinese_base

结语

Whisper开源模型通过transformers的微调,可以将预训练模型应用于特定的中文NLP任务,从而提高模型在该任务上的性能。微调使模型能够学习适应特定任务的特征和模式,从而实现更好的效果。

发布于 2024-01-25 14:30・IP 属地北京

这篇关于Whisper对于中文语音识别与转写中文文本优化的实践(Python3.10)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/875150

相关文章

SpringBoot项目中Maven剔除无用Jar引用的最佳实践

《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

Linux中Curl参数详解实践应用

《Linux中Curl参数详解实践应用》在现代网络开发和运维工作中,curl命令是一个不可或缺的工具,它是一个利用URL语法在命令行下工作的文件传输工具,支持多种协议,如HTTP、HTTPS、FTP等... 目录引言一、基础请求参数1. -X 或 --request2. -d 或 --data3. -H 或