当前位置: 代码网 > it编程>前端脚本>Python > Whisper对于中文语音识别与转写中文文本优化的实践(Python3.10)

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

2024年08月02日 Python 我要评论
Whisper开源模型通过transformers的微调,可以将预训练模型应用于特定的中文NLP任务,从而提高模型在该任务上的性能。微调使模型能够学习适应特定任务的特征和模式,从而实现更好的效果。发布于 2024-01-25 14:30・IP 属地北京。

原文: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 属地北京

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com