中文语音识别转文字的王者,阿里达摩院FunAsr足可与Whisper相颉顽

在这里插入图片描述

君不言语音识别技术则已,言则必称Whisper,没错,OpenAi开源的Whisper确实是世界主流语音识别技术的魁首,但在中文领域,有一个足以和Whisper相颉顽的项目,那就是阿里达摩院自研的FunAsr。

FunAsr主要依托达摩院发布的Paraformer非自回归端到端语音识别模型,它具有高精度、高效率、便捷部署的优点,支持快速构建语音识别服务,最重要的是,FunASR支持标点符号识别、低语音识别、音频-视觉语音识别等功能,也就是说,它不仅可以实现语音转写,还能在转写后进行标注,一石二鸟。

FunAsr和Whisper对比 Medium vs speech_paraformer

首先配置好Python3.10的开发环境,随后在终端运行命令:

pip3 install torch torchaudio  
pip3 intall funasr  
pip3 install modelscope

随后编写测试脚本,这里以Bert-vits2里面的转写环节为例子,我们知道,如果想要克隆一个人的声音,那么必须首先把克隆对象的语音转写为文字,并且标注,标注的意义在于可以增强克隆语音的语气韵律问题。

首先看看whisper是怎么做的:

def transcribe_one(audio_path):model = whisper.load_model("medium")  # load audio and pad/trim it to fit 30 seconds  audio = whisper.load_audio(audio_path)  audio = whisper.pad_or_trim(audio)  # make log-Mel spectrogram and move to the same device as the model  mel = whisper.log_mel_spectrogram(audio).to(model.device)  # detect the spoken language  _, probs = model.detect_language(mel)  print(f"Detected language: {max(probs, key=probs.get)}")  lang = max(probs, key=probs.get)  # decode the audio  options = whisper.DecodingOptions(beam_size=5)  result = whisper.decode(model, mel, options)  # print the recognized text  print(result.text)  return lang, result.text

这通过Whisper的gpu模式来进行推理,模型选择medium,硬件要求是最低6G显存,更多关于whisper的配置,请移步:闻其声而知雅意,M1 Mac基于PyTorch(mps/cpu/cuda)的人工智能AI本地语音识别库Whisper(Python3.10),这里不再赘述。

Whisper转写后效果:

./Data\Keira\wavs\Keira_0.wav|Keira|ZH|光动嘴不如亲自做给你看  
./Data\Keira\wavs\Keira_1.wav|Keira|ZH|等我一下呀迫不及待了嘛  
./Data\Keira\wavs\Keira_10.wav|Keira|ZH|你还会帮我吗真没想到你对葡萄酒也这么内行啊  
./Data\Keira\wavs\Keira_11.wav|Keira|ZH|差不多吧好了 聊了这么久我都饿了  
./Data\Keira\wavs\Keira_12.wav|Keira|ZH|还是赶紧开动吧我自己能应付  
./Data\Keira\wavs\Keira_13.wav|Keira|ZH|这些蛋啊 鸡啊 鹅啊 满地都是  
./Data\Keira\wavs\Keira_14.wav|Keira|ZH|再说我的经济状况很快就要改善了  
./Data\Keira\wavs\Keira_15.wav|Keira|ZH|因为我很清楚他的研究有多重要  
./Data\Keira\wavs\Keira_16.wav|Keira|ZH|万一落入心怀不轨的人手里结果不堪设想  
./Data\Keira\wavs\Keira_17.wav|Keira|ZH|再後悔也晚了  
./Data\Keira\wavs\Keira_18.wav|Keira|ZH|抱歉这话题太丧气了  
./Data\Keira\wavs\Keira_19.wav|Keira|ZH|我不應該提起來煞風景的  
./Data\Keira\wavs\Keira_2.wav|Keira|ZH|現在還不是時候  
./Data\Keira\wavs\Keira_20.wav|Keira|ZH|尤其是在我們的浪漫晚餐上  
./Data\Keira\wavs\Keira_21.wav|Keira|ZH|你知道森瑞卡尼亚人管那个星座叫什么吗  
./Data\Keira\wavs\Keira_22.wav|Keira|ZH|不對哦是個含義完全不一樣的名字  
./Data\Keira\wavs\Keira_23.wav|Keira|ZH|事实上有点下流  
./Data\Keira\wavs\Keira_24.wav|Keira|ZH|靠近一点我悄悄告诉你  
./Data\Keira\wavs\Keira_3.wav|Keira|ZH|好了,趕緊出去  
./Data\Keira\wavs\Keira_4.wav|Keira|ZH|你还挺乖的嘛现在差不多准备好了  
./Data\Keira\wavs\Keira_5.wav|Keira|ZH|我不是說差不多好了嗎  
./Data\Keira\wavs\Keira_6.wav|Keira|ZH|别打岔 看仔细了  
./Data\Keira\wavs\Keira_7.wav|Keira|ZH|那是没错但那样我就不会把你请到这儿来了  
./Data\Keira\wavs\Keira_8.wav|Keira|ZH|现在明白我为什么要那些材料了吧  
./Data\Keira\wavs\Keira_9.wav|Keira|ZH|如果我说 去树林里帮我取些食材 我要做晚餐

可以看到,medium模型对于中文的泛化效果一般,大多数素材都没有标注,但仅限于Whisper的medium模型。

现在我们来看看阿里的FunAsr:

from modelscope.pipelines import pipeline  
from modelscope.utils.constant import Tasks  from modelscope.hub.snapshot_download import snapshot_download  # 指定本地目录  
local_dir_root = "./models_from_modelscope"  
model_dir = snapshot_download('damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch', cache_dir=local_dir_root)  inference_pipeline = pipeline(  task=Tasks.auto_speech_recognition,  model=model_dir,  vad_model='damo/speech_fsmn_vad_zh-cn-16k-common-pytorch',  punc_model='damo/punc_ct-transformer_zh-cn-common-vocab272727-pytorch',  #lm_model='damo/speech_transformer_lm_zh-cn-common-vocab8404-pytorch',  #lm_weight=0.15,  #beam_size=10,  
)  
param_dict = {}  
param_dict['use_timestamp'] = False

这里首先指定模型目录,否则FunAsr会在C盘下载模型。

随后编写转写逻辑:

def transcribe_one(audio_path):  rec_result = inference_pipeline(audio_in=audio_path, param_dict=param_dict)  print(rec_result["text"])  return "zh", rec_result["text"]

转写后效果:

./Data\Keira\wavs\Keira_0.wav|Keira|ZH|光动嘴不如亲自做给你看。  
./Data\Keira\wavs\Keira_1.wav|Keira|ZH|等我一下呀,迫不及待了吗?  
./Data\Keira\wavs\Keira_10.wav|Keira|ZH|你还会帮我吗?真没想到你对葡萄酒也这么内行啊。  
./Data\Keira\wavs\Keira_11.wav|Keira|ZH|差不多吧。好了,聊了这么久,我都饿了。  
./Data\Keira\wavs\Keira_12.wav|Keira|ZH|还是赶紧开动吧,我自己能应付。  
./Data\Keira\wavs\Keira_13.wav|Keira|ZH|这些蛋啊、鸡啊、鹅啊的满地都是。  
./Data\Keira\wavs\Keira_14.wav|Keira|ZH|再说我的经济状况很快就要改善了。  
./Data\Keira\wavs\Keira_15.wav|Keira|ZH|因为我很清楚他的研究有多重要。  
./Data\Keira\wavs\Keira_16.wav|Keira|ZH|万一落入心怀不轨的人,手里,结果不堪设想。  
./Data\Keira\wavs\Keira_17.wav|Keira|ZH|再后悔也晚了。  
./Data\Keira\wavs\Keira_18.wav|Keira|ZH|哎呀,抱歉,这话题太丧气了。  
./Data\Keira\wavs\Keira_19.wav|Keira|ZH|我不应该提起来煞风景的。  
./Data\Keira\wavs\Keira_2.wav|Keira|ZH|现在还不是时候。  
./Data\Keira\wavs\Keira_20.wav|Keira|ZH|尤其是在我们的浪漫晚餐上。  
./Data\Keira\wavs\Keira_21.wav|Keira|ZH|你知道瑟瑞卡尼亚人管那个星座叫什么吗?  
./Data\Keira\wavs\Keira_22.wav|Keira|ZH|不对哦,是个含义,完全不一样的名字。  
./Data\Keira\wavs\Keira_23.wav|Keira|ZH|事实上有点下流。  
./Data\Keira\wavs\Keira_24.wav|Keira|ZH|靠近一点儿,我悄悄告诉你。  
./Data\Keira\wavs\Keira_3.wav|Keira|ZH|好了,赶紧出去。  
./Data\Keira\wavs\Keira_4.wav|Keira|ZH|你还挺乖的嘛,现在差不多准备好了。  
./Data\Keira\wavs\Keira_5.wav|Keira|ZH|我不是说差不多好了吗?  
./Data\Keira\wavs\Keira_6.wav|Keira|ZH|别打岔看仔细了。  
./Data\Keira\wavs\Keira_7.wav|Keira|ZH|那是没错,但那样我就不会把你请到这儿来了。  
./Data\Keira\wavs\Keira_8.wav|Keira|ZH|现在明白我为什么要那些材料了吧。  
./Data\Keira\wavs\Keira_9.wav|Keira|ZH|如果我说去树林里帮我取些食材,我要做晚餐。

可以看到,几乎不需要修改,而且每一条素材都进行了标注。

对比图如下:

FunAsr和Whisper对比 Large-v2 & Large-v3 vs speech_paraformer

当然,Medium并非whisper的最高水平,现在我们来换成大模型:

def transcribe_one(audio_path):  model = whisper.load_model("large-v2")  # load audio and pad/trim it to fit 30 seconds  audio = whisper.load_audio(audio_path)  audio = whisper.pad_or_trim(audio)  # make log-Mel spectrogram and move to the same device as the model  mel = whisper.log_mel_spectrogram(audio).to(model.device)  # detect the spoken language  _, probs = model.detect_language(mel)  print(f"Detected language: {max(probs, key=probs.get)}")  lang = max(probs, key=probs.get)  # decode the audio  options = whisper.DecodingOptions(beam_size=5)  result = whisper.decode(model, mel, options)  # print the recognized text  print(result.text)  return lang, result.text

返回结果:

./Data\Keira\wavs\Keira_0.wav|Keira|ZH|光动嘴不如亲自做给你看  
./Data\Keira\wavs\Keira_1.wav|Keira|ZH|等我一下呀迫不及待了嘛  
./Data\Keira\wavs\Keira_10.wav|Keira|ZH|你还会帮我吗真没想到你对葡萄酒也这么内行啊  
./Data\Keira\wavs\Keira_11.wav|Keira|ZH|差不多吧好了 聊了这么久我都饿了  
./Data\Keira\wavs\Keira_12.wav|Keira|ZH|还是赶紧开动吧我自己能应付  
./Data\Keira\wavs\Keira_13.wav|Keira|ZH|这些蛋啊 鸡啊 鹅啊 满地都是  
./Data\Keira\wavs\Keira_14.wav|Keira|ZH|再说我的经济状况很快就要改善了  
./Data\Keira\wavs\Keira_15.wav|Keira|ZH|因为我很清楚他的研究有多重要  
./Data\Keira\wavs\Keira_16.wav|Keira|ZH|万一落入心怀不轨的人手里结果不堪设想  
./Data\Keira\wavs\Keira_17.wav|Keira|ZH|再後悔也晚了  
./Data\Keira\wavs\Keira_18.wav|Keira|ZH|抱歉这话题太丧气了  
./Data\Keira\wavs\Keira_19.wav|Keira|ZH|我不應該提起來煞風景的  
./Data\Keira\wavs\Keira_2.wav|Keira|ZH|現在還不是時候  
./Data\Keira\wavs\Keira_20.wav|Keira|ZH|尤其是在我們的浪漫晚餐上  
./Data\Keira\wavs\Keira_21.wav|Keira|ZH|你知道森瑞卡尼亚人管那个星座叫什么吗  
./Data\Keira\wavs\Keira_22.wav|Keira|ZH|不對哦是個含義完全不一樣的名字  
./Data\Keira\wavs\Keira_23.wav|Keira|ZH|事实上有点下流  
./Data\Keira\wavs\Keira_24.wav|Keira|ZH|靠近一点我悄悄告诉你  
./Data\Keira\wavs\Keira_3.wav|Keira|ZH|好了,趕緊出去  
./Data\Keira\wavs\Keira_4.wav|Keira|ZH|你还挺乖的嘛现在差不多准备好了  
./Data\Keira\wavs\Keira_5.wav|Keira|ZH|我不是說差不多好了嗎  
./Data\Keira\wavs\Keira_6.wav|Keira|ZH|别打岔 看仔细了  
./Data\Keira\wavs\Keira_7.wav|Keira|ZH|那是没错但那样我就不会把你请到这儿来了  
./Data\Keira\wavs\Keira_8.wav|Keira|ZH|现在明白我为什么要那些材料了吧  
./Data\Keira\wavs\Keira_9.wav|Keira|ZH|如果我说 去树林里帮我取些食材 我要做晚餐

整体上的偏差并不大,但标注上略逊FunAsr一筹。

结语

Funasr的模型paraformer-zh受益于60000小时的纯人工标注的数据来训练,中文参数达到220M个,它的两个模块,一个是基于前馈顺序记忆网络(FSMN-VAD)的语音活动检测模型,另外一个是基于可控时延 Transformer(CT-Transformer),相比 OpenAI 的 Whisper 这两块能力还是比较突出的。

很难想象6w小时的数据还是纯手工标注,毕竟阿里财大气粗。

而Whisper 则用了 68w 小时的数据,从这个层面来看,FunASR 似乎没占便宜。但Whisper 针对的是全球市场,68w小时里面有多少中文素材就很难说了,因此 FunASR 的中文语音转写效果确实比 Whisper 更优秀。

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

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

相关文章

截图识别文字怎么弄?分享3个工具!

随着科技的不断发展,我们的生活和工作中需要处理越来越多的数字信息。有时候,我们需要从图片或者截图中提取文字,例如整理资料、处理图片注释等等。这时,一款好用的截图识别文字工具就显得尤为重要。今天,就让我们来聊…

浏览器不支持 css 中 :not 表达式的解决方法

问题 使用 :not 表达式的样式在不同浏览器中存在不生效的问题。 原因 不生效是因为浏览器版本较低所导致的。(更多详细信息请看:MDN) 解决方法 初始写法: .input-group:not(.user-name, .user-passwork){width: auto; }改成…

常见Mysql数据库操作语句

-- DDL创建数据库结构 -- 查询所有数据库 show databases ; -- 修改数据库字符集 alter database db02 charset utf8mb4; -- 创建字符编码为utf——8的数据库 create database db05 DEFAULT CHARACTER SET utf8;-- 创建表格 create table tb_user(id int auto_increment primar…

搜维尔科技:【简报】元宇宙数字人赛道,2022年金奖《金魚姬》赏析!

一名网络直播主名叫琉璃,在即将展开她日常进行的每日准时直播前,肚子极为不舒服,突然很想上厕所,由于时间紧迫,导致琉璃需要在厕所里面完成直播!为了掩饰自己所在的处境,她决定运用自己设计的虚…

85.乐理基础-记号篇-力度记号

内容来源于:三分钟音乐社 上一个内容:78.乐理基础-非常见拍号如何打拍子-CSDN博客 85-78之间的内容观看索引: 腾讯课堂-三分钟音乐社-打拍子(20)-总结、重点、练习与检验方法开始看 力度记号:p、f、mp、…

基于SpringBoot的精品在线试题库系统(系统+数据库+文档)

🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目 希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅一、绪论 1. 研究背景 现在大家…

软件测试|Python Faker库使用指南

简介 Faker是一个Python库,用于生成虚假(假的)数据,用于测试、填充数据库、生成模拟数据等目的。它可以快速生成各种类型的虚假数据,如姓名、地址、电子邮件、电话号码、日期等,非常适合在开发和测试过程中…

【Vue】文件管理页面制作

<template><div><div style"margin: 10px 0"><el-input style"width: 200px" placeholder"请输入名称" suffix-icon"el-icon-search" v-model"name"></el-input><el-button class"ml…

RIP复习实验

条件: R1为外网&#xff0c;R8和r9的环回分别是172.16.1.0/24和172.16.2.0/24 中间使用78.1.1.0/24 剩下的路由器2-6使用172.16.0.0/16 要求: R1为运营商 r1远程登录r2实际登录r7 R2访问r7要求走r5去访问 全网可达 实现流程: 首先配置好各接口ip address 然后r2-r7使用rip…

数据库授权问题 ERROR 1410 (42000): You are not allowed to create a user with GRANT

当我要给数据库授权时&#xff0c;却出现了错误。 ERROR 1410 (42000): You are not allowed to create a user with GRANT 包括对数据库角色权限信息的查询&#xff0c;同样也会出现问题 ERROR: 1141: There is no such grant defined for user xuxu on host localhost 这是…

扒一扒Go语言中的“语法糖”

概 述 最近学习Golang语言的过程中&#xff0c;我发现Golang&#xff08;后面简称Go&#xff09;中的语法糖还蛮多的&#xff0c;有些语法糖还让会让人很懵逼。那么接下来&#xff0c;让我以一个曾经的 Java CURD boy&#xff0c;来说一说 Go 中的语法糖。 语法糖定义 语法糖…

Selenium自动化程序被检测为爬虫,怎么屏蔽和绕过

Selenium 操作被屏蔽 使用selenium自动化网页时&#xff0c;有一定的概率会被目标网站识别&#xff0c;一旦被检测到&#xff0c;目标网站会拦截该客户端做出的网页操作。 比如淘宝和大众点评的登录页&#xff0c;当手工打开浏览器&#xff0c;输入用户名和密码时&#xff0c…

windows和liunx对比及Linux分类

windows一定比liunx差吗&#xff0c;这绝对是天大误解&#xff0c;不是说你常用的开始是liunx就代表windows差 windows和liunx对比 有人说Linux性能远高于Windows&#xff0c;这个笔者是不认可的&#xff0c;给Linux套上一个图形界面&#xff0c;你再使劲美化一下&#xff0c…

逆向7通用寄存器

MOV指令前后的容器宽度要一致 如ECX与EAX 都是32位 mov eax&#xff0c;0x111 可以少写后面补零多写的会移除 源操作数是后面的 目标操作数是前面的 32位和64位寻址宽度 是查找内存宽度的范围 每一个编号对应一个字节 即内存宽度 32位是4g 64位大的多 0x123456是临时数

光缆通信有什么特点?

光缆由一个或多个光纤组成&#xff0c;每个光纤由一个非常纤细的玻璃或塑料纤维组成&#xff0c;可以传输光信号的高速数据。光缆通信具有以下特点&#xff1a; 1. 高带宽&#xff1a;光缆通信可以提供非常高的带宽&#xff0c;远远超过传统的铜缆通信。光纤的宽带特性使其能够…

【PixPin】比Snipaste、QQ的截图长图和动图还好用的截图工具

1.下载地址—— 下载地址 2.下载压缩包 双击exe文件运行 按默认的来 中文安装 选择安装路径 下一步&#xff0c;安装 安装完成&#xff0c;可以自己设置快捷键

python画房子

前言 今天&#xff0c;我们来用Python画房子。 一、第一种 第一种比较简单。 代码&#xff1a; import turtle as t import timedef go(x, y):t.penup()t.goto(x, y)t.pendown() def rangle(h,w):t.left(180)t.forward(h)t.right(90)t.forward(w)t.left(-90)t.forward(h) de…

Android通知---创建通知(附加代码)

1. 创建基本通知 (1) 创建基本通知 NotificationCompat.Builder builder new NotificationCompat.Builder(this, "channel_id").setSmallIcon(R.drawable.notification_icon) .setContentTitle("textTitle") .setContentText("text…

ubuntu查看内存使用情况命令

命令简介 在Ubuntu系统中&#xff0c;可以使用终端命令来查看电脑的内存使用情况。打开终端并输入以下命令&#xff1a; free -h 该命令可用于查看系统中内存的总量、已使用的内存、空闲的内存及缓冲区使用的内存。其中“-h”选项用于以人类可读的格式显示内存大小。执行该命…

YOLOv8-Seg改进:轻量化改进 | 超越RepVGG!浙大阿里提出OREPA:在线卷积重参数化

🚀🚀🚀本文改进:OREPA在线卷积重参数化巧妙的和YOLOV8结合,并实现轻量化 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1)手把手教你如何训练YOLOv8-seg; 2)模型创新,提升分割性能; 3)独家…