dsh-voice-transcribe:本地语音/视频转写

前言

DeepSeek Harness (DSH) 的核心设计是“一切皆插件”。在开发需要理解语音的智能体时,输入格式的解析往往是第一道坎。QQ 和微信发送的语音文件通常带有 #!SILK_V3 头,且文件名常被错误标记为 .amr。大多数环境下的 ffmpeg 缺少 SILK 解码器,导致无法处理。

dsh-voice-transcribe 是一个本地语音/视频转写插件,由 JackZo400 维护。它通过 SILK 解码器和 SenseVoice 引擎(基于 sherpa-onnx int8 模型),将 QQ/微信语音转成文字。整个过程在本地运行,不消耗 API 费用。

核心功能

  • SILK 音频解码:处理 QQ/微信特有的 SILK 编码格式。
  • SenseVoice 本地转写:使用 int8 精度的 SenseVoice 模型进行高精度识别。
  • 无需 API 费用:全流程本地推理。
  • 批量处理:支持一次传入多个文件,模型加载一次复用。
  • 专有名词纠错:通过配置表修正识别错误。

安装与启用

1. 安装插件

在 DSH 环境中执行以下命令安装:

dsh plugin --profile web add github:JackZo400/dsh-voice-transcribe

2. 安装 Python 依赖

安装 Python 依赖包(需安装在 pythonPath 指定的解释器中):

pip install -r py/requirements.txt

注意:清华源通常没有 sherpa-onnx,安装失败请使用阿里源或官方源:

pip install -i https://mirrors.aliyun.com/pypi/simple -r py/requirements.txt

3. 系统依赖

系统需安装 ffmpeg,用于处理非 SILK 格式的音频/视频转码。

4. 下载模型

下载 SenseVoice 模型(约 163 MB 压缩包,解压后约 239 MB int8 模型):

curl -LO https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-int8-2024-07-17.tar.bz2
tar xjf sherpa-onnx-sense-voice-zh-en-ja-ko-yue-int8-2024-07-17.tar.bz2

解压后的目录(如 sherpa-onnx-sense-voice-zh-en-ja-ko-yue-int8-2024-07-17)即为模型目录,需在配置中指定路径。

配置

在 DSH 的配置文件中添加以下内容:

- insert:
    - id: voice-transcribe
      name: dsh-voice-transcribe
      config:
        pythonPath: python3        # 你的 Python 解释器路径
        modelDir: /path/to/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-int8-2024-07-17
        maxSeconds: 120            # 仅转写前 N 秒
        language: auto             # auto / zh / en / ja / ko / yue
        fix: ''                    # 专有名词纠错表
        maxFiles: 4                # 一次最多转写的文件数

配置说明:
* modelDir:也可通过环境变量 AILIN_ASR_SV_DIR 设置。代码中不包含写死的路径,必须显式配置。
* fix:专有名词纠错表。格式为 错=对,错=对,从左往右替换。默认为空。

用法

在 DSH 中调用

安装后,Agent 会获得 transcribe_media 工具。可传入单个或多个文件路径:

// JavaScript 示例
const svc = ctx.get('voiceTranscribe');
const { results } = await svc.transcribe(['/tmp/voice.amr']);
// 返回包含 file, ok, text, language, duration 的结果

单独使用 Python 脚本

若需单独调试,可直接使用插件提供的 Python 脚本。

  1. SILK 解码:
    python py/silk.py voice.amr --out-dir out/
输出为标准的 16k 单声道 WAV 文件。
  1. SenseVoice 转写:
    python py/transcribe.py zh.wav --language zh --model-dir /path/to/model
输出为 JSON 格式。

性能数据(实测)

  • 模型体积:239 MB (int8)。
  • 单条耗时:约 0.1 秒(1.7 秒语音样本)。
  • 加载耗时:约 0.9 秒(仅加载一次)。

已知局限

  • 文件来源:仅支持本地文件,不支持 URL(避免 SSRF 风险)。
  • 视频处理:只转音轨,不抽帧。
  • 语言限制:仅支持 5 种语言(zh/en/ja/ko/yue)。
  • 长音频:超过 28 秒会自动切片,切点偶尔可能打断词语。
  • 幻觉风险:纯静音或纯音乐可能产生无意义的字。
  • 名词纠错:SenseVoice 无词表接口,专有名词纠错需依赖 fix 配置表。

结语

dsh-voice-transcribe 专为解决 IM 场景下的语音解析问题设计。如果你正在开发基于 DeepSeek Harness 的智能体,且需要处理 QQ 或微信语音,这是一个无需 API 调用、本地即可运行的方案。

插件目录 | GitHub 仓库

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye