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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端:登录界面

效果 代码 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthde…

SpringBoot整合ELK8.1.x实现日志中心教程

目录 背景 环境准备 环境安装 1.JDK安装 2.安装Elasticsearch 3.安装zookeeper 4.安装Kafka 5.安装logstash 6.安装file beat 解决方案场景 1.日志采集 1.1 应用日志配置 1.1.1 创建logback-spring.xml文件 1.1.2 创建LoggerFactory 1.1.3 trace日志的记录用法 …

Linux上管理文件系统

Linux上管理文件系统 机械硬盘 机械硬盘由多块盘片组成&#xff0c;它们都绕着主轴旋转。每块盘片上下方都有读写磁头悬浮在盘片上下方&#xff0c;它们与盘片的距离极小。在每次读写数据时盘片旋转&#xff0c;读写磁头被磁臂控制着不断的移动来读取其中的数据。 所有的盘片…

实操:Dropzone.js实现文件上传

&#x1f3e0;官网 点我前往 &#x1f953;依赖 <script src"https://unpkg.com/dropzone5/dist/min/dropzone.min.js"></script> <link rel"stylesheet" href"https://unpkg.com/dropzone5/dist/min/dropzone.min.css" type&…

手搓链表(java)(不完整)

手搓链表&#xff08;java&#xff09;&#xff08;不完整&#xff09; 文章目录 手搓链表&#xff08;java&#xff09;&#xff08;不完整&#xff09;前言一、代码1.MyLinkedList类&#xff1a;2.测试类&#xff1a; 总结 前言 提示&#xff1a;以下是本篇文章正文内容&…

LeetCode_876(链表的中间结点)

//双指针//时间复杂度O(n) 空间复杂度O(1)public ListNode middleNode(ListNode head) {ListNode slowhead,fast head;while (fast!null && fast.next!null){slow slow.next;fast fast.next.next;}return slow;} 1->2->3->4->5->null 快指针移动两个…

Linux中的shell脚本之流程控制循环遍历

3 条件判断 4 流程控制语句 1&#xff09;if 语句 案例&#xff0c;用户输入用户名和密码&#xff0c;判断用户名是否是admin,密码是否是123,如果正确&#xff0c;则显示登录成功 首先我创建了shell文件&#xff0c;touch getpawer 其中getpawer 是我自己命的名 #!/bin/bas…

Linux-4 gcc和makefile

Linux编译器-gcc/g使用 1.设计样例 c语言&#xff1a;linux中用的stdc99版本--可能会出现其他问题 c&#xff1a;Linux中用的stdc11--使用c11版本 Linux没有文件格式的区分&#xff0c;但是编译器区分 gcc编译器的文件格式是filename.c g编译器的文件格式是filename.cc或者fil…

蓝桥杯练习笔记(十七)

蓝桥杯练习笔记&#xff08;十七&#xff09; 一、 输入样例 7 7 1000001 0100010 0010100 0001AAA 00010A0 00010A0 00010A0蓝桥官网题解&#xff1a; 该题解是用了三个循环分别对三个方向的相同字符的长度进行统计&#xff0c;找出最大长度&#xff0c;最后对找出的最长Y进…

做好产品定位的3个重点

产品定位对于项目而言至关重要&#xff0c;正确的产品定位有助于项目锁定目标市场&#xff0c;精准满足客户需求。通过差异化产品策略&#xff0c;让产品在众多竞品中脱颖而出&#xff0c;形成独特竞争优势&#xff0c;从而有助于产品价值的实现。 因此做好产品定位迫在眉睫&am…

软件杯 深度学习中文汉字识别

文章目录 0 前言1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习中文汉字识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xf…

【Linux】从零认识文件操作

送给大家一句话&#xff1a; 要相信&#xff0c;所有的不美好都是为了迎接美好&#xff0c;所有的困难都会为努力让道。 —— 简蔓《巧克力色微凉青春》 开始理解基础 IO 吧&#xff01; 1 前言2 知识回顾3 理解文件3.1 进程和文件的关系3.2 文件的系统调用openwrite文件 fd 值…

OpenHarmony实战:小型系统平台驱动移植

在这一步&#xff0c;我们会在源码目录//device/vendor_name/soc_name/drivers目录下创建平台驱动。 建议的目录结构&#xff1a; device ├── vendor_name │ ├── drivers │ │ │ ├── common │ │ │ ├── Kconfig # 厂商驱动内核菜单入口 │ …

七大开源基金会联合制定符合 CRA 法案的共同标准

欧洲议会上个月通过的《欧洲网络弹性法案》(CRA) 制定通用规范和标准 Apache 软件基金会、Blender 基金会、Eclipse 基金会、OpenSSL 软件基金会、PHP 基金会、Python 软件基金会 和 Rust 基金会 这项工作由 Eclipse 基金会牵头&#xff0c;旨在建立基于现有开源最佳实践的安全…

9.图像中值腐蚀膨胀滤波的实现

1 简介 在第七章介绍了基于三种卷积前的图像填充方式&#xff0c;并生成了3X3的图像卷积模板&#xff0c;第八章运用这种卷积模板进行了均值滤波的FPGA实现与MATLAB实现&#xff0c;验证了卷积模板生成的正确性和均值滤波算法的MATLAB算法实现。   由于均值滤波、中值滤波、腐…

leet hot 100-13 最大子数组和

53. 最大子数组和 原题链接思路代码 原题链接 leet hot 100-10 53. 最大子数组和 思路 生成一个数字来记录last 表示前面数字全部之和与0取最大值 如果大于0 就加上如果不大于0 就不管 从当前位置从新开始遍历计算 时间复杂度O(n) 空间复杂度(1) 代码 class Solution {…

JVM剖析

0.前言 Java 是当今世界使用最广泛的技术平台之一。使用 Java 或 JVM 的一些技术包括&#xff1a; Apache spark用于大数据处理&#xff0c;数据分析在JVM上运行;用于数据流的Apache NiFi在内部使用的也是 JVM;现代 Web 和移动应用程序开发中使用的React native使用 的也包含…

HTTPS RSA 握手解析(计算机网络)

传统的 TLS 握手基本都是使用 RSA 算法来实现密钥交换的&#xff0c;在将 TLS 证书部署服务端时&#xff0c;证书文件其实就是服务端的公钥&#xff0c;会在 TLS 握手阶段传递给客户端&#xff0c;而服务端的私钥则一直留在服务端。 在 RSA 密钥协商算法中&#xff0c;客户端会…

佳能打印机E568扫描书和文件方法

官方网站; Canon : Inkjet 手册 : IJ Scan Utility : 启动IJ Scan Utility 打开打印机电源 扫描一个文件&#xff0c;翻页后盖好盖子。再点击扫描。 所有扫描结束之后点退出 点击保存

【无限列车1】SpringCloudAlibaba 与 SpringBoot后端架构的搭建

【无限列车1】SpringCloudAlibaba 与 SpringBoot后端架构的搭建 1、版本说明二、日志相关配置3、AOP 打印日志4、下载开源前端后台管理系统5、添加网关模块6、集成数据库和mp(1) 添加驱动和mp依赖(2) 数据库配置(3) 使用MybatisPlus 7、加密 yaml 文件中的内容(1) 依赖(2) 敏感…