Guide · 使用教程
TurboScribe 教程:录音转文字、SRT 字幕导出与校对
依据公开界面说明转写和导出流程,附可运行的本地 SRT 检查程序,验证编号、时间轴与退出码;不将结构检查当成语音准确率测试。
这篇教程会完成什么
把已有录音或视频送入 TurboScribe,选择适当的语言和转写设置,获得文字稿,再根据交付需要导出 TXT、文档或 SRT。最后用一个可本地运行的 Python 程序检查教学 SRT 的编号、时间格式、重叠和时长边界。
本文的云端操作说明依据官方公开界面和资料整理,价格已在浏览器核对;没有登录账号提交音频,也没有完成真实文件的云端转写及导出实测。程序实测范围仅是教学字幕检查,不能据此推断服务的语音识别准确率。
开始前:免费版能否处理你的文件
截至 2026 年 10 月 28 日,官方免费版为每天 3 个文件、每个最长 30 分钟、一次上传 1 个文件。它适合先试一小段材料,不支持据这些额度直接推断可以完整免费转写任意长录音。
Unlimited 的实时价格页显示月付 US$20;年付一次收取 US$120,折合 US$10/月。付费版列出单文件最长 10 小时或 5 GB,以及批量上传条件。先确认素材时长与大小,再考虑付款周期;你不需要为了学习后面的字幕检查程序购买任何计划。
第一步:准备原始录音和交付目标
保留原始文件,另建校对副本。如果最终需要给视频加字幕,确认之后是否还会剪辑:对已经删除片段或改变顺序的成片,应使用对应版本的音频处理时间轴,否则原始录音字幕可能与最终画面错位。
先写清楚想得到什么:只阅读可用 TXT;需要排版交付可考虑文档;需要与媒体同步则选择 SRT 或 VTT。不要把排版后的摘要当作逐字稿,也不要把没有时间轴的普通文字改个扩展名就当成字幕。
选一段有代表性的短样本,包含日常口音、专有名词、数字与说话人切换。不要只用特别清晰的演示素材测试。材料是否适合上传云服务也应在这一步确定;本地字幕检查不会上传文件,但后续云端转写会把素材交给对应服务处理。
第二步:按原语言选择转写设置
打开 TurboScribe,按页面提示进入转写流程并选择文件。官方公开入口支持常见音视频格式,提供 Audio Language、Transcription Mode 和说话人相关选项。账号内界面可能随版本变化,以当前按钮和说明为准。
需要中文逐字稿时,先选择与录音对应的语言。不要误开把原音直接转成英文的选项,否则得到的可能是译文,难以当作原语言听写结果逐句复核。转写模式的快慢与质量命名是产品选项,不代表本文已经测试了各模式的中文表现。
多人录音可按需要启用说话人识别,再检查输出标签。Speaker 1 之类的标签是系统区分结果,不是已经核实的真实姓名。重叠讲话、接话和声音相似时,应回听确认,不要直接把标签替换为某个人后跳过审核。
第三步:先校对文字,再整理成稿
第一轮先找关键错误:人名、公司名、金额、日期、单位以及“可以/不可以”这样的否定关系。若一句话听不清,可标记为待确认,不要为了让稿件流畅而自行补成确定事实。先保留原话,再决定是否需要另做摘要或改写。
第二轮处理断句、说话人和术语一致性。需要客户或采访对象确认的内容,仍应沿用原有编辑流程。自动转写能提供初稿,却不能代替对语义、引用和关键承诺的确认。本文没有真实音频测试数据,不能提供某种口音的准确率保证。
第四步:选择导出格式
官网列出 DOCX、PDF、TXT、SRT 和 VTT 等格式。导出后将文件放到自己的工作目录,检查是否为目标格式,能否打开,以及内容是不是对应刚处理的那一版素材。导出次数与相关权益应以自己的方案和账号当前显示为准。
SRT 通常由编号、开始与结束时间以及字幕文字组成。下面是人为编写的 4 秒教学样例,不是 TurboScribe 的实际导出结果。将它保存为 UTF-8 编码的 sample.srt:
1
00:00:00,000 --> 00:00:02,000
这是一段教学字幕。
2
00:00:02,000 --> 00:00:04,000
金额、人名和否定表达需要回听。
第五步:本地检查 SRT 的结构与时间轴
下面的程序仅使用 Python 标准库,无需 API Key 或第三方依赖。它要求编号从 1 连续排列、使用示例中的毫秒时间码,并采用一个保守的单轨交付规则:遇到重叠就提示人工复核。重叠不一定意味着 SRT 标准本身不允许,也可能是多说话人或制作选择。
将代码保存为 check_srt.py。如果字幕工具导出的是其他格式、时间行带有额外定位信息或特殊样式,先按目标交付要求判断,不要让程序自动“修复”并覆盖原文件。
"""A conservative single-track delivery check, not a speech accuracy test."""
import argparse
import json
import math
import re
from pathlib import Path
STAMP = r"\d{2,}:\d{2}:\d{2},\d{3}"
TIMELINE = re.compile(rf"^({STAMP})\s+-->\s+({STAMP})$")
def milliseconds(value):
hour, minute, rest = value.split(":")
second, fraction = rest.split(",")
if not (0 <= int(minute) < 60 and 0 <= int(second) < 60):
raise ValueError("minute or second is outside 00-59")
return ((int(hour) * 60 + int(minute)) * 60 + int(second)) * 1000 + int(fraction)
def check_srt(text, duration_ms=None):
if duration_ms is not None and (type(duration_ms) is not int or duration_ms < 0):
raise ValueError("duration_ms must be a nonnegative integer")
text = text.lstrip("\ufeff").replace("\r\n", "\n").replace("\r", "\n").strip()
errors, cues = [], []
if not text:
return {"ok": False, "cues": 0, "errors": ["empty subtitle file"]}
previous_end = None
for number, block in enumerate(re.split(r"\n[ \t]*\n+", text), start=1):
lines = block.splitlines()
if len(lines) < 3:
errors.append(f"block {number}: missing index, time line or text")
continue
if lines[0].strip() != str(number):
errors.append(f"block {number}: expected sequential index {number}")
match = TIMELINE.fullmatch(lines[1].strip())
if not match:
errors.append(f"block {number}: unsupported time format")
continue
try:
start, end = [milliseconds(value) for value in match.groups()]
except ValueError as exc:
errors.append(f"block {number}: {exc}")
continue
if start >= end:
errors.append(f"block {number}: end must be after start")
if previous_end is not None and start < previous_end:
errors.append(f"block {number}: overlap needs manual review")
if duration_ms is not None and end > duration_ms:
errors.append(f"block {number}: beyond supplied media duration")
if not "\n".join(lines[2:]).strip():
errors.append(f"block {number}: empty subtitle text")
previous_end = end if previous_end is None else max(previous_end, end)
cues.append({"start_ms": start, "end_ms": end})
return {"ok": not errors, "cues": len(cues), "errors": errors}
def main():
parser = argparse.ArgumentParser()
parser.add_argument("file", type=Path)
parser.add_argument("--duration-seconds", type=float)
args = parser.parse_args()
duration = args.duration_seconds
if duration is not None and (not math.isfinite(duration) or duration < 0):
parser.error("duration must be a finite nonnegative number")
try:
report = check_srt(
args.file.read_text(encoding="utf-8-sig"),
round(duration * 1000) if duration is not None else None,
)
except (OSError, UnicodeError, ValueError) as exc:
report = {"ok": False, "cues": 0, "errors": [str(exc)]}
print(json.dumps(report, ensure_ascii=False, indent=2))
raise SystemExit(0 if report["ok"] else 1)
if __name__ == "__main__":
main()
运行检查:
python3 check_srt.py sample.srt --duration-seconds 4
教学样例的实际结果为 ok: true,识别出两段字幕,退出码为 0。将第二段结束时间改成 00:00:05,000 后,使用同样的 4 秒时长参数,程序会报告超过媒体时长并以退出码 1 结束。这个错误样例用于确认检查确实会拦截问题。
--duration-seconds 需要填写与这份字幕对应的实际媒体时长,程序不会自行读取音视频文件。如果不提供该参数,就不会检查是否越过媒体结束位置。字幕完整覆盖多少内容,也不能仅靠最后一段的结束时间判断:片头片尾可能没有人声,中间也可能遗漏转写。
本次共完成九项本地检查:正常字幕、UTF-8 BOM/CRLF、空文件、编号错误、非法秒数、结束早于开始、时间重叠、缺少文字和超过给定媒体时长;另核对了正常与越界样例的命令行退出码。它们检验的是这段检查程序,不是任何转写服务的表现。
第六步:在最终视频上回放验收
结构检查通过后,把字幕导入实际使用的播放器或剪辑工具,检查开头、中间、结尾和剪辑点。观察字幕是否遮挡重要画面,是否断在不合适的位置,手机端是否读得完。不要因为文件没有格式错误就直接交付。
再次回听数字、人名、否定和语气。字幕可以完全符合时间格式,却把“不能退款”写成“可以退款”。这类错误不在本程序的检查范围内,需要逐句复核重要片段,必要时由熟悉内容的人确认。
如果视频后来又被剪辑,应重新检查相应时间轴。保留原始逐字稿、已校对文字、字幕和成片的版本关系,可以减少多人协作时拿错文件。程序不会修改任何输入文件,只输出检查报告,修订时请另存新版本。
常见问题
免费额度够,为什么长录音仍然不适用? 日文件数和单文件时长是不同限制。免费版需要同时满足条件,不能只看其中一项。
为什么导出字幕后仍然错位? 先确认字幕是否对应同一版素材,之后再查开始偏移、删减片段和时间码。不要把所有错位都归因于识别模型。
程序通过,是否代表中文识别正确? 不代表。程序没有读取音频,也没有检查文字与语音是否一致。
说话人标签能直接作为采访对象名字吗? 需要核对。标签区分、真实身份和原话归属是不同问题。
年付 US$10/月是否每月只扣 US$10? 不是。本次价格页显示年付为一次收取 US$120,US$10 是折合月价,月付另为 US$20。
什么时候比较其他工具
会议记录是主要入口,可看TurboScribe vs Otter.ai;转写后还要编辑播客或视频,可看TurboScribe vs Descript。更完整的选型见长音频转文字工具推荐。
官方资料
常见问题
- 这篇教程真的跑了云端转写吗?
- 没有。云端说明依据官方公开资料与界面,实际运行的是本地教学 SRT 检查程序。
- 免费版能处理任意长的录音吗?
- 不能。免费版同时有每天文件数与单个文件时长限制。
- 本地程序会上传或修改我的字幕吗?
- 不会。代码读取本地文件并打印检查报告,不上传内容,也不覆盖输入文件。
- 字幕重叠一定是格式错误吗?
- 不一定。示例采用保守的单轨交付规则,将重叠列为人工复核项;实际制作应按交付要求判断。
- 程序是否自动检测音视频时长?
- 不会。需要自己提供 duration-seconds,省略时就不检查字幕是否超出媒体时长。
- 程序通过能证明听写准确吗?
- 不能。它没有读取音频,只检查部分字幕结构和时间轴条件。