Skip to main content
Glama

dialogue-transcriber

转录对话,并找出谁说了什么。

CI PyPI License: Apache-2.0 Python

把它指向一段采访、小组讨论、会议录音或 YouTube URL,你就能得到一份每一行都标注了说话人的转录稿——外加一个 Web UI,用于检查说话人聚类、收听任意片段,并手动修正标签。

审查 UI:说话人聚类、波形、时间线和可搜索的转录稿

工作原理

audio  ──►  transcribe  ──►  segment  ──►  extract_clips  ──►  embed  ──►  cluster
              (Whisper)        (sentence-       (ffmpeg)       (TitaNet)    (UMAP +
                               level)                                       KMeans +
                                                                            silhouette)

Whisper 生成词级时间戳;单词被分组为句子片段;每个片段的音频用 NVIDIA NeMo TitaNet 嵌入;嵌入在 UMAP 投影上进行聚类;最终转录稿以 Speaker 1、Speaker 2…… 的标签输出。每个阶段都按内容哈希缓存,因此重新运行和调整配置都很便宜。

Related MCP server: youtube-transcriber-mcp

快速开始

ffmpeg 和 ffprobe 必须在 PATH 中(macOS 上执行 brew install ffmpeg)。

# No install needed:
uvx --from "dialogue-transcriber[all]" transcriber transcribe interview.mp3

# Or install the tool:
uv tool install "dialogue-transcriber[all]"

transcriber transcribe interview.mp3 --participants 2
transcriber transcribe "https://www.youtube.com/watch?v=..." --backend openai
transcriber serve interview.mp3        # review UI on http://127.0.0.1:8000

默认后端在本地运行 faster-whisper;--backend openai 则改用 OpenAI Whisper API(需要 OPENAI_API_KEY,在没有 GPU 的机器上快得多)。密钥可以在环境中导出,也可以放在项目中的 .env 文件里——CLI 会从工作目录(或最近的父目录)加载 .env,而导出的变量始终优先于文件。

数据存放在哪里?

  • 流水线缓存:你运行命令的目录下的 ./.transcriber-cache/(可用 --work-dir 覆盖)——包含分块、每片段剪辑、嵌入、YouTube 下载以及 Web UI 的任务状态。可以安全删除;它会重新构建。

  • 转录稿:写在输入音频旁边(interview.txt),或 --output 指向的位置;--output - 则打印到标准输出。

  • 模型权重(本地后端):首次下载到 ~/.cache(Hugging Face / NeMo)。Whisper large-v3 的下载量约为 3 GB,因此首次本地运行需要一些时间。

使用默认的本地后端时,数据不会离开你的机器;--backend openai 会将音频发送到 OpenAI API。

选择你的附加功能

[all] 是最简单的选择。对于较小的安装:

uv pip install dialogue-transcriber              # core only
uv pip install "dialogue-transcriber[local]"     # + faster-whisper backend
uv pip install "dialogue-transcriber[openai]"    # + OpenAI Whisper API backend
uv pip install "dialogue-transcriber[cluster]"   # + scikit-learn / UMAP
uv pip install "dialogue-transcriber[embed]"     # + NeMo TitaNet speaker embedder
uv pip install "dialogue-transcriber[api]"       # + FastAPI backend (powers the web UI)
uv pip install "dialogue-transcriber[youtube]"   # + yt-dlp downloader
uv pip install "dialogue-transcriber[oip]"       # + MCP server for OIP consumers

CLI

# Full pipeline; writes a speaker-labeled transcript next to the audio
transcriber transcribe path/to/audio.mp3

# Speakers, language, format
transcriber transcribe interview.mp3 --participants 3 --language sv --format vtt

# Machine-readable output on stdout (see "For AI agents" below)
transcriber transcribe interview.mp3 --format json --output -

# Pull audio from YouTube
transcriber download "https://www.youtube.com/watch?v=..."

# Pipeline + web UI
transcriber serve interview.mp3 --participants 3

格式:txt(合并说话人轮次)、vtt、srt、json。传入 --context "names, jargon" 来为 Whisper 提供它应该预期的词汇。--output - 将转录稿流式输出到标准输出,将摘要输出到标准错误,因此输出可以干净地管道化。

Web UI

transcriber serve 运行一个 FastAPI 后端,并服务打包好的 React 前端。你可以获得:

  • 一个 UMAP 散点图,每个点代表一个片段,按聚类着色——套索选择一个聚类即可批量重命名;

  • 一个连续波形,每个片段对应一个区域——点击或拖动即可播放任意内容;

  • 一个甘特图风格的说话人时间线;

  • 一个支持全文搜索的虚拟化转录稿;

  • 可内联重命名的说话人标签(重命名会在服务端持久化);

  • TXT / VTT / SRT 导出;

  • 键盘导航(↑/↓ 切换片段,Space 播放/暂停,/ 搜索)。

多个任务可以并行运行;通过侧边栏添加更多任务。

serve 会自动选择后端:当 OPENAI_API_KEY 可用(环境变量或 .env)时使用 openai,否则使用 local。传入 --backend 可显式选择。(一个遗留的单任务 Dash UI 仍可通过 transcriber ui 使用。)

面向 AI 智能体

这个项目既为人类设计,也为智能体驱动而构建。

Claude Code 技能——该仓库同时也是一个插件市场。安装该技能后,Claude Code 将知道如何按需转录和区分音频:

/plugin marketplace add Novia-RDI-Seafaring/transcriber
/plugin install dialogue-transcriber@dialogue-transcriber

结构化输出——--format json --output - 在标准输出上输出一个稳定的结构:

{
  "speakers": ["Speaker 1", "Speaker 2"],
  "n_segments": 42,
  "duration": 512.3,
  "segments": [
    {"speaker": "Speaker 1", "start": 0.0, "end": 4.2, "text": "..."}
  ]
}

MCP / OIP——该包是一个开放摄取协议生产者,因此任何支持 OIP 的消费者(例如 Anchor)都可以在无需修改消费者端的情况下摄取转录稿:

transcriber oip install --data-dir ~/transcripts     # register the producer
transcriber oip ingest audio.mp3 --data-dir ~/transcripts
transcriber oip serve                                # MCP server (also: transcriber-mcp)

工具命名空间:transcribe。区域类型:transcript_segment。source_ref.kind:audio-timestamp。

库使用

from transcriber.config import ClusterConfig, PipelineConfig, TranscribeConfig
from transcriber.pipeline import run_pipeline
from transcriber.render import render_txt

cfg = PipelineConfig(
    transcribe=TranscribeConfig(backend="local", language="en"),
    cluster=ClusterConfig(participants=2),
)
result = run_pipeline("interview.mp3", config=cfg)
print(render_txt(result.segments))

PipelineResult.segments 是一个 SpeakerSegment 记录列表,包含句子文本、时间范围、磁盘上的剪辑以及分配的说话人。PipelineResult.cluster.projection 是用于绘图的 2-D UMAP。

后端

关注点

默认

通过以下方式覆盖

转录

faster-whisper large-v3

--backend openai

嵌入

nvidia/speakerverification_en_titanet_large

向 run_pipeline 传入 embedder=

聚类

UMAP(2) + KMeans + silhouette

传入 ClusterConfig

YouTube

yt-dlp

替换 YouTubeDownloader

所有后端都是 Protocol——参见 transcriber/transcribe/base.py 和 transcriber/embed/base.py。测试使用内存中的假对象,因此运行测试套件不需要重型模型。

开发

参见 CONTRIBUTING.md 了解指南,以及 CHANGELOG.md 了解发布历史。

git clone https://github.com/Novia-RDI-Seafaring/transcriber
cd transcriber
uv venv
uv pip install -e ".[dev,cluster,api,openai,embed,youtube]"
(cd web && pnpm install && pnpm build)   # so `transcriber serve` can serve the UI

pytest                  # core + clustering + api tests
pytest -m "not slow"    # skip heavy/network tests
ruff check src tests

前端工作:cd web && pnpm dev(http://127.0.0.1:5173,将 /api 代理到 :8000),并在另一个 shell 中运行 transcriber serve … --port 8000。

发布:发布 GitHub release 会触发 .github/workflows/release.yml,它会构建前端,将其打包到 wheel 中,并通过可信发布发布到 PyPI。

许可证

Apache-2.0——参见 LICENSE。

Related MCP Connectors

Related MCP Servers