(简体中文|英语|日本语)
SenseVoice是一个语音基础模型,具有多种语音理解能力,包括自动语音识别(ASR)、口语识别(LID)、语音情感识别(SER)和音频事件检测(AED)。
模型动物园:modelscope、huggingface
在线演示:modelscope 演示、huggingface space
SenseVoice专注于高精度多语言语音识别、语音情感识别和音频事件检测。
我们在开源基准数据集(包括 AISHELL-1、AISHELL-2、Wenetspeech、LibriSpeech 和 Common Voice)上比较了 SenseVoice 和 Whisper 的多语言语音识别性能。在中文和粤语识别方面,SenseVoice-Small模型具有优势。
由于目前缺乏广泛使用的语音情感识别基准和方法,我们在多个测试集上对各种指标进行了评估,并与近期基准的大量结果进行了全面比较。所选测试集包含中英文数据,并包含表演、电影、自然对话等多种风格。在无需对目标数据进行微调的情况下,SenseVoice 能够达到并超越当前最佳语音情感识别模型的性能。
此外,我们在测试集上对比了多个开源语音情感识别模型,结果表明,SenseVoice-Large模型在几乎所有数据集上都取得了最好的性能,而SenseVoice-Small模型也超越了其他开源模型大多数数据集。
尽管专门针对语音数据进行训练,SenseVoice 仍然可以用作独立的事件检测模型。我们将其在环境声音分类 ESC-50 数据集上的性能与广泛使用的行业模型 BEATS 和 PANN 进行了比较。 SenseVoice 模型在这些任务上取得了值得称赞的结果。然而,由于训练数据和方法的限制,其事件分类性能与专门的 AED 模型相比存在一些差距。
SenseVoice-Small 模型部署非自回归端到端架构,从而实现极低的推理延迟。由于参数数量与 Whisper-Small 模型相似,其推断速度比 Whisper-Small 快 5 倍以上,比 Whisper-Large 快 15 倍。
pip install -r requirements.txt
支持任何格式和任何持续时间的音频输入。
from funasr import AutoModel
from funasr . utils . postprocess_utils import rich_transcription_postprocess
model_dir = "iic/SenseVoiceSmall"
model = AutoModel (
model = model_dir ,
trust_remote_code = True ,
remote_code = "./model.py" ,
vad_model = "fsmn-vad" ,
vad_kwargs = { "max_single_segment_time" : 30000 },
device = "cuda:0" ,
)
# en
res = model . generate (
input = f" { model . model_path } /example/en.mp3" ,
cache = {},
language = "auto" , # "zh", "en", "yue", "ja", "ko", "nospeech"
use_itn = True ,
batch_size_s = 60 ,
merge_vad = True , #
merge_length_s = 15 ,
)
text = rich_transcription_postprocess ( res [ 0 ][ "text" ])
print ( text )
model_dir
:模型的名称,或者模型在本地磁盘上的路径。trust_remote_code
:True
时,意味着模型的代码实现是从remote_code
加载的,它指定model
代码的确切位置(例如,当前目录中的model.py
)。它支持绝对路径、相对路径和网络 URL。False
时,表示模型的代码实现是 FunASR 内的集成版本。此时,对当前目录下的model.py
所做的修改将不会生效,因为加载的版本是FunASR内部的版本。型号代码请点击此处查看。vad_model
:这表示VAD(语音活动检测)的激活。 VAD 的目的是将长音频分割成较短的剪辑。在这种情况下,推理时间包括VAD和SenseVoice的总消耗,并代表端到端延迟。如果您想单独测试SenseVoice模型的推理时间,可以禁用VAD模型。vad_kwargs
:指定VAD模型的配置。 max_single_segment_time
:表示vad_model
进行音频分段的最大时长,单位为毫秒(ms)。use_itn
:输出结果是否包含标点符号和反文本标准化。batch_size_s
:指示使用动态批处理,其中批处理中音频的总持续时间以秒 (s) 为单位。merge_vad
:是否合并VAD模型分割的短音频片段,合并长度为merge_length_s
,单位为秒(s)。ban_emo_unk
:是否禁止emo_unk
代币的输出。如果所有输入都是短音频(<30s),需要批量推理来加快推理效率,可以去掉VAD模型,并相应设置batch_size
。
model = AutoModel ( model = model_dir , trust_remote_code = True , device = "cuda:0" )
res = model . generate (
input = f" { model . model_path } /example/en.mp3" ,
cache = {},
language = "zh" , # "zh", "en", "yue", "ja", "ko", "nospeech"
use_itn = False ,
batch_size = 64 ,
)
更多使用请参考文档
支持任意格式的音频输入,输入时长限制为30秒或更短。
from model import SenseVoiceSmall
from funasr . utils . postprocess_utils import rich_transcription_postprocess
model_dir = "iic/SenseVoiceSmall"
m , kwargs = SenseVoiceSmall . from_pretrained ( model = model_dir , device = "cuda:0" )
m . eval ()
res = m . inference (
data_in = f" { kwargs [ 'model_path' ] } /example/en.mp3" ,
language = "auto" , # "zh", "en", "yue", "ja", "ko", "nospeech"
use_itn = False ,
ban_emo_unk = False ,
** kwargs ,
)
text = rich_transcription_postprocess ( res [ 0 ][ 0 ][ "text" ])
print ( text )
# pip3 install -U funasr funasr-onnx
from pathlib import Path
from funasr_onnx import SenseVoiceSmall
from funasr_onnx . utils . postprocess_utils import rich_transcription_postprocess
model_dir = "iic/SenseVoiceSmall"
model = SenseVoiceSmall ( model_dir , batch_size = 10 , quantize = True )
# inference
wav_or_scp = [ "{}/.cache/modelscope/hub/{}/example/en.mp3" . format ( Path . home (), model_dir )]
res = model ( wav_or_scp , language = "auto" , use_itn = True )
print ([ rich_transcription_postprocess ( i ) for i in res ])
注意:ONNX 模型导出到原始模型目录。
from pathlib import Path
from funasr_torch import SenseVoiceSmall
from funasr_torch . utils . postprocess_utils import rich_transcription_postprocess
model_dir = "iic/SenseVoiceSmall"
model = SenseVoiceSmall ( model_dir , batch_size = 10 , device = "cuda:0" )
wav_or_scp = [ "{}/.cache/modelscope/hub/{}/example/en.mp3" . format ( Path . home (), model_dir )]
res = model ( wav_or_scp , language = "auto" , use_itn = True )
print ([ rich_transcription_postprocess ( i ) for i in res ])
注意:Libtorch 模型导出到原模型目录。
export SENSEVOICE_DEVICE=cuda:0
fastapi run --port 50000
git clone https://github.com/alibaba/FunASR.git && cd FunASR
pip3 install -e ./
数据举例
{"key": "YOU0000008470_S0000238_punc_itn", "text_language": "<|en|>", "emo_target": "<|NEUTRAL|>", "event_target": "<|Speech|>", "with_or_wo_itn": "<|withitn|>", "target": "Including legal due diligence, subscription agreement, negotiation.", "source": "/cpfs01/shared/Group-speech/beinian.lzr/data/industrial_data/english_all/audio/YOU0000008470_S0000238.wav", "target_len": 7, "source_len": 140}
{"key": "AUD0000001556_S0007580", "text_language": "<|en|>", "emo_target": "<|NEUTRAL|>", "event_target": "<|Speech|>", "with_or_wo_itn": "<|woitn|>", "target": "there is a tendency to identify the self or take interest in what one has got used to", "source": "/cpfs01/shared/Group-speech/beinian.lzr/data/industrial_data/english_all/audio/AUD0000001556_S0007580.wav", "target_len": 18, "source_len": 360}
完整参考data/train_example.jsonl
描述:
key
: 音频文件唯一IDsource
:音频文件路径source_len
:音频文件的fbank帧数target
:转录target_len
:目标长度text_language
:音频文件的语言idemo_target
:音频文件的情感标签event_target
:音频文件的事件标签with_or_wo_itn
:是否包含标点符号和反文本规范化train_text.txt
BAC009S0764W0121 甚至出现交易几乎停滞的情况
BAC009S0916W0489 湖北一公司以员工名义贷款数十员工负债千万
asr_example_cn_en 所有只要处理 data 不管你是做 machine learning 做 deep learning 做 data analytics 做 data science 也好 scientist 也好通通都要都做的基本功啊那 again 先先对有一些>也许对
ID0012W0014 he tried to think how it could be
train_wav.scp
BAC009S0764W0121 https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/BAC009S0764W0121.wav
BAC009S0916W0489 https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/BAC009S0916W0489.wav
asr_example_cn_en https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_example_cn_en.wav
ID0012W0014 https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_example_en.wav
train_text_language.txt
语言 ID 包括<|zh|>
、 <|en|>
、 <|yue|>
、 <|ja|>
和<|ko|>
。
BAC009S0764W0121 < | zh | >
BAC009S0916W0489 < | zh | >
asr_example_cn_en < | zh | >
ID0012W0014 < | en | >
train_emo.txt
情绪标签包括<|HAPPY|>
、 <|SAD|>
、 <|ANGRY|>
、 <|NEUTRAL|>
、 <|FEARFUL|>
、 <|DISGUSTED|>
和<|SURPRISED|>
。
BAC009S0764W0121 < | NEUTRAL | >
BAC009S0916W0489 < | NEUTRAL | >
asr_example_cn_en < | NEUTRAL | >
ID0012W0014 < | NEUTRAL | >
train_event.txt
事件标签包括<|BGM|>
、 <|Speech|>
、 <|Applause|>
、 <|Laughter|>
、 <|Cry|>
、 <|Sneeze|>
、 <|Breath|>
和<|Cough|>
.
BAC009S0764W0121 < | Speech | >
BAC009S0916W0489 < | Speech | >
asr_example_cn_en < | Speech | >
ID0012W0014 < | Speech | >
Command
# generate train.jsonl and val.jsonl from wav.scp, text.txt, text_language.txt, emo_target.txt, event_target.txt
sensevoice2jsonl
++scp_file_list= ' ["../../../data/list/train_wav.scp", "../../../data/list/train_text.txt", "../../../data/list/train_text_language.txt", "../../../data/list/train_emo.txt", "../../../data/list/train_event.txt"] '
++data_type_list= ' ["source", "target", "text_language", "emo_target", "event_target"] '
++jsonl_file_out= " ../../../data/list/train.jsonl "
如果没有train_text_language.txt
、 train_emo_target.txt
和train_event_target.txt
,将使用SenseVoice
模型自动预测语言、情感和事件标签。
# generate train.jsonl and val.jsonl from wav.scp and text.txt
sensevoice2jsonl
++scp_file_list= ' ["../../../data/list/train_wav.scp", "../../../data/list/train_text.txt"] '
++data_type_list= ' ["source", "target"] '
++jsonl_file_out= " ../../../data/list/train.jsonl "
++model_dir= ' iic/SenseVoiceSmall '
确保将finetune.sh中的train_tool修改为之前设置的FunASR安装目录中funasr/bin/train_ds.py
的绝对路径。
bash finetune.sh
python webui.py
如果您在使用中遇到问题,可以直接在github页面提出Issue。
您也可以扫描以下钉钉群二维码加入社区群进行交流和讨论。
有趣的ASR |
---|