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

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_基础版,每接口每天50万次
NLP自然语言处理_高级版,每接口累计50万次
简介: 阿里的FunAsr对Whisper中文领域的转写能力造成了一定的挑战,但实际上,Whisper的使用者完全可以针对中文的语音做一些优化的措施,换句话说,Whisper的“默认”形态可能在中文领域斗不过FunAsr,但是经过中文特殊优化的Whisper就未必了。

whisper-da-open-ai-o-que-e-para-que-serve-e-como-funciona.jpg

阿里的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任务,从而提高模型在该任务上的性能。微调使模型能够学习适应特定任务的特征和模式,从而实现更好的效果。

相关实践学习
达摩院智能语音交互 - 声纹识别技术
声纹识别是基于每个发音人的发音器官构造不同,识别当前发音人的身份。按照任务具体分为两种: 声纹辨认:从说话人集合中判别出测试语音所属的说话人,为多选一的问题 声纹确认:判断测试语音是否由目标说话人所说,是二选一的问题(是或者不是) 按照应用具体分为两种: 文本相关:要求使用者重复指定的话语,通常包含与训练信息相同的文本(精度较高,适合当前应用模式) 文本无关:对使用者发音内容和语言没有要求,受信道环境影响比较大,精度不高 本课程主要介绍声纹识别的原型技术、系统架构及应用案例等。 讲师介绍: 郑斯奇,达摩院算法专家,毕业于美国哈佛大学,研究方向包括声纹识别、性别、年龄、语种识别等。致力于推动端侧声纹与个性化技术的研究和大规模应用。
相关文章
|
12天前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现智能食品加工优化的深度学习模型
使用Python实现智能食品加工优化的深度学习模型
108 59
|
1月前
|
Web App开发 前端开发 JavaScript
探索Python科学计算的边界:利用Selenium进行Web应用性能测试与优化
【10月更文挑战第6天】随着互联网技术的发展,Web应用程序已经成为人们日常生活和工作中不可或缺的一部分。这些应用不仅需要提供丰富的功能,还必须具备良好的性能表现以保证用户体验。性能测试是确保Web应用能够快速响应用户请求并处理大量并发访问的关键步骤之一。本文将探讨如何使用Python结合Selenium来进行Web应用的性能测试,并通过实际代码示例展示如何识别瓶颈及优化应用。
104 5
|
1月前
|
机器学习/深度学习 数据采集 TensorFlow
智能市场营销策略优化:使用Python实现深度学习模型
【10月更文挑战第1天】 智能市场营销策略优化:使用Python实现深度学习模型
164 63
|
11天前
|
机器学习/深度学习 自然语言处理 Linux
Linux 中的机器学习:Whisper——自动语音识别系统
本文介绍了先进的自动语音识别系统 Whisper 在 Linux 环境中的应用。Whisper 基于深度学习和神经网络技术,支持多语言识别,具有高准确性和实时处理能力。文章详细讲解了在 Linux 中安装、配置和使用 Whisper 的步骤,以及其在语音助手、语音识别软件等领域的应用场景。
42 5
|
9天前
|
机器学习/深度学习 算法 数据可视化
使用Python实现深度学习模型:智能食品配送优化
使用Python实现深度学习模型:智能食品配送优化
25 2
|
14天前
|
机器学习/深度学习 自然语言处理 API
如何使用阿里云的语音合成服务(TTS)将文本转换为语音?本文详细介绍了从注册账号、获取密钥到编写Python代码调用TTS服务的全过程
如何使用阿里云的语音合成服务(TTS)将文本转换为语音?本文详细介绍了从注册账号、获取密钥到编写Python代码调用TTS服务的全过程。通过简单的代码示例,展示如何将文本转换为自然流畅的语音,适用于有声阅读、智能客服等场景。
64 3
|
13天前
|
搜索推荐 Python
快速排序的 Python 实践:从原理到优化,打造你的排序利器!
本文介绍了 Python 中的快速排序算法,从基本原理、实现代码到优化方法进行了详细探讨。快速排序采用分治策略,通过选择基准元素将数组分为两部分,递归排序。文章还对比了快速排序与冒泡排序的性能,展示了优化前后快速排序的差异。通过这些分析,帮助读者理解快速排序的优势及优化的重要性,从而在实际应用中选择合适的排序算法和优化策略,提升程序性能。
28 1
|
17天前
|
运维 监控 Linux
自动化运维:如何利用Python脚本优化日常任务##
【10月更文挑战第29天】在现代IT运维中,自动化已成为提升效率、减少人为错误的关键技术。本文将介绍如何通过Python脚本来简化和自动化日常的运维任务,从而让运维人员能够专注于更高层次的工作。从备份管理到系统监控,再到日志分析,我们将一步步展示如何编写实用的Python脚本来处理这些任务。 ##
|
1月前
|
自然语言处理 算法 数据挖掘
探讨如何利用Python中的NLP工具,从被动收集到主动分析文本数据的过程
【10月更文挑战第11天】本文介绍了自然语言处理(NLP)在文本分析中的应用,从被动收集到主动分析的过程。通过Python代码示例,详细展示了文本预处理、特征提取、情感分析和主题建模等关键技术,帮助读者理解如何有效利用NLP工具进行文本数据分析。
47 2
|
1月前
|
SQL 关系型数据库 数据库
优化Web开发流程:Python ORM的优势与实现细节
【10月更文挑战第4天】在Web开发中,数据库操作至关重要,但直接编写SQL语句既繁琐又易错。对象关系映射(ORM)技术应运而生,让开发者以面向对象的方式操作数据库,显著提升了开发效率和代码可维护性。本文探讨Python ORM的优势及其实现细节,并通过Django ORM的示例展示其应用。ORM提供高级抽象层,简化数据库操作,提高代码可读性,并支持多种数据库后端,防止SQL注入。Django内置强大的ORM系统,通过定义模型、生成数据库表、插入和查询数据等步骤,展示了如何利用ORM简化复杂的数据库操作。
60 6