简介

FunASR是一个基础语音识别工具包,提供多种功能,包括语音识别(ASR)、语音端点检测(VAD)、标点恢复、语言模型、说话人验证、说话人分离和多人对话语音识别等。FunASR提供了便捷的脚本和教程,支持预训练好的模型的推理与微调。

运行环境
系统         CPU 显卡 cuda 语言 角色
ubuntu 22.04 intel-4210 RTX 4000 12.4 python (3.12) server
win11 client
pytorch安装

https://pytorch.org/get-started/locally/

旧的cuda版本安装命令

https://pytorch.org/get-started/previous-versions/

pip install torch==2.7.1 torchvision==0.22.1 torchaudio==2.7.1 --index-url https://download.pytorch.org/whl/cu118

funasr安装

pip install -U funasr

下载源码

git clone https://github.com/alibaba/FunASR.git && cd FunASR
运行

进入runtime/python/websocket目录

启动server

# 改为ws

48行
parser.add_argument(
    "--certfile",
    type=str,
    # 删除证书配置
    default="",
    required=False,
    help="certfile for ssl",
)

parser.add_argument(
    "--keyfile",
    type=str,
  # 删除证书配置
    default="",
    required=False,
    help="keyfile for ssl",
)

运行 python funasr_wss_server.py启动命令

server 端口 10095

启动clinet


# 20行
# 配置serverIP
parser.add_argument(
    "--host", type=str, default="10.10.1.186", required=False, help="host ip, localhost, 0.0.0.0"
)

# 配置server 端口
parser.add_argument("--port", type=int, default=10095, required=False, help="grpc server port")


# 关闭ssl
parser.add_argument("--ssl", type=int, default=0, help="1 for ssl connect, 0 for no ssl")

运行 python funasr_wss_client.py启动命令

clinet 可以直接在windows启动,会调用系统的麦克风。

这样就可以体验下funasr的功能了

二次开发

模型接口

from funasr import AutoModel

model = AutoModel(model="paraformer-zh")

res = model.generate(input="https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/vad_example.wav")
print(res)

参数说明

  • model(str): 模型仓库 中的模型名称,或本地磁盘中的模型路径

  • device(str): cuda:0(默认gpu0),使用 GPU 进行推理,指定。如果为cpu,则使用 CPU 进行推理。mps:mac电脑M系列新品试用mps进行推理。xpu:使用英特尔gpu进行推理。

  • ncpu(int): 4 (默认),设置用于 CPU 内部操作并行性的线程数

  • output_dir(str): None (默认),如果设置,输出结果的输出路径

  • batch_size(int): 1 (默认),解码时的批处理,样本个数

  • hub(str):ms(默认),从modelscope下载模型。如果为hf,从huggingface下载模型。

  • **kwargs(dict): 所有在config.yaml中参数,均可以直接在此处指定,例如,vad模型中最大切割长度 max_single_segment_time=6000 (毫秒)

推理接口

res = model.generate(input=[str], output_dir=[str])
print(res)

参数说明

input`: 要解码的输入,可以是:

- wav文件路径, 例如: asr_example.wav
- pcm文件路径, 例如: asr_example.pcm,此时需要指定音频采样率fs(默认为16000)
- 音频字节数流

- `output_dir`: None (默认),如果设置,输出结果的输出路径
- `**kwargs`(dict): 与模型相关的推理参数,例如,`beam_size=10`,`decoding_ctc_weight=0.1`。

https://github.com/modelscope/FunASR/blob/main/docs/tutorial/README_zh.md

模型列表

模型名称 描述
asr iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch 离线
iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-online 在线
vad iic/speech_fsmn_vad_zh-cn-16k-common-pytorch 语音切分
punc iic/punc_ct-transformer_zh-cn-common-vad_realtime-vocab272727 文本断句
cam iic/speech_campplus_sv_zh-cn_16k-common 说话人确认
iic/speech_campplus_speaker-diarization_common 对话角色区分

音频配置

单声道 位宽2(16bit)采样率16000

说话人确认

# 说话人确认实现
model_cam = AutoModel(
    model="iic/speech_campplus_sv_zh-cn_16k-common",
)

speaker1_a_wav = 'https://modelscope.cn/api/v1/models/damo/speech_campplus_sv_zh-cn_16k-common/repo?Revision=master&FilePath=examples/speaker1_a_cn_16k.wav'
speaker1_b_wav = 'https://modelscope.cn/api/v1/models/damo/speech_campplus_sv_zh-cn_16k-common/repo?Revision=master&FilePath=examples/speaker1_b_cn_16k.wav'
speaker2_a_wav = 'https://modelscope.cn/api/v1/models/damo/speech_campplus_sv_zh-cn_16k-common/repo?Revision=master&FilePath=examples/speaker2_a_cn_16k.wav'

result = model_cam.generate(input = [speaker1_a_wav,speaker2_a_wav] )

# compute embedding
embedding1 = result[0]["spk_embedding"].detach().squeeze(0).cpu().numpy()
embedding2 = result[1]["spk_embedding"].detach().squeeze(0).cpu().numpy()

# compute similarity score
print('[INFO]: Computing the similarity score...')
similarity = torch.nn.CosineSimilarity(dim=-1, eps=1e-6)
scores = similarity(torch.from_numpy(embedding1).unsqueeze(0), torch.from_numpy(embedding2).unsqueeze(0)).item()
print('[INFO]: The similarity score between two input wavs is %.2f' % scores)

引用代码: https://github.com/modelscope/3D-Speaker/blob/main/speakerlab/bin/infer_sv.py

角色区分

# python版本=3.8
conda create -n 3D-Speaker python=3.8
conda activate 3D-Speaker
pip install -r requirements.txt


bash run_audio.sh
# Use the funasr model to transcribe into Chinese text.
bash run_audio.sh --stop_stage 8

# 识别结果文件
cat exp/transcripts/2speakers_example.txt 

cat exp/rttm/2speakers_example.rttm 
字段说明
SPEAKER: 类型标识符。固定为SPEAKER,表示这一行描述的是一个说话人片段。
audio_file: 文件名。对应的音频文件名(不带路径),通常是.wav或.sph文件。
1: 通道号。表示音频来自哪个声道,1 代表单声道或第一个声道。
123.45: 开始时间( onset time)。以秒为单位,表示这个说话人片段从音频开始后的第123.45秒起。
2.34: 持续时间( duration)。以秒为单位,表示这个片段持续了2.34秒。(所以这个片段的时间区间是 [123.45, 125.79] 秒)
<NA>: 字段占位符。在标准的RTTM中,这个位置通常为空或标记为<NA>。
<NA>: 字段占位符。同上。
speaker_1: 说话人ID( Speaker ID)。这是最关键的字段,用于标识这段语音属于哪个说话人。例如,spk001, male_1, 嘉宾A等。同一个人的所有片段都使用相同的ID。
<NA>: 字段占位符。同上。
<NA>: 置信度( confidence)。通常为空或<NA>,但有些工具会在这里填充一个系统判断的置信度分数(0到1之间)。

实现代码:https://github.com/modelscope/3D-Speaker/tree/main/egs/3dspeaker/speaker-diarization

问题总结:
问题一:

ModuleNotFoundError: No module named 'websockets' 或者 已经安装了websockets 启动失败:

websockets高版本需要降级,执行 pip install websockets==13.1

问题二:

启动说话人角色识别失败是启动缺少zoneinfo 依赖包

# 补充依赖包
pip install backports.zoneinfo
# 版本过低需要修改配置
vim /home/lenovo-ar/anaconda3/envs/spk-v1/lib/python3.8/site-packages/modelscope/hub/utils/utils.py
# 注释掉旧的引入
# import zoneinfo   ---第8行
# 添加
from backports.zoneinfo import ZoneInfo

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐