ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

FunASR 说话人与情感标签实战:声纹向量、匿名说话人分离与 SenseVoice 情感标签的正确读取

FunASR 说话人与情感标签实战:声纹向量、匿名说话人分离与 SenseVoice 情感标签的正确读取 FunASR 说话人与情感标签实战声纹向量、匿名说话人分离与 SenseVoice 情感标签的正确读取【免费下载链接】FunASROpen-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving.项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR本篇指南以 FunASR 官方文档《说话人与情感标签》为核心结合仓库源码CAMPPlus、ERes2NetV2、SenseVoiceSmall 模型实现、后处理工具与配套测试系统讲解声纹向量提取匿名说话人分配情感/音频事件标签四类不同输出的选择边界、本地检查点准备、可复现的独立推理程序、SenseVoice 富标签的精确读取方式以及 VAD/说话人分离/服务化部署之间的职责边界。读完本文你将能根据任务正确选择模型写出不依赖云端下载、可审计、可复现的本地推理代码并避免把展示符号误当成结构化标签或身份结论。先确定需要的结果再选择模型声纹向量、匿名聚类编号、已注册人员身份与情感标签是四类不同输出不能互相替代。它们在 FunASR 中分别由不同的模型与流水线路径提供任务路径从选定语音提取一个说话人向量CAMPPlus 或 ERes2NetV2见下方示例为转写片段分配匿名说话人ASR/VAD/说话人流水线保留转写、情感和音频事件标签SenseVoiceSmall见下方示例联合转写与匿名说话人分离第三方 OpenMOSS MOSS 指南声纹向量 ≠ 身份确认CAMPPlus 与 ERes2NetV2 返回的是spk_embeddingTensor不返回人的姓名、匹配结论或通用 ASR 的text字段。从源码可以看到CAMPPlus 的推理结果只有[{spk_embedding: self.forward(...)}]一条记录funasr/models/campplus/model.pyERes2NetV2 的输出契约同样是{spk_embedding: Tensor of shape (1, 192)}funasr/models/eres2net/model.py。因此向量本身不等于身份确认。注册、匹配、阈值校准、授权及面向目标人群的评测需要应用单独设计模型只负责把一段语音映射成一个固定维度的向量。spk0或 MOSS 的S01是录音内的匿名标签不是跨录音稳定的人员 ID。spk_embedding_center是聚类均值不表示已经完成身份注册。单条输入通常对应一行向量维度由检查点配置决定不是接口保证永远只有 192 维。本例使用batch_size1部分批处理路径会在一个字典内返回多行向量而非每个输入对应一个带key的结果。从源码结构看CAMPPlus 的embedding_size默认值为 192ERes2NetV2 同样以embedding_size192为默认但它们都是可配置的模型构造参数kwargs并不构成接口层面对维度的硬性保证因此解析结果时不应写死维度断言。准备本地检查点完成安装检查后准备包含配置、前端、适用时的 tokenizer 及权重的完整本地快照。请阅读各模型许可证记录解析后的 revision 或文件哈希、SDK 版本、实际导入模块路径与源码 commit。本指南对应文末链接的实现不保证所有旧版 wheel、导出后端或模型变体接口一致。CAMPPlusembeddingiic/speech_campplus_sv_zh-cn_16k-common。ModelScope 别名为cam。ERes2NetV2embeddingiic/speech_eres2netv2_sv_zh-cn_16k-common。SenseVoicesensevoiceiic/SenseVoiceSmall。需要注意两个边界embedding和sensevoice选项只属于下方示例程序不是新增的 FunASR 模型别名或 CLI 子命令。不要把 ASR 检查点传给embedding也不要将 ERes2NetV2 的行为推广到所有 ERes2Net 变体。其他模型请查看 Model Zoo。音频使用非空、单声道、16 kHz WAV。程序读取归一化float32波形拒绝立体声、空音频或其他采样率不隐式转换。提取声纹时使用选定的单人有效语音混合说话人、静音或极短片段不能提供可靠身份依据。下方校验仅检查格式不是语音质量检测器。模型注册与参数解析的源码佐证三个模型均通过tables.register(model_classes, ...)注册到 FunASR 的模型表中funasr/models/campplus/model.py、funasr/models/eres2net/model.py、funasr/models/sense_voice/model.py因此AutoModel(model...)可以按检查点目录或 ModelScope ID 自动解析出正确的模型类。SenseVoice 的推理参数在 funasr/models/sense_voice/model.py 中解析language默认autouse_itn默认Falseoutput_timestamp默认False并通过self.lid_dict{auto: 0, zh: 3, en: 4, yue: 7, ja: 11, ko: 12, nospeech: 13}与self.textnorm_dict{withitn: 14, woitn: 15}构造语言与文本规范化提示。保存结果并保留原始标签独立程序接收task、model_dir、audio和新的 JSON 输出路径。例如在脚本名后传入embedding /models/campplus speaker.wav vector.json或sensevoice /models/sensevoice utterance.wav tags.json。两个模式都在CPU 上处理完整片段不添加 VAD、标点、配套说话人模型或流式缓存程序内部不下载模型。import argparse import json import os from pathlib import Path import soundfile as sf from funasr import AutoModel from funasr.utils.postprocess_utils import rich_transcription_postprocess def embedding_record(results): if not results: raise ValueError(No result from the speaker model) if len(results) ! 1: raise ValueError(Expected one speaker result for one input) vector results[0][spk_embedding] if vector.ndim ! 2 or vector.shape[0] ! 1 or vector.shape[1] 0: raise ValueError(Expected a nonempty single-row speaker embedding) return {spk_embedding: vector.detach().cpu().tolist()} def tagged_records(results): if not results: raise ValueError(No result from SenseVoice) records [] for item in results: raw item[text] if not isinstance(raw, str): raise ValueError(Expected SenseVoice text with its original tags) records.append({ key: item.get(key), raw_tagged_text: raw, display_text: rich_transcription_postprocess(raw), }) return records def write_result(path, record): payload json.dumps(record, ensure_asciiFalse, allow_nanFalse, indent2) fd os.open(path, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o600) with os.fdopen(fd, w, encodingutf-8) as stream: stream.write(payload \n) parser argparse.ArgumentParser() parser.add_argument(task, choices[embedding, sensevoice]) parser.add_argument(model_dir) parser.add_argument(audio) parser.add_argument(output) args parser.parse_args() model_dir Path(args.model_dir).expanduser().resolve(strictTrue) if not model_dir.is_dir(): raise ValueError(Expected a complete local model directory) speech, sample_rate sf.read(args.audio, dtypefloat32) if sample_rate ! 16000 or speech.ndim ! 1 or len(speech) 0: raise ValueError(Expected nonempty mono 16 kHz audio) model AutoModel( modelstr(model_dir), devicecpu, ncpu1, disable_updateTrue, trust_remote_codeFalse, vad_modelNone, punc_modelNone, spk_modelNone, ) if args.task embedding: results model.generate(inputspeech, fssample_rate, batch_size1) result embedding_record(results) else: results model.generate( inputspeech, fssample_rate, batch_size1, languageauto, use_itnTrue, output_timestampFalse, ) result tagged_records(results) write_result(args.output, { task: args.task, model_dir: str(model_dir), sample_rate: sample_rate, result: result, })逐行拆解为什么这样写才安全AutoModel构造参数devicecpu与ncpu1明确限制推理线程disable_updateTrue跳过启动时的版本检查trust_remote_codeFalse拒绝执行远端自定义代码vad_modelNone, punc_modelNone, spk_modelNone显式关闭配套模型保证独立声纹/情感推理不掺入 VAD 或说话人分离逻辑。这些参数与 funasr/auto/auto_model.py 中的构造签名一致ncpu默认 4这里显式设为 1 保证可复现。外层 JSON、raw_tagged_text和display_text是示例应用创建的字段不是 SDK 新增返回字段。SDK 的 SenseVoice 结果只承诺result[text]携带原始带标签字符串。向量先显式detach、移到 CPU再转换为嵌套列表allow_nanFalse保证非有限数值会在创建文件前被拒绝对应测试 tests/test_speaker_emotion_docs.py 中对[[float(nan)]]的拒绝断言。程序不会覆盖已有输出os.O_CREAT | os.O_EXCL组合保证目标文件不存在才创建已存在则抛FileExistsError对应测试 tests/test_speaker_emotion_docs.py。POSIX 上以仅所有者可访问的模式0o600创建文件对应测试 tests/test_speaker_emotion_docs.py仍需配置目录权限及对应平台 ACL。声纹向量和转写可能涉及敏感信息应按需保留不要公开私人音频或结果。正确读取 SenseVoice 标签原始带标签字符串通常在result[text]不能假设存在raw_text、emotion或emotion_score。标签区分大小写例如|zh|、|HAPPY|、|Speech|、|withitn|是否出现及其含义取决于检查点。展示映射表不保证所有模型都会输出其中全部标签。rich_transcription_postprocess是有损展示函数在 funasr/utils/postprocess_utils.py 中可以看到它的真实行为删除标签|lang|、情感、事件、|withitn|/|woitn|等按出现次数选择展示情感format_str_v2内部统计各情感标签计数并取出现次数最多者funasr/utils/postprocess_utils.py合并重复展示标记连续相同的事件 emoji、相同的展示情感会被去重还会做文本替换如The.替换为空格。因此它不是结构化标签解析器或概率计算器必须先保留原文示例中的raw_tagged_text。情感与事件的 emoji 映射定义在 funasr/utils/postprocess_utils.py 的emo_dict、event_dict、lang_dict与emoji_dict中例如|HAPPY| → 、|Applause| → 、|zh| → |lang|。不要从展示符号或模型标签推导置信概率、真实心理状态或诊断结论。静音、短片段和噪声音频不能提供可靠情感依据。emotion2vec是另一类模型及接口不是 SenseVoice 标签的别名。生成参数的语义澄清本例显式选择languageauto、use_itnTrue、output_timestampFalse并非这些参数都必填SenseVoice 语言提示使用auto/zh/en/yue/ja/ko与源码lid_dict的键一一对应funasr/models/sense_voice/model.py。use_itn控制逆文本规范化ITN不是情感识别开关显式text_norm的优先级更高——从 funasr/models/sense_voice/model.py 看text_norm非None时直接采用它否则才回退到use_itn决定withitn/woitn。每次调用重复传入需要固定的选项不要依赖上一次调用的状态。本例是完整片段推理不是 KWS 的 EOS 协议或实时情绪监控。测试 tests/test_speaker_emotion_docs.py 验证了原始标签经过真实的有损展示处理后被完整保留输入|zh||HAPPY||Speech||withitn|你好输出raw_tagged_text原样保留、display_text为你好且调用参数确实携带languageauto、use_itnTrue、output_timestampFalse。VAD、说话人分离与服务边界独立推理不需要 VAD独立声纹提取和短片段 SenseVoice 推理不要求 VAD。通用 AutoModel 说话人聚类则位于 VAD 流水线中只设置spk_model或return_spk_resTrue不会给直接推理增加说话人分离。VAD 边界不保证对应说话人切换长音频分段也会改变情感标签所依据的上下文。组合兼容的 ASR/VAD/标点/说话人模型时遵循独立的 SDK 流水线。关于返回结构的三个细节sentence_info[].spk是匿名编号SDKstart/end单位为毫秒NumPy 聚类中心数组也需要像 Tensor 一样显式序列化匿名编号不等于已识别的身份。MOSS 联合转写与分离第三方 OpenMOSS MOSS-Transcribe-Diarize 有自己的联合转写与分离路径不需要外部vad_model或spk_model。后端、显存和返回格式复用现有 MOSS 指南不要叠加第二套聚类或宣称已识别已知人员身份。HTTP 服务与导出后端的差异当前内置 HTTP 转写服务 的 SenseVoice 配置附带 VADfallback 会剥离顶层及分段文本中的富标签不会补建情感分数字段。其spktrue属于服务自己的流水线HTTP 分段start/end单位为秒与 SDK 的毫秒不同。把此 SDK 示例换成/v1/audio/transcriptions不代表仍能读取同样的标签或使用同样的参数。请查阅部署矩阵不要假设 vLLM、llama.cpp、ONNX 或 WebSocket 导出路径都保留 Python 返回内容。源码与验证本指南的契约来源与可验证依据契约来源CAMPPlus、ERes2NetV2、SenseVoice、后处理、AutoModel 与 HTTP 适配funasr/bin/_server_app.py。指南测试 使用记录调用的 SDK 替身和真实展示函数执行公开程序验证字段保留、序列化detach → cpu → tolist、格式校验与错误输入空结果、立体声/非 16 kHz/空音频、非法 embedding、非字符串text、已存在输出文件均被拒绝。该测试不代表声学质量、身份匹配、不同人群表现或情感准确率评测仅保证示例程序按文档契约运行。小结四条边界一条主线任务边界声纹向量、匿名说话人编号、已注册身份、情感标签是四类输出先定任务再选模型。数据边界非空单声道 16 kHz WAV单人有效语音才适合提取声纹原始带标签文本必须先于展示函数保留。语义边界use_itn管数字规范化、不管情感rich_transcription_postprocess是有损展示不产出概率匿名标签不等于人员 ID。部署边界独立推理不带 VAD/说话人服务化、导出后端的字段与单位秒 vs 毫秒以各自的文档为准。按这条主线走就能在 FunASR 中用最少的配套组件稳定地完成说话人向量 情感/事件标签两类结构化输出的本地化、可复现提取。【免费下载链接】FunASROpen-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving.项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表