# elevenlabs-stt [English](./README.en.md) | **简体中文** > 将 ElevenLabs 网页版「语音转文本」功能转为命令行脚本,使用你自己的登录账号,复用免费额度。 > [!IMPORTANT] > 本项目非 ElevenLabs 官方,也未与之关联。它通过复用网页应用的内部 API 实现,该接口可能随时变更。请使用你自己的账号,并遵守 ElevenLabs 的服务条款。 ## 它做什么 把 `elevenlabs.io/app/speech-to-text` 的网页操作流程(登录 → 上传音频 → 选语言/开关 → 等待转录 → 导出字幕)变成一条命令。脚本复用网页内部 API(而非官方付费 API),因此继承免费账号的积分额度(约 1 万积分 ≈ 12 分钟音频/月)。 ## 功能 - 上传本地音频文件转文本(网页「上传」路径) - 四个开关:标记音频事件 / 包含字幕 / 无逐字记录 / 从声音库分配声音 - 高频专有词汇增强识别(关键术语) - 主语言选择或自动检测(ISO 639-3) - 导出 SRT / VTT / TXT / JSON / HTML / PDF / DOCX,默认 SRT - 上传前校验:文件大小(1000MB 硬限制)、时长(ffprobe 可选,10 分钟软提醒) - 一次性浏览器登录,自动续签 1 小时令牌 - 可选多账号额度池:自动注册临时邮箱账号、按剩余额度选择账号、转录后自动补池 ## 安装 ```bash pip install -r requirements.txt playwright install chrome # 仅登录步骤需要 ``` 可选:安装 `ffprobe`(随 ffmpeg)以启用音频时长预检。 ## 快速开始 ```bash # 1) 一次性登录(弹出 Chrome,用任意方式登录 ElevenLabs) python stt.py login # 2) 转录(默认输出 out.srt) python stt.py transcribe audio.m4a -o out.srt # 3) 批量转录(每个文件各输出 <名字>.srt) python stt.py transcribe a.mp3 b.mp3 c.mp3 # 4) 只看分配计划,不注册也不上传 python stt.py transcribe a.mp3 b.mp3 c.mp3 --dry-run # 5) 指定语言 + 词汇 + 导出 VTT python stt.py transcribe audio.m4a --lang eng --vocab "V社,Major" --format vtt -o out.vtt # 6) 超长音频:按静音智能切分,逐段转录后合并回一份字幕 python stt.py transcribe long.m4a --split -o long.srt # 可选:查看/预热多账号额度池 python stt.py pool status python stt.py pool warm --target 3 ``` 登录会把 Firebase **refresh token** 存到 `session.json`(已 gitignore)。1 小时的 JWT 每次运行自动续签;仅在 refresh token 本身过期或报鉴权错误时重跑 `login`。 ## 配置 复制 `config.example.toml` → `config.toml` 编辑持久默认值,CLI 参数覆盖配置: | 字段 | 说明 | 默认 | |---|---|---| | `language` | `auto` 或语言名或 ISO 639-3 代码 | `auto` | | `tag_audio_events` | 标记音频事件 | `true` | | `include_subtitles` | 包含字幕(网页默认关,脚本强制开) | `true` | | `no_verbatim` | 无逐字记录 | `false` | | `use_speaker_library` | 从声音库分配声音 | `false` | | `vocab` | 关键术语列表,如 `["Maj3r", "V社"]` | `[]` | | `export_format` | `srt`/`vtt`/`txt`/`json`/`html`/`pdf`/`docx` | `srt` | | `poll_timeout_secs` | 轮询超时秒数 | `600` | | `show_cost` | 上传前打印预估积分成本 | `false` | | `max_concurrency` | 跨账号并发转录上限;`1` = 回退串行(降级开关) | `4` | | `stagger_secs` | 相邻两次上传起始的最小间隔(秒),降低同 IP 突发;`0` = 关闭错峰 | `2.0` | ## 本地 Web UI(可选) 命令行之外,`web.py` 用标准库起一个本地网页,复用 `stt.py` 的转录与账号逻辑: ```bash python web.py # 打开 http://127.0.0.1:8756 ``` - **转录页**:拖拽/多选音频或视频 → 视频由本机 `ffmpeg` 自动提取音轨(界面分「上传中 / 提取音轨中」两阶段)→ 浏览器测时长并预估积分 → 按剩余额度自动分配账号(best-fit)→ 「开始转录」真实上传、轮询、导出,完成后自动下载字幕。「使用的账号」区提供默认折叠的**「高级 · 手动指定账号」**面板:勾选账号即把分配限定在所选集合内(额度不足的账号灰显禁选),手动模式额度不足会直接报错、不会自动注册;清空勾选回到自动分配。转录期间底栏显示**真实分步进度**(已完成/总数计数、并发**活动任务列表**多行展示各文件与阶段、最新日志行),可展开「详情」查看完整滚动日志。 - **账号管理页**:读取 `accounts.json`,支持搜索/排序/多选/分页与回顶、真实刷新额度(仅刷新勾选账号,多账号并发)、删除、导出 JSON。 - **登录账号**:弹窗输入邮箱+密码,走 Firebase REST 直接登录并把令牌保存到 `accounts.json`(无需浏览器)。 - **启动注册机**:弹窗提供完整参数(对应 `config.toml → [temp_email]` 与目标满额账号数),「保存」会写回 `config.toml`(与配置文件双向同步);「开始批量创建」先保存配置再跑真实 `pool warm` 批量注册。注册期间有分步进度日志:CLI(`stt pool warm` 及转录触发的自动注册)打印到 stderr,WebUI 注册弹窗内实时滚动显示并带 已完成/目标 计数。 - **功能管理 · 长音频切分页**:上传长音频或视频(视频同样后台抽轨)→ 后端按静音点计算贪心切分方案(每段落在单个满额账号额度内)→ 执行切分并无损导出片段到本地 `out/`,供后续转录;与 CLI `--split` 共用 `audio_split.py` 的切分逻辑。转录页与本页均提供**「跳过长静音」开关**(默认关):打开后 ≥10s 的静音区间不切进片段、不上传不计费(本页高级参数可调阈值),方案处显示省下的静音时长。 - 账号池不足以覆盖所有文件时,转录页会提示先 `pool warm`,不会静默注册。 零额外依赖、零构建;须在项目根目录运行(需 `accounts.json`、`config.toml`)。 ## 命令参考 ``` stt login 一次性浏览器登录 → session.json stt transcribe