语音识别

uv python install 3.12
uv venv --python 3.12
source .venv/bin/activate
uv pip install pip

安装 videocaptioner

VideoCaptioner

pip install videocaptioner

语音转录(免费,无需 API Key)

videocaptioner transcribe video.mp4 --asr bijian

会生成一个 srt 字幕文件,用 llm 优化字幕,阿里qwen api-key

from pathlib import Path

from openai import OpenAI

API_KEY = "xxx"
BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1/"
MODEL_NAME = "qwen3.5-27b"

INPUT_SRT = Path("1.srt")
OUTPUT_SRT = Path("1_optimized.srt")

SYSTEM_PROMPT = """你是一个专业的中文字幕校对助手,负责优化 ASR 自动生成的 SRT 字幕。

你的任务:
1. 纠正错别字、同音字、术语识别错误、英文会议名或缩写错误。
2. 根据上下文修正明显不通顺的句子,让表达更自然。
3. 删除无意义的口头停顿词,比如“呃”“啊”,但不要过度删改原意。
4. 保留说话风格,不要改写成完全不同的句子。
5. 输出必须严格保持 SRT 格式。

严格要求:
1. 不要修改字幕编号。
2. 不要修改时间轴。
3. 只修改每条字幕的文本内容。
4. 不要添加解释、注释、前言、后记。
5. 输出内容必须是完整的 SRT 正文,且可直接保存为 .srt 文件。
6. 如果遇到专业术语,优先结合上下文修正为最可能正确的术语。
7. 英文缩写和单词尽量修正为常见标准写法,例如 Github,README 等。
"""

USER_PROMPT_TEMPLATE = """请优化下面这份 SRT 字幕。

要求再次强调:
- 保持原有编号不变
- 保持原有时间戳不变
- 仅修改字幕文本
- 返回完整、可直接保存的 SRT 内容

下面是原始字幕:

{srt_content}
"""


def main() -> None:
    srt_content = INPUT_SRT.read_text(encoding="utf-8")

    client = OpenAI(
        api_key=API_KEY,
        base_url=BASE_URL,
    )

    response = client.chat.completions.create(
        model=MODEL_NAME,
        messages=[
            {"role": "system", "content": SYSTEM_PROMPT},
            {
                "role": "user",
                "content": USER_PROMPT_TEMPLATE.format(srt_content=srt_content),
            },
        ],
        temperature=0.2,
    )

    optimized_srt = response.choices[0].message.content.strip()
    OUTPUT_SRT.write_text(optimized_srt + "\n", encoding="utf-8")

    print(f"优化完成,输出文件: {OUTPUT_SRT}")


if __name__ == "__main__":
    main()

如果已经有文稿的话可以使用如下的脚本提取其中的英文单词,修改上面的代码的要求 7

import re
from pathlib import Path


source_path = Path("1.txt")
target_path = Path("1.new.txt")

text = source_path.read_text(encoding="utf-8")
words = re.findall(r"[A-Za-z]+", text)

# 按出现顺序去重
unique_words = list(dict.fromkeys(words))

target_path.write_text(",".join(unique_words), encoding="utf-8")