关于 fun-asr
Fun-ASR 是一项命令行技能,通过 Alibaba Cloud DashScope 的异步 Fun-ASR 服务转写音频。它支持说话人区分、语言提示,以及文本、JSON 或 SRT 输出,适用于音频处理流程。
主要功能
- 01通过 Fun-ASR 转写音频
- 02支持说话人区分
- 03可指定语言提示
- 04输出文本、JSON 或 SRT
- 05通过兼容 S3 的存储上传音频
适用场景
- 01将会议录音转为文本
- 02生成带说话人标记的访谈稿
- 03为讲座制作 SRT 字幕
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ wmy2981/ skills --skill fun-asr安装后在 Claude Code 中输入/fun-asr确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
.claude-plugin/plugin.jsonreferences/api_doc.mdguide.mdscripts/.env.examplefun_asr_cli.pyrequirements.txt详细介绍
Fun-ASR:音频转写
使用 Alibaba Cloud DashScope 的 Fun-ASR 非实时语音识别模型转写音频文件。支持说话人分离、多语言识别和多种输出格式(纯文本、JSON、SRT 字幕)。
工作流
Audio → S3 → Fun-ASR async → Poll → Save file → Agent reads
要求
环境变量
将以下变量设置在 ~/.wmyskills/.env(所有技能共享),或 scripts/.env(优先级更高)中。使用 scripts/.env.example 作为模板——将变量添加到 ~/.wmyskills/.env,切勿覆盖已有文件:
| 变量 | 必填 | 描述 |
|---|---|---|
DASHSCOPE_API_KEY | 是 | Alibaba Cloud DashScope API 密钥(或使用 BAILIAN_APIKEY) |
BAILIAN_APIKEY | 是* | DASHSCOPE_API_KEY 的替代项(Bailian/DashScope) |
S3_ENDPOINT | 是 | 兼容 S3 的存储端点 URL |
S3_BUCKET | 是 | 用于上传音频的 S3 存储桶名称 |
S3_REGION | 否 | S3 区域(默认值:us-east-1) |
S3_PREFIX | 否 | 上传文件的键前缀(默认值:asr-uploads) |
AWS_ACCESS_KEY_ID | 否* | AWS 访问密钥(未使用 IAM/默认凭证链时需要) |
AWS_SECRET_ACCESS_KEY | 否* | AWS 秘密密钥(未使用 IAM/默认凭证链时需要) |
脚本会自动从 ~/.wmyskills/.env 和 scripts/.env 加载 .env 文件(脚本目录优先)。
Python 依赖
pip install boto3 requests python-dotenv
可选:ffmpeg
以下用途需要 ffmpeg/ffprobe:
- 检测音频声道数
- 将多声道音频转换为单声道(说话人分离所需)
如果没有 ffmpeg,脚本会跳过单声道转换并使用原始文件。
用法
python fun_asr_cli.py <audio-file> [options]
从 scripts/ 目录运行,或提供 fun_asr_cli.py 的完整路径。
位置参数
| 参数 | 描述 |
|---|---|
file | 音频文件路径(aac、wav、mp3、m4a、flac、ogg 等) |
选项
| 选项 | 默认值 | 描述 |
|---|---|---|
--model | fun-asr | ASR 模型:fun-asr、paraformer-v2、paraformer-v1、fun-asr-mtl、paraformer-mtl-v1 |
--no-diarization | (已启用) | 禁用说话人分离 |
--language | zh | 语言提示:zh、en、ja、ko、yue 等 |
--channel-id | 0 | 要转写的音频声道(0 = 第一声道/单声道) |
--output | 自动生成 | 自定义输出文件路径(默认值:~/.wmyskills/fun-asr/outputs/) |
--format | text | 输出格式:text、json、srt |
--keep-s3 | (关闭) | 转写后保留 S3 上已上传的文件 |
--version | — | 显示脚本版本并退出 |
示例
# Basic transcription (text format, Chinese)
python fun_asr_cli.py meeting.mp3
# JSON output with full metadata (timestamps, speaker IDs, confidence)
python fun_asr_cli.py interview.wav --format json
# SRT subtitle output
python fun_asr_cli.py lecture.mp3 --format srt
# Disable speaker diarization
python fun_asr_cli.py meeting.mp3 --no-diarization
# Specify language and model
python fun_asr_cli.py japanese_audio.mp3 --language ja --model paraformer-v2
# Custom output path
python fun_asr_cli.py audio.wav --output ~/Desktop/transcript.txt
输出格式
text(默认)
纯文本,带说话人标签和时间戳:[Speaker N] HH:MM:SS - HH:MM:SS,后接文本内容。
json
包含所有元数据的完整 JSON——时间戳、说话人 ID、置信度分数和原始 API 响应。
srt
标准 SRT 字幕格式:NN \n HH:MM:SS,mmm --> HH:MM:SS,mmm \n [SN] text。
执行规则
直接运行用户请求的命令,不要预先检查依赖项、环境变量或配置。如果有问题,脚本会报错并给出清晰提示——届时再检查并修复。
Agent 指令
转写完成后
转写输出会保存到文件中——文本内容不会打印到 stdout。stdout 中唯一打印的行是 Output file: <path>,用于告知结果文件的保存位置。默认输出目录为 ~/.wmyskills/fun-asr/outputs/。
转写成功时,stdout 中仅包含:Output file: <path>。信息和错误日志会发送到 stderr。
成功后,你必须向用户提供结果:
- 从 stdout 中解析
Output file:路径 - 读取文件内容并呈现给用户
- 提供简短摘要:音频时长、检测到的说话人数(如果启用了说话人分离),以及内容概要
错误场景
脚本会以特定代码退出,便于程序处理:
- 代码 2 — 配置错误:缺少环境变量。argparse 遇到无效参数时(例如未知标志、无效模型名称)也会使用此代码。
- 代码 3 — 文件错误:文件不存在、文件过大或超出限制。
- 代码 4 — API/网络错误:提交或轮询失败。
- 代码 6 — 任务失败:ASR API 返回错误。请查看错误消息。
- 代码 7 — 超时:转录耗时超过 30 分钟。
重要规则
- 未检测到有效语音:如果 API 返回
ASR_RESPONSE_HAVE_NO_WORDS或SUCCESS_WITH_NO_VALID_FRAGMENT,则音频中没有可检测到的人声(静音、音量过低或纯噪声)。**请立即停止并告知用户。不要自动重试、切换模型或修改音频参数。**只有在用户明确要求时才重试。 - 说话人分离要求使用时长不超过 2 小时的单声道音频。脚本会通过 ffmpeg 自动转换多声道音频。如果文件时长超过 2 小时,则会自动禁用说话人分离。
- 说话人分离费用:无论是否启用说话人分离,脚本都按音频秒数收费;启用此功能不额外收费。
- S3 清理:转录完成后会自动删除 S3 上的临时文件,除非传入
--keep-s3。 - 定价:Fun-ASR 的费用为每秒音频 CNY 0.00022。脚本会在开始前估算费用,并在完成时报告实际费用。