📦 小宇宙-asr

v1.0.0

使用本地 Qwen3-ASR 语音识别将 小宇宙 (Xiaoyuzhou) 播客节目转录为文本。结合 xyz API(小宇宙FM API)获取节目元数据和音频...

0· 31·0 当前·0 累计
0

运行时依赖

无特殊依赖

安装命令

点击复制
官方npx clawhub@latest install xiaoyuzhou-asr
镜像加速npx clawhub@latest install xiaoyuzhou-asr --registry https://cn.longxiaskill.com

技能文档

xiaoyuzhou-asr 使用本地 Qwen3-ASR(Metal/CUDA 加速)将小宇宙播客转录为文本。

前置条件

  • xyz API 服务器运行 —— 获取小宇宙节目数据与音频 URL
git clone https://github.com/ultrazg/xyz.git && cd xyz && go run . 默认端口 23020,-p 可改
  • Access token —— 先 POST /sendCode 再 POST /login(见 references/xyz-api.md)
  • ffmpeg —— 音频格式转换(brew install ffmpeg)
  • Qwen3-ASR 模型 —— 下载(HF Hub 不含 tokenizer.json):
python3 -c "from huggingface_hub import snapshot_download; snapshot_download('Qwen/Qwen3-ASR-0.6B', local_dir='models/0.6B')"
  • qwen3-asr-rs —— 源码编译:
git clone https://github.com/alan890104/qwen3-asr-rs.git && cd qwen3-asr-rs cargo build --release --example local_transcribe
  • tokenizer.json —— 首次运行由脚本自动生成(vocab.json + merges.txt),无需手动。

工作流 Step 1:查找节目 TOKEN="$XYZ_ACCESS_TOKEN" BASE="http://localhost:23020" # 关键词搜索 curl -s -X POST $BASE/search -H "x-jike-access-token: $TOKEN" -H "Content-Type: application/json" -d '{"keyword":"关键词","type":"EPISODE"}' # 获取节目详情(含音频 URL) curl -s -X POST $BASE/episode_detail -H "x-jike-access-token: $TOKEN" -H "Content-Type: application/json" -d '{"eid":"EPISODE_ID"}' # 列出播客全部节目 curl -s -X POST $BASE/episode_list -H "x-jike-access-token: $TOKEN" -H "Content-Type: application/json" -d '{"pid":"PODCAST_ID","order":"desc"}'

Step 2:下载并转换音频 音频 URL 在 data.data.media.source.url(m4a)。 mkdir -p /tmp/xiaoyuzhou-audio curl -L -o /tmp/xiaoyuzhou-audio/episode.m4a "$AUDIO_URL" ffmpeg -y -i /tmp/xiaoyuzhou-audio/episode.m4a -ar 16000 -ac 1 /tmp/xiaoyuzhou-audio/episode.wav

Step 3:分割长音频(>3 min 必须) 固定时长分割(推荐,Metal 显存安全): ffmpeg -y -i episode.wav -f segment -segment_time 180 -ar 16000 -ac 1 seg_%03d.wav 或静音检测分割(连续语音可能无静音): ffmpeg -i episode.wav -af "silencedetect=noise=-30dB:d=2" -f null - 2>&1 | grep silence_end ffmpeg -i episode.wav -f segment -segment_times T1,T2 -ar 16000 -ac 1 seg_%03d.wav

Step 4:转录 MODEL_DIR="/path/to/models/0.6B" ASR_BIN="qwen3-asr-rs/target/release/examples/local_transcribe" # 逐段转录 for seg in seg_*.wav; do $ASR_BIN $MODEL_DIR $seg 2>/dev/null | grep "^Text :" | sed 's/^Text : //'; done 高效 Rust 一次性加载模型示例: use qwen3_asr::{AsrInference, TranscribeOptions, best_device}; let engine = AsrInference::load("models/0.6B", best_device())?; for seg in segments { let result = engine.transcribe(&seg, TranscribeOptions::default())?; output.push(result.text); }

Step 5:输出格式 合并转录与元数据为 markdown: # {title} 节目: {podcast.title} | 日期: {pubDate} | 时长: {duration}s

转录文本

{transcript}

参考 xyz API 端点与鉴权:references/xyz-api.md Qwen3-ASR 用法与性能:references/qwen3-asr.md

Token 管理 Token 会过期,401 时刷新:POST /refresh_token 环境变量:XYZ_ACCESS_TOKEN、XYZ_REFRESH_TOKEN 无有效 token 时提示登录。

限制

  • 必须将音频切为 ≤3 min 段,保证 Metal GPU 稳定
  • 音频须为 WAV 16kHz mono
  • tokenizer.json 需手动生成(HF 下载不含)
  • 需要 local_transcribe 二进制(demo 仅内置测试样例)
  • xyz API 需 +86 手机号登录
  • 全部本地处理,音频不会离开本机
数据来源ClawHub ↗ · 中文优化:龙虾技能库