funasr 项目整理
FunASR是一个功能丰富的语音识别工具包,支持ASR、VAD、标点恢复、语言模型等多种功能。它提供预训练模型和微调支持,可在Ubuntu系统上运行(需Python 3.12、PyTorch 2.7.1等环境)。安装包括PyTorch和FunASR包,通过GitHub下载源码后,可在websocket目录下启动服务端和客户端进行功能体验。常见问题如websockets版本冲突,可通过降级到13.1
简介
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
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐

所有评论(0)