Paraformer分角色语音识别-中文-通用

我要开发同款
匿名用户2024年07月31日
150阅读
开发技术Non-autoregressive、pytorch
所属分类ai、Speaker、Alibaba、Paraformer、FunASR、CER、audio
开源地址https://modelscope.cn/models/iic/speech_paraformer-large-vad-punc-spk_asr_nat-zh-cn
授权协议Apache License 2.0

作品详情

Highlights

  • Paraformer-large长音频说话人模型在普通长音频版基础上集成了CAM++说话人聚类分类功能,返回的结果中添加了句子级别的说话人分类结果。
  • Paraformer-large长音频模型
  • CAM++模型

FunASR开源项目介绍

FunASR希望在语音识别的学术研究和工业应用之间架起一座桥梁。通过发布工业级语音识别模型的训练和微调,研究人员和开发人员可以更方便地进行语音识别模型的研究和生产,并推动语音识别生态的发展。让语音识别更有趣!

github仓库 | 最新动态 | 环境安装 | 服务部署 | 模型库 | 联系我们

模型原理介绍

Paraformer是达摩院语音团队提出的一种高效的非自回归端到端语音识别框架。本项目应用户的要求在Paraformer-长音频版识别中集成了达摩院自研的CAM++系列说话人聚类与分类模型,结合长音频版的VAD、时间戳与标点预测功能,能够为识别结果中的每一个子句进行准确的说话人分类。

Paraformer模型结构

Paraformer模型结构如上图所示,由 Encoder、Predictor、Sampler、Decoder 与 Loss function 五部分组成。

CAM++说话人确认流程

本项目中集成的说话人技术是达摩院最新的自研说话人技术。包括基于FSMN-VAD的语音活动端点检测模型、CAM++说话人识别模型和结合谱图和基于流行拓扑降维的聚类算法。 其中CAM++是兼具准确识别和高效计算的说话人识别模型,其通过多种类型池化操作提取不同尺度的上下文信息,生成的上下文相关掩蔽(Context-aware Mask,CAM)模块可以提取关键的说话人信息。实验表明CAM++相比于主流的说话人模型ECAPA-TDNN和ResNet34有着更高的准确率和更快推理速度。

另外聚类算法对于确定说话人人数至关重要。谱聚类(Spectral clustering)是一种基于图概念的聚类算法,被广泛用于说话人日志领域,在说话人数较少的短音频下表现突出。基于流行拓扑降维的聚类(UMAP-HDBSCAN)可以将说话人特征降维到区分度最大的低维空间中,过滤掉冗余信息的干扰,更适合人数较多的长音频场景。本模型结合这两种聚类方法在不同场景下可以更加精准地别说话人的特征分布。

其核心点主要有:

  • CAM++相关speaker模块:更精确的聚类分类,更高的准确率和更快的推理速度。
  • Predictor 模块:基于 Continuous integrate-and-fire (CIF) 的 预测器 (Predictor) 来抽取目标文字对应的声学特征向量,可以更加准确的预测语音中目标文字个数。
  • Sampler:通过采样,将声学特征向量与目标文字向量变换成含有语义信息的特征向量,配合双向的 Decoder 来增强模型对于上下文的建模能力。

更详细的细节见:

基于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/testaudio/asrexample_zh.wav
  • wav二进制数据,格式bytes,例如:用户直接从文件里读出bytes数据或者是麦克风录出bytes数据。
  • 已解析的audio音频,例如:audio, rate = soundfile.read("asrexamplezh.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

if __name__ == '__main__':
    audio_in = 'https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_speaker_demo.wav'
    output_dir = "./results"
    inference_pipeline = pipeline(
        task=Tasks.auto_speech_recognition,
        model='iic/speech_paraformer-large-vad-punc-spk_asr_nat-zh-cn',
        model_revision='v2.0.4',
        vad_model='iic/speech_fsmn_vad_zh-cn-16k-common-pytorch', vad_model_revision="v2.0.4",
        punc_model='iic/punc_ct-transformer_cn-en-common-vocab471067-large', punc_model_revision="v2.0.4",
        output_dir=output_dir,
    )
    rec_result = inference_pipeline(audio_in, batch_size_s=300, batch_size_token_threshold_s=40)
    print(rec_result)
  • 输入音频为wav格式,api调用方式可参考如下范例:
rec_result = inference_pipeline('asr_speaker_demo.wav')
  • 若输入格式为文件wav.scp(注:文件名需要以.scp结尾),可添加 output_dir 参数将识别结果写入文件中,api调用方式可参考如下范例:
inference_pipeline("wav.scp", output_dir='./output_dir')

识别结果输出路径结构如下:

tree output_dir/
output_dir/
└── 1best_recog
    ├── score
    ├── text
    └── time_stamp

1 directory, 4 files

基于FunASR进行推理

下面为快速上手教程,测试音频(中文英文

可执行命令行

在命令行终端执行:

funasr +model=paraformer-zh +vad_model="fsmn-vad" +punc_model="ct-punc" +input=vad_example.wav

注:支持单条音频文件识别,也支持文件列表,列表为kaldi风格wav.scp:wav_id wav_path

python示例

非实时语音识别

from funasr import AutoModel
# paraformer-zh is a multi-functional asr model
# use vad, punc, spk or not as you need
model = AutoModel(model="paraformer-zh", model_revision="v2.0.4",
                  vad_model="fsmn-vad", vad_model_revision="v2.0.4",
                  punc_model="ct-punc-c", punc_model_revision="v2.0.4",
                  # spk_model="cam++", spk_model_revision="v2.0.2",
                  )
res = model.generate(input=f"{model.model_path}/example/asr_example.wav", 
            batch_size_s=300, 
            hotword='魔搭')
print(res)

注:model_hub:表示模型仓库,ms为选择modelscope下载,hf为选择huggingface下载。

实时语音识别

from funasr import AutoModel

chunk_size = [0, 10, 5] #[0, 10, 5] 600ms, [0, 8, 4] 480ms
encoder_chunk_look_back = 4 #number of chunks to lookback for encoder self-attention
decoder_chunk_look_back = 1 #number of encoder chunks to lookback for decoder cross-attention

model = AutoModel(model="paraformer-zh-streaming", model_revision="v2.0.4")

import soundfile
import os

wav_file = os.path.join(model.model_path, "example/asr_example.wav")
speech, sample_rate = soundfile.read(wav_file)
chunk_stride = chunk_size[1] * 960 # 600ms

cache = {}
total_chunk_num = int(len((speech)-1)/chunk_stride+1)
for i in range(total_chunk_num):
    speech_chunk = speech[i*chunk_stride:(i+1)*chunk_stride]
    is_final = i == total_chunk_num - 1
    res = model.generate(input=speech_chunk, cache=cache, is_final=is_final, chunk_size=chunk_size, encoder_chunk_look_back=encoder_chunk_look_back, decoder_chunk_look_back=decoder_chunk_look_back)
    print(res)

注:chunk_size为流式延时配置,[0,10,5]表示上屏实时出字粒度为10*60=600ms,未来信息为5*60=300ms。每次推理输入为600ms(采样点数为16000*0.6=960),输出为对应文字,最后一个语音片段输入需要设置is_final=True来强制输出最后一个字。

语音端点检测(非实时)

from funasr import AutoModel

model = AutoModel(model="fsmn-vad", model_revision="v2.0.4")

wav_file = f"{model.model_path}/example/asr_example.wav"
res = model.generate(input=wav_file)
print(res)

语音端点检测(实时)

from funasr import AutoModel

chunk_size = 200 # ms
model = AutoModel(model="fsmn-vad", model_revision="v2.0.4")

import soundfile

wav_file = f"{model.model_path}/example/vad_example.wav"
speech, sample_rate = soundfile.read(wav_file)
chunk_stride = int(chunk_size * sample_rate / 1000)

cache = {}
total_chunk_num = int(len((speech)-1)/chunk_stride+1)
for i in range(total_chunk_num):
    speech_chunk = speech[i*chunk_stride:(i+1)*chunk_stride]
    is_final = i == total_chunk_num - 1
    res = model.generate(input=speech_chunk, cache=cache, is_final=is_final, chunk_size=chunk_size)
    if len(res[0]["value"]):
        print(res)

标点恢复

from funasr import AutoModel

model = AutoModel(model="ct-punc", model_revision="v2.0.4")

res = model.generate(input="那今天的会就到这里吧 happy new year 明年见")
print(res)

时间戳预测

from funasr import AutoModel

model = AutoModel(model="fa-zh", model_revision="v2.0.4")

wav_file = f"{model.model_path}/example/asr_example.wav"
text_file = f"{model.model_path}/example/text.txt"
res = model.generate(input=(wav_file, text_file), data_type=("sound", "text"))
print(res)

更多详细用法(示例

微调

详细用法(示例

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
SPEECHIOASRZH00001
0.49
0.35
SPEECHIOASRZH00002
3.23
2.86
SPEECHIOASRZH00003
1.13
0.80
SPEECHIOASRZH00004
1.33
1.10
SPEECHIOASRZH00005
1.41
1.18
SPEECHIOASRZH00006
5.25
4.85
SPEECHIOASRZH00007
5.51
4.97
SPEECHIOASRZH00008
3.69
3.18
SPEECHIOASRZH00009
3.02
2.78
SPEECHIOASRZH000010
3.35
2.99
SPEECHIOASRZH000011
1.54
1.25
SPEECHIOASRZH000012
2.06
1.68
SPEECHIOASRZH000013
2.57
2.25
SPEECHIOASRZH000014
3.86
3.08
SPEECHIOASRZH000015
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}
}
声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论