一、项目介绍
Paraformer是达摩院语音团队提出的一种高效的非自回归端到端语音识别框架。本项目为Paraformer中文通用语音识别模型,采用工业级数万小时的标注音频进行模型训练,保证了模型的通用识别效果。模型可以被应用于语音输入法、语音导航、智能会议纪要等场景。
Paraformer模型结构如上图所示,由 Encoder、Predictor、Sampler、Decoder 与 Loss function 五部分组成。Encoder可以采用不同的网络结构,例如self-attention,conformer,SAN-M等。Predictor 为两层FFN,预测目标文字个数以及抽取目标文字对应的声学向量。Sampler 为无可学习参数模块,依据输入的声学向量和目标向量,生产含有语义的特征向量。Decoder 结构与自回归模型类似,为双向建模(自回归为单向建模)。Loss function 部分,除了交叉熵(CE)与 MWER 区分性优化目标,还包括了 Predictor 优化目标 MAE。
其核心点主要有:
- Predictor 模块:基于 Continuous integrate-and-fire (CIF) 的 预测器 (Predictor) 来抽取目标文字对应的声学特征向量,可以更加准确的预测语音中目标文字个数。
- Sampler:通过采样,将声学特征向量与目标文字向量变换成含有语义信息的特征向量,配合双向的 Decoder 来增强模型对于上下文的建模能力。
- 基于负样本采样的 MWER 训练准则。
版本区别
该项目目前分为三个版本,分别为ASR版
|热词版
|长音频版
,各版本的详细功能区别如下。
- ASR版
- 该模型结构为非自回归语音识别模型,多个中文公开数据集上取得SOTA效果,可快速地基于ModelScope对模型进行微调定制和推理。
- 热词版
- 支持热词定制功能,基于提供的热词列表进行激励增强,提升热词的召回率和准确率。
- 长音频版
- 集成VAD、ASR、标点与时间戳功能,可直接对时长为数小时音频进行识别,并输出带标点文字与时间戳。
项目仓库
- 热词版
- ASR版
- 长音频版
二、环境安装
在执行项目安装之前,我们还需要安装Git
和Conda
,如果您的电脑还未安装这两个软件,请先根据本站所给出的教程安装。
Windows系统安装Git请参阅此文章:
http://dataddd.com/git%ef%bd%9cwindows%e5%ae%89%e8%a3%85%e6%95%99%e7%a8%8b/
Windows系统安装Conda请参阅此文章:
http://dataddd.com/anaconda%ef%bd%9cminiconda%ef%bd%9cwindows%e5%ae%89%e8%a3%85%e6%95%99%e7%a8%8b/
环境部署
如果您是初学者,对于命令行不太理解,那么请按下键盘上的Win键+R键
后,在弹出的新窗口内输入CMD
并按下回车,打开CMD窗口,按顺序执行如下的每一条命令。
在CMD中执行下面的命令行,创建一个名为Paraformer
的Conda
虚拟环境,且Python
版本为3.7
。
conda create -y --name Paraformer python=3.7
初始化Conda
环境,防止后续操作可能存在报错等问题。
conda init cmd.exe
激活名为Paraformer
的Conda环境,这样我们可以将我们后续所需要的所有环境依赖都安装至此环境下。
conda activate Paraformer
执行如下命令,安装阿里达摩院
相关依赖。
pip install modelscope
执行如下命令,安装阿里达摩院
所提供魔塔的相关环境依赖。
pip install "modelscope" -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html
执行如下命令安装torch
依赖,并且使用清华源加速。
pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple
另外,我们还需要安装Python的funasr
模块,funasr
的作用一般用来识别语音。
pip install funasr
此时我们已经完成了关于此项目的所有相关环境部署,下面进入使用环节的介绍。
模型下载
官方下载
在你首次使用Python调用该环境进行语音转文本操作时,项目将会自动从阿里云拉取相应模型至本地。
网盘下载
关于此项目的模型,本站已为您下载并整理好。如果你不方便通过官网下载,可以使用本站所提供的网盘下载地址。
damo
类型: RAR 大小: 1.03GB
该项目的模型默认路径为%USERPROFILE%\.cache\modelscope\hub
,如果你是初次使用,可能不存在此路径,可以在CMD中执行如下代码判断该路径是否存在,如果不存在则自动创建。
if not exist %USERPROFILE%\.cache\modelscope\hub mkdir %USERPROFILE%\.cache\modelscope\hub
执行完上面的代码之后,我们可以通过在CMD中执行下面的代码,自动打开模型目录
。
start %USERPROFILE%\.cache\modelscope\hub
将我们下载完成名为demo
的压缩包解压为文件夹
,然后移动至该目录
下即可。
使用教程
此模型官方并未给出一个详细的脚本,本站针对不同场景,写了几个简单的Python脚本,可以满足你在各个环境下的基本使用要求。
代码编辑器
使用pycharm
运行以下Python
脚本即可。在运行该脚本之前,请先对以下Python脚本中的名称
|格式
|路径
根据自身情况进行修改。
注意:使用pycharm
执行该脚本时,pycharm
会提示您选择一个Python环境,此时您可以选择名为Paraformer
的Python环境,这就是我们刚刚使用Conda所生成的虚拟环境。
音频要求
关于音频的要求,本项目支持多种上音频输入文件格式,比如WAV
|PCM
|WAV的URL
|WAV的二进制数据
|已解析的Audio音频
等格式。为了方便讲解,本站本次使用比较通用的WAV音频格式文件夹做为示例,如果你的音频文件是MP3或视频等格式,可以通过FFMPEG或其它音视频编辑软件输出WAV即可。
示例音频
因为该项目对长音频的支持比较好,所以本站将会使用一段郭德纲
的相声《东游记》
做为示例
,音频时间长度为27分53秒
。
语音软件文字|常规调用方式
请将其中AudioFile
变量的音频路径
,修改为你需要的音频路径,然后运行该脚本
即可。
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
# 音频文件路径
AudioFile = 'D:/Audio.wav'
inference_pipeline = pipeline(
task=Tasks.auto_speech_recognition,
model='damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch',
model_revision="v1.2.4")
rec_result = inference_pipeline(audio_in=AudioFile)
print(rec_result)
因为音频时间较长,所以需要等待的时间可能会比较久,具体时间因系统配置而议。
站长的祖传显卡2080TI的转换时间为5分钟左右,速度还是比较乐观的。
以下是等待一段时间过后,所输出的文本转换内容。
<strong>{</strong>'text': '谢谢大家。嗯,看见你们高兴,我痛快也高兴,老老少少。嗯,楼上楼下对一万多人,哪有那么些人呢?连摇台吃涮肉的这帮嗨,外边也算来这么些人。嗯,好嗯,没事,多听听相声,对,有好处嗯,开心哎,一乐没有难过的事儿啊。天塌下来,有武大郎盯着就怕活着呢。火 也 不 应 该 嗯 想 了 这 么 一 刻 钟 嗯 出 去 跟 他 好 好 说 说 哎 是 不 是 解 释 一 下 就 是 我 决 定 嗯 我 我 冲 水 我 站 起 来 别 那 不 是 想 了 一 刻 钟 您 那 儿 拉 了 一 棵 钟 讨 厌 啊 啊 讨 厌 啊 我 坐 那 我 冷 静 了 半 天 我 觉 着 心 心 里 舒 服 多 了 你 知 道 吗 肚 子 里 舒 服 多 了 啊 瞎 说 谁 瞎 说 了 我 太 对 他 有 这 用 吗 是 啊 您 想 的 时 候 冲 水 干 嘛 我 这 琢 磨 我 就 冲 进 房 间 坐 错 地 儿 啊 那 叫 冲 错 房 间 了 啊 哎 我 那 意 思 就 是 他 也 他 希 望 我 好 是 谁 都 希 望 谁 戴 乐 你 出 去 啊 谁 乐 没 有 的 不 带 这 样 的 嗯 我 们 家 里 闹 别 你 还 看 着 可 乐 你 是 什 么 人 你 这 是 是 要 不 给 您 气 成 这 样 舅 舅 真 生 气 嗯 当 然 他 也 是 为 了 我 好 是 他 一 直 就 希 望 我 出 类 拔 萃 吧 对 比 别 人 强 吧 啊 是 不 是 嗯 这 就 是 典 型 的 望 子 成 龙 你 知 道 吗 你 这 关 系 不 一 般 呢 那 个 那 当 然 了 啊 当 然 我 水 平 有 限 我 的 心 是 热 的 你 别 客 气 了 啊 不 错 是 吧 我 要 艺 我 跟 你 我 比 不 了 怎 么 了 我 跟 你 我 没 法 比 嗨 人 家 于 老 师 人 家 这 跟 咱 水 平 觉 悟 啊 方 方 面 面 经 验 都 比 咱 强 啊 您 不 能 那 么 咱 人 跟 人 家 怎 么 比 嗨 咱 就 普 通 老 百 姓 吃 谁 都 谁 捞 鱼 去 啊 书 香 门 第 嗨 人 家 香 没 地 地 啊 连 他 带 他 媳 妇 儿 啊 人 家 嫂 子 人 家 这 都 大 户 人 家 不 敢 知 道 吗 琴 棋 书 画 样 样 精 通 我 们 家 早 上 起 来 我 媳 妇 妇 来 老 点 去 他 可 不 是 谁 都 扫 地 啊 擦 地 是 说 有 谁 家 孩 子 们 家 净 这 个 杂 杂 事 儿 吗 人 家 家 早 上 起 来 收 拾 利 索 了 香 油 点 歌 香 嚯 那 放 着 古 筝 的 音 乐 哦 啊 俩 俩 书 台 笔 墨 纸 砚 都 预 备 好 了 颜 搁 了 墨 片 倒 了 笔 啊 擦 写 两 口 子 画 画 哎 人 家 要 人 家 好 这 个 你 说 他 说 这 边 嫂 子 做 对 联 哦 一 人 桌 子 上 搁 一 镜 子 嗯 看 一 眼 好 两 品 自 画 像 扒 了 牙 也 得 画 出 啊 嫂 �
因为内容实在过长,站长删除了一下中间的部分内容,方便大家观看所得到的内容格式。
可以看到得到的结果还是比较准确的,大部分都不存在问题,但是也有一些小问题,比如输出时没有时间戳、格式错乱、难以阅读等问题。
语音转文字|时间格式优化
为了解决上面的问题,我们可以修改一下上面的代码,添加时间戳,并且让其变成人类更方便阅读的格式,修改后的代码如下。
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
from datetime import datetime
# 音频文件路径
AudioFile = 'D:/Audio.wav'
inference_pipeline = pipeline(
task=Tasks.auto_speech_recognition,
model='damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch',
model_revision="v1.2.4")
rec_result = inference_pipeline(audio_in=AudioFile)
def convert_timestamp(ts):
ts = ts / 1000 # convert to seconds
hours = ts // 3600
ts %= 3600
minutes = ts // 60
seconds = ts % 60
return "%02d:%02d:%02d" % (hours, minutes, seconds)
for sentence in rec_result['sentences']:
start_time = convert_timestamp(sentence['start'])
end_time = convert_timestamp(sentence['end'])
print("{} - {} {}".format(start_time, end_time, sentence['text']))
等待片刻之后,我们将会得到以下格式的内容,站长只截取了一小部分放上来。
—————— 开头部分省略 ——————
00:03:05 - 00:03:07 当然我水平有限,
00:03:07 - 00:03:08 我的心是热的,
00:03:08 - 00:03:09 你别客气了啊,
00:03:09 - 00:03:10 不错是吧?
00:03:10 - 00:03:11 我要艺,
00:03:11 - 00:03:12 我跟你我比不了怎么了,
00:03:12 - 00:03:13 我跟你我没法比。
00:03:13 - 00:03:14 嗨,
00:03:14 - 00:03:14 人家于老师,
00:03:14 - 00:03:17 人家这跟咱水平觉悟啊,
00:03:17 - 00:03:19 方方面面经验都比咱强啊。
00:03:19 - 00:03:20 您不能,
00:03:20 - 00:03:22 那么咱人跟人家怎么比嗨,
00:03:22 - 00:03:24 咱就普通老百姓吃,
00:03:24 - 00:03:25 谁都谁捞鱼去啊,
00:03:25 - 00:03:27 书香门第嗨,
00:03:27 - 00:03:28 人家香没地地啊,
00:03:28 - 00:03:31 连他带他媳妇儿啊,
00:03:31 - 00:03:32 人家嫂子,
00:03:32 - 00:03:35 人家这都大户人家不敢知道吗?
00:03:35 - 00:03:37 琴棋书画样样精通,
00:03:37 - 00:03:38 我们家早上起来,
00:03:38 - 00:03:39 我媳妇妇来老点去,
00:03:39 - 00:03:42 他可不是谁都扫地啊,
—————— 结尾部分省略 ——————
但是这种如果是对于比较长的音频来说,还是不方便整理的,因为CMD输出窗口行数显示有限,对于过多的内容无法显示,所以我们可以尝试将这些输出为Excel的格式。
语音转文字|Excel输出
import pandas as pd
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
from datetime import datetime
# 音频文件路径
AudioFile = 'D:/Audio.wav'
# Excel文件路径
ExcelFile = 'D:/output.xlsx'
inference_pipeline = pipeline(
task=Tasks.auto_speech_recognition,
model='damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch',
model_revision="v1.2.4")
rec_result = inference_pipeline(audio_in=AudioFile)
# 将毫秒数转换为 "时:分:秒" 的形式
def convert_timestamp(ts):
ts = ts / 1000 # convert to seconds
hours = ts // 3600
ts %= 3600
minutes = ts // 60
seconds = ts % 60
return "%02d:%02d:%02d" % (hours, minutes, seconds)
# 创建用于数据存储的 pandas 数据框
df = pd.DataFrame(columns=['开始时间', '结束时间', '文本内容'])
for sentence in rec_result['sentences']:
start_time = convert_timestamp(sentence['start'])
end_time = convert_timestamp(sentence['end'])
df = df.append({'开始时间': start_time, '结束时间': end_time, '文本内容': sentence['text']}, ignore_index=True)
# 保存Excel文件
df.to_excel(ExcelFile, index=False)
等待片刻过后,将会在你所指定的文件夹目录下生成
一个名为output.xlsx
的Excel
文件,打开后我们将会看到如下内容。
当前这些内容行为1123
,可以发现,只要识别到的音频中间存在停顿,那么就会另换一行。这对于爱啰嗦的领导来说,输出的行数还是比较恐怖的,所以我们可以再添加一种优化方式。
语音转文字|Excel输出+句号分割
其实我们观察上面的示例截图就会发现,在Excel表格中,多数都是逗号就被分割为另一行了,那么我们修改一下脚本,将非句号的部分都叠加在一起,然后按。
进行分割,这样就可以避免极短内容会被输出为一行的问题啦。
import pandas as pd
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
from datetime import datetime
# 音频文件路径
AudioFile = 'D:/Audio.wav'
# Excel文件路径
ExcelFile = 'output.xlsx'
inference_pipeline = pipeline(
task=Tasks.auto_speech_recognition,
model='damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch',
model_revision="v1.2.4")
rec_result = inference_pipeline(audio_in=AudioFile)
# 将毫秒数转换为 "时:分:秒" 的形式
def convert_timestamp(ts):
ts = ts / 1000 # convert to seconds
hours = ts // 3600
ts %= 3600
minutes = ts // 60
seconds = ts % 60
return "%02d:%02d:%02d" % (hours, minutes, seconds)
# 创建用于数据存储的 pandas 数据框
df = pd.DataFrame(columns=['开始时间', '结束时间', '文本内容'])
# 当前行内容
current_line = {'开始时间': None, '结束时间': None, '文本内容': ""}
for sentence in rec_result['sentences']:
if current_line['开始时间'] is None:
current_line['开始时间'] = convert_timestamp(sentence['start'])
current_line['文本内容'] += sentence['text']
if sentence['text'].strip().endswith('。'):
current_line['结束时间'] = convert_timestamp(sentence['end'])
df = df.append(current_line, ignore_index=True)
current_line = {'开始时间': None, '结束时间': None, '文本内容': ""}
# 保存Excel文件
df.to_excel('output.xlsx', index=False)
等待片刻之后,我们将会得到如以下截图中的效果,这次还是比较让人舒服的。
官方参考
以下为官方所提供的参考参数等,本站并未进行整理,大家可根据自身需求浏览自己需要的部分。
基于ModelScope进行推理
- 推理支持音频格式如下:
- wav文件路径,例如:data/test/audios/asr_example.wav
- pcm文件路径,例如:data/test/audios/asr_example.pcm
- wav文件url,例如:https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_example_zh.wav
- wav二进制数据,格式bytes,例如:用户直接从文件里读出bytes数据或者是麦克风录出bytes数据。
- 已解析的audio音频,例如:audio, rate = soundfile.read(“asr_example_zh.wav”),类型为numpy.ndarray或者torch.Tensor。
- wav.scp文件,需符合如下要求:
cat wav.scp
asr_example1 data/test/audios/asr_example1.wav
asr_example2 data/test/audios/asr_example2.wav
...
- 若输入格式wav文件url,api调用方式可参考如下范例:
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
inference_pipeline = pipeline(
task=Tasks.auto_speech_recognition,
model='damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch',
model_revision="v1.2.4")
rec_result = inference_pipeline(audio_in='https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_vad_punc_example.wav')
print(rec_result)
- 输入音频为pcm格式,调用api时需要传入音频采样率参数audio_fs,例如:
rec_result = inference_pipeline(audio_in='https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_vad_punc_example.pcm', audio_fs=16000)
- 输入音频为wav格式,api调用方式可参考如下范例:
rec_result = inference_pipeline<strong>(</strong>audio_in='asr_vad_punc_example.wav'<strong>)</strong>
- 若输入格式为文件wav.scp(注:文件名需要以.scp结尾),可添加 output_dir 参数将识别结果写入文件中,api调用方式可参考如下范例:
inference_pipeline = pipeline(
task=Tasks.auto_speech_recognition,
model='damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch',
model_revision="v1.2.4",
output_dir='./output_dir')
inference_pipeline(audio_in="wav.scp")
识别结果输出路径结构如下:
tree output_dir/
output_dir/
└── 1best_recog
├── rtf
├── score
├── text
└── time_stamp
1 directory, 4 files
rtf:计算过程耗时统计
score:识别路径得分
text:语音识别结果文件
time_stamp:时间戳结果文件
- 若输入音频为已解析的audio音频,api调用方式可参考如下范例:
import soundfile
waveform, sample_rate = soundfile.read("asr_vad_punc_example.wav")
rec_result = inference_pipeline(audio_in=waveform)
- ASR、VAD、PUNC模型自由组合
可根据使用需求对VAD和PUNC标点模型进行自由组合,使用方式如下:
inference_pipeline = pipeline(
task=Tasks.auto_speech_recognition,
model='damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch',
vad_model='damo/speech_fsmn_vad_zh-cn-16k-common-pytorch',
punc_model='damo/punc_ct-transformer_zh-cn-common-vocab272727-pytorch',
)
如需加入LM模型,可增加配置lm_model=’damo/speech_transformer_lm_zh-cn-common-vocab8404-pytorch’。
长音频版本模型中集成了VAD、ASR、标点模型,若不使用VAD或标点模型,可设置参数vad_model=””或punc_model=””,具体使用方式可参考文档,例如:
inference_pipeline = pipeline(
task=Tasks.auto_speech_recognition,
model='damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch',
vad_model='',
punc_model='',
)
长音频版本模型默认开启时间戳,若不使用时间戳,可通过传入参数param_dict[‘use_timestamp’] = False关闭时间戳,使用方式如下:
param_dict['use_timestamp'] = False
rec_result = inference_pipeline(audio_in='https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_vad_punc_example.wav', param_dict=param_dict)
)
基于ModelScope进行微调
- 基于ModelScope上数据集进行微调:
以AISHELL-1数据集为例,完整数据集已经上传ModelScope,可通过数据集英文名(speech_asr_aishell1_trainsets)搜索:
import os
from modelscope.metainfo import Trainers
from modelscope.trainers import build_trainer
from modelscope.msdatasets.audio.asr_dataset import ASRDataset
def modelscope_finetune(params):
if not os.path.exists(params.output_dir):
os.makedirs(params.output_dir, exist_ok=True)
# dataset split ["train", "validation"]
ds_dict = ASRDataset.load(params.data_path, namespace='speech_asr')
kwargs = dict(
model=params.model,
data_dir=ds_dict,
dataset_type=params.dataset_type,
work_dir=params.output_dir,
batch_bins=params.batch_bins,
max_epoch=params.max_epoch,
lr=params.lr)
trainer = build_trainer(Trainers.speech_asr_trainer, default_args=kwargs)
trainer.train()
if __name__ == '__main__':
from funasr.utils.modelscope_param import modelscope_args
params = modelscope_args(model="damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch")
params.output_dir = "./checkpoint" # 模型保存路径
params.data_path = "speech_asr_aishell1_trainsets" # 数据路径,可以为modelscope中已上传数据,也可以是本地数据
params.dataset_type = "small" # 小数据量设置small,若数据量大于1000小时,请使用large
params.batch_bins = 2000 # batch size,如果dataset_type="small",batch_bins单位为fbank特征帧数,如果dataset_type="large",batch_bins单位为毫秒,
params.max_epoch = 50 # 最大训练轮数
params.lr = 0.00005 # 设置学习率
modelscope_finetune(params)
可将上述代码保存为py文件(如finetune.py),直接python finetune.py运行;若使用多卡进行训练,如下命令:
CUDA_VISIBLE_DEVICES=1,2 python -m torch.distributed.launch --nproc_per_node 2 finetune.py <strong>></strong> log.txt 2<strong>></strong>&1
- 基于私有数据集进行微调: 只需要设置本地数据存放路径即可:
params.data_path = “speech_asr_aishell1_trainsets”
私有数据集格式按如下准备:
tree ./example_data/
./example_data/
├── validation
│ ├── text
│ └── wav.scp
└── train
├── text
└── wav.scp
2 directories, 4 files
其中,text文件中存放音频标注,wav.scp文件中存放wav音频绝对路径,样例如下:
cat ./example_data/text
BAC009S0002W0122 而 对 楼 市 成 交 抑 制 作 用 最 大 的 限 购
BAC009S0002W0123 也 成 为 地 方 政 府 的 眼 中 钉
english_example_1 hello world
english_example_2 go swim 去 游 泳
cat ./example_data/wav.scp
BAC009S0002W0122 /mnt/data/wav/train/S0002/BAC009S0002W0122.wav
BAC009S0002W0123 /mnt/data/wav/train/S0002/BAC009S0002W0123.wav
english_example_1 /mnt/data/wav/train/S0002/english_example_1.wav
english_example_2 /mnt/data/wav/train/S0002/english_example_2.wav
在本地机器中开发
基于ModelScope进行微调和推理
支持基于ModelScope上数据集及私有数据集进行定制微调和推理,使用方式同Notebook中开发。
基于FunASR进行微调和推理
FunASR框架支持魔搭社区开源的工业级的语音识别模型的training & finetuning,使得研究人员和开发者可以更加便捷的进行语音识别模型的研究和生产,目前已在Github开源:https://github.com/alibaba-damo-academy/FunASR 。
FunASR框架安装
- 安装FunASR和ModelScope,详见
pip install "modelscope[audio_asr]" -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html
git clone https://github.com/alibaba/FunASR.git && cd FunASR
pip install --editable ./
基于FunASR进行推理
接下来会以私有数据集为例,介绍如何在FunASR框架中使用Paraformer-large进行推理以及微调。
cd egs_modelscope/paraformer/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch
python infer.py
基于FunASR进行微调
cd egs_modelscope/paraformer/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch
python finetune.py
多卡进行微调训练用法与notebook中相同。
Benchmark
结合大数据、大模型优化的Paraformer在一序列语音识别的benchmark上获得当前SOTA的效果,以下展示学术数据集AISHELL-1、AISHELL-2、WenetSpeech,公开评测项目SpeechIO TIOBE白盒测试场景的效果。在学术界常用的中文语音识别评测任务中,其表现远远超于目前公开发表论文中的结果,远好于单独封闭数据集上的模型。此结果为Paraformer-large模型在无VAD和标点模型下的测试结果。
AISHELL-1
AISHELL-1 test | w/o LM | w/ LM |
---|---|---|
Espnet | 4.90 | 4.70 |
Wenet | 4.61 | 4.36 |
K2 | – | 4.26 |
Blockformer | 4.29 | 4.05 |
Paraformer-large | 1.95 | 1.68 |
AISHELL-2
dev_ios | test_android | test_ios | test_mic | |
---|---|---|---|---|
Espnet | 5.40 | 6.10 | 5.70 | 6.10 |
WeNet | – | – | 5.39 | – |
Paraformer-large | 2.80 | 3.13 | 2.85 | 3.06 |
Wenetspeech
dev | test_meeting | test_net | |
---|---|---|---|
Espnet | 9.70 | 15.90 | 8.80 |
WeNet | 8.60 | 17.34 | 9.26 |
K2 | 7.76 | 13.41 | 8.71 |
Paraformer-large | 3.57 | 6.97 | 6.74 |
SpeechIO TIOBE
Paraformer-large模型结合Transformer-LM模型做shallow fusion,在公开评测项目SpeechIO TIOBE白盒测试场景上获得当前SOTA的效果,目前Transformer-LM模型已在ModelScope上开源,以下展示SpeechIO TIOBE白盒测试场景without LM、with Transformer-LM的效果:
- Decode config w/o LM:
- Decode without LM
- Beam size: 1
- Decode config w/ LM:
- Decode with Transformer-LM
- Beam size: 10
- LM weight: 0.15
testset | w/o LM | w/ LM |
---|---|---|
SPEECHIO_ASR_ZH00001 | 0.49 | 0.35 |
SPEECHIO_ASR_ZH00002 | 3.23 | 2.86 |
SPEECHIO_ASR_ZH00003 | 1.13 | 0.80 |
SPEECHIO_ASR_ZH00004 | 1.33 | 1.10 |
SPEECHIO_ASR_ZH00005 | 1.41 | 1.18 |
SPEECHIO_ASR_ZH00006 | 5.25 | 4.85 |
SPEECHIO_ASR_ZH00007 | 5.51 | 4.97 |
SPEECHIO_ASR_ZH00008 | 3.69 | 3.18 |
SPEECHIO_ASR_ZH00009 | 3.02 | 2.78 |
SPEECHIO_ASR_ZH000010 | 3.35 | 2.99 |
SPEECHIO_ASR_ZH000011 | 1.54 | 1.25 |
SPEECHIO_ASR_ZH000012 | 2.06 | 1.68 |
SPEECHIO_ASR_ZH000013 | 2.57 | 2.25 |
SPEECHIO_ASR_ZH000014 | 3.86 | 3.08 |
SPEECHIO_ASR_ZH000015 | 3.34 | 2.67 |
使用方式以及适用范围
运行范围
- 现阶段只能在Linux-x86_64运行,不支持Mac和Windows。
使用方式
- 直接推理:可以直接对输入音频进行解码,输出目标文字。
- 微调:加载训练好的模型,采用私有或者开源数据进行模型训练。
使用范围与目标场景
- 适合与离线语音识别场景,如录音文件转写,配合GPU推理效果更加,输入音频时长不限制,可以为几个小时音频。
模型局限性以及可能的偏差
考虑到特征提取流程和工具以及训练工具差异,会对CER的数据带来一定的差异(<0.1%),推理GPU环境差异导致的RTF数值差异。
相关论文以及引用信息
@inproceedings{gao2022paraformer,
title={Paraformer: Fast and Accurate Parallel Transformer for Non-autoregressive End-to-End Speech Recognition},
author={Gao, Zhifu and Zhang, Shiliang and McLoughlin, Ian and Yan, Zhijie},
booktitle={INTERSPEECH},
year={2022}
}
总结
经过多次调整,我们已经达到了比较好的效果,用来做个会议记录之类的,完全是绰绰有余。