基于SenseVoice-Small与FSMN-VAD,将WAV/MP3/M4A/FLAC等音频转录为带时间戳文本,支持单文件及批量处理,采用VAD锚定分段...
感应变换语言: 调制音符, 使用 FunASR 的 iic/ 感应变小 模式, 使用 fsmn-vad 进行时间变调主播.
功能概述
感应变换语言: 调制音符, 使用 FunASR 的 iic/ 感应变小 模式, 使用 fsmn-vad 进行时间变调主播.是一项面向实际任务的技能,主要用于Pipeline.;FMSN- VAD 的音频分集到语音区域( )。
核心要点
- 它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
- 使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。
- 该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。
使用与执行
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
结果检查与注意事项
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
SenseVoice 转录
使用 FunASR 的 iic/SenseVoiceSmall 模型对音频进行转录,输出带时间戳的文本;时间戳锚定采用 fsmn-vad 语音活动检测(VAD)模型。
处理流程
- FSMN-VAD 将音频切分为语音片段(例如:30 分钟音频约生成 258 个片段)
- SenseVoice-Small 对整段音频执行转录,启用
merge_vad=True - 原始文本按
<|zh|>标签分割 → 经rich_transcription_postprocess()清洗 - 文本片段按比例映射至 VAD 时间戳
- 输出格式为每行一条
[HH:MM:SS] text,时间粒度约为 15 秒
运行环境
Venv: ~/.openclaw/venvs/sensevoice/ Python: 3.12 关键依赖包: funasr==1.3.1, modelscope, onnxruntime 模型缓存路径: ~/.cache/modelscope/hub/models/iic/SenseVoiceSmall VAD 模型缓存路径: ~/.cache/modelscope/hub/models/iic/speech_fsmn_vad_zh-cn-16k-common-pytorch
首次配置
python3 -m venv ~/.openclaw/venvs/sensevoice source ~/.openclaw/venvs/sensevoice/bin/activate pip install funasr modelscope onnxruntime # 模型将在首次运行时自动下载(SenseVoice 约 234MB + VAD 约 4MB)
使用方法
单文件转录
source ~/.openclaw/venvs/sensevoice/bin/activate python3 -c " from funasr import AutoModel from funasr.utils.postprocess_utils import rich_transcription_postprocess from datetime import datetime, timedelta import re wav = '' # 从文件名解析起始时间:TX01_MIC015_20260308_124130_orig.wav m = re.search(r'(\d{8})_(\d{6})', wav) start_dt = datetime.strptime(m.group(1)+m.group(2), '%Y%m%d%H%M%S') if m else None vad_model = AutoModel(model='fsmn-vad', disable_update=True) model = AutoModel(model='iic/SenseVoiceSmall', vad_model='fsmn-vad', vad_kwargs={'max_single_segment_time': 30000}, device='cpu') vad_segs = vad_model.generate(input=wav)[0].get('value', []) res = model.generate(input=wav, cache={}, language='zh', use_itn=True, batch_size_s=60, merge_vad=True) texts = [rich_transcription_postprocess(s).strip() for s in re.split(r'<|zh|>', res[0]['text']) if s.strip()] texts = [s for s in texts if len(s) > 1] ratio = len(vad_segs) / len(texts) if texts else 1 for i, t in enumerate(texts): vi = min(int(i * ratio), len(vad_segs)-1) ts = (start_dt + timedelta(milliseconds=vad_segs[vi][0])).strftime('%H:%M:%S') if start_dt else f'{vad_segs[vi][0]//1000:.0f}s' print(f'[{ts}] {t}') "
批量模式(daylog)
配套脚本 scripts/batch_transcribe.py 实现完整的 daylog 转录流水线:
source ~/.openclaw/venvs/sensevoice/bin/activate cd ~/Documents/dec/daylog # 预演模式 — 查看将被转录的文件列表 python3 scripts/batch_transcribe.py --dry-run # 转录所有新增文件 python3 scripts/batch_transcribe.py # 强制重转指定日期(先删除已有结果,再重新运行) python3 scripts/batch_transcribe.py --force-dates 2026-03-07,2026-03-08 # 启用进度文件 + Discord Webhook 通知 python3 scripts/batch_transcribe.py --progress-file /tmp/daylog-progress.json --discord-webhook https://discord.com/api/webhooks/...
命令行参数说明:
| 参数 | 说明 |
|---|---|
--dry-run |
仅预览,不写入任何输出 |
--engine sensevoice|whisper |
指定转录引擎(默认为 sensevoice) |
--force-dates YYYY-MM-DD,... |
删除并重新转录指定日期的所有文件 |
--progress-file PATH |
将 JSON 格式进度信息写入指定路径,便于监控 |
--discord-webhook URL |
向 Discord 发送任务启动、里程碑及完成通知 |
目录结构:
daylog/
├── raw/ # WAV 输入源(DJI MIC 3,48kHz/32bit,约 247MB/30min)
│ ├── TX01_MIC009_20260308_094129_orig.wav
│ └── ...
├── transcripts/ # 输出目录,按日期分组
│ └── 2026-03-08/
│ ├── 000_TX01_MIC009_20260308_094129_orig.txt
│ └── ...
└── notes/ # 汇总后的每日笔记(独立步骤生成)
└── 2026-03-08.md
行为说明:
- 根据文件名中的日期(
YYYYMMDD)对 WAV 文件分组 - 在每个日期内按时间戳排序,确保严格的时间顺序
- 跳过已转录的文件,除非显式指定
--force-dates - 输出文件名添加序号前缀(
000_、001_…),保障字典序即时间序 - 每完成 25% 进度向 Discord 发送一次里程碑通知
输出格式示例
[录音开始: 09:41:29] [09:41:35] 到了,我们下车吧。 [09:41:48] 武康大楼,人好多啊。 [09:42:04] 你帮我在这里拍一张。 ...
性能表现(Apple M4,10 核 CPU)
| 指标 | 数值 |
|---|---|
| RTF(实时因子) | ~0.04(25 倍实时速度) |
| CPU 占用 | ~1.2 核(12%) |
| 内存占用 | ~1.5GB |
| 30 分钟 WAV 处理耗时 | ~73 秒(转录)+ ~4 秒(VAD) |
| 关键词准确率 | 92%(Whisper-medium 为 23%,turbo 为 38%) |
| 幻觉内容(hallucinations) | 0(Whisper 每次会话数百条) |
| 模型体积 | 234MB(Whisper-large-v3-turbo 为 1.5GB) |
与旧 Whisper 技能对比
| Whisper(旧) | SenseVoice(新) | |
|---|---|---|
| 模型 | mlx-whisper-medium | SenseVoice-Small(234MB) |
| 准确率 | 23–38% | 92% |
| 幻觉内容(hallucinations) | 每次会话数百条 | 0 |
| 时间戳精度 | 逐词级(约 2–4 秒) | VAD 锚定(约 15 秒) |
| 重复行比例 | ~23% | <0.2% |
| 中文支持 | 较弱 | 原生支持(专为普通话优化) |
关于表情符号的说明
SenseVoice 会在文本片段末尾附加情绪标签(如 😊😔😡😮)。这些是模型自身输出产物,反映其检测到的语音情绪倾向,并非音频中实际存在的表情符号。下游处理环节(如笔记汇总)应忽略或主动剥离此类标签。
热门AI工具
相关专题
本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。
0
2026.11.12
本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。
0
2026.11.12
本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。
0
2026.11.12
本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。
0
2026.11.06
围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。
0
2026.11.06
详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。
0
2026.11.06
DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。
0
2026.11.05
DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。
0
2026.11.05
本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。
0
2026.11.04
热门下载
相关下载
精品课程
共6课时 | 12.1万人学习
共79课时 | 161.8万人学习
共6课时 | 54.7万人学习
最新文章