基于openai-Whisper,我做了一个视频自动添加字幕(翻译)的小程序

前言

看美剧想翻译字幕,就想起了这个Whisper模型。不过这模型翻译输出中文有时不太准确,所以另外使用别的办法翻译。

实现

openai接口:

bash 复制代码
POST https://api.openai.com/v1/audio/transcriptions

Request Body:
{
  "file": [音频文件],
  "model": "whisper-1",
  "language": "en", // 填 zh 会翻译输出中文
  "response_format": "srt" //返回srt字幕格式
}

关于国内访问的问题,我用的这个: LinLin00000000/vercel-proxy-openai: 使用 Vercel 代理 openai (github.com) 搭在vercel上免费,只要绑定个自己的子域名就行!

翻译:

最开始使用的ChatGPT翻译的挺好,就是返回结果太慢了,还收我的$额度!

bash 复制代码
POST https://api.openai.com/v1/chat/completions

Request Body:
{
    "model": "gpt-3.5-turbo",
    "messages": [
      {
        "role": "system",
        "content": "You are a multilingual translator and I need you to help me translate the subtitles in the SRT file into ".$translation_language" // $translation_language: 翻译为xx语言
      },
      {
        "role": "user",
        "content": $subtitles // $translation_language: 字幕内容
      }
    ]
 }

后来改用了百度翻译响应快!

百度翻译api里传的值如果存在换行符号,会返回一个数组!这样可以在遍历时剔除掉对时间和排序字符的翻译,只翻译字幕文本。

php 复制代码
 // 百度翻译
$trans_result = translate($subtitles, $language, $translation_language);
if (!$trans_result) {
    return ajaxReturn($subtitles, '字幕翻译失败,请自行翻译', 4001);
}
$translated_srt = '';
foreach ($trans_result as $item) {
    $src = $item['src'];// 原始字符串
    $dst = $item['dst'];// 翻译后的字符串
    // 判断是否是数字或时间
    if (is_numeric($src) || preg_match('/^\d{2}:\d{2}:\d{2},\d{3} --> \d{2}:\d{2}:\d{2},\d{3}$/', $src)) {
        $translated_srt .= $src . "\n";
    } else {
        $translated_srt .= $dst . "\n";
    }
}
return ajaxReturn($translated_srt, '成功', 1);

合成视频

shell 复制代码
ffmpeg -y -i source.mp4 -vf subtitles=subtitles.srt:charenc=UTF-8 -c:v libx264 -c:a copy result.mp4
  • ffmpeg: 这是 ffmpeg 工具的命令,用于处理音视频文件。
  • -y: 这个选项表示覆盖输出文件而无需用户确认。
  • -i source.mp4: 这个参数指定了输入文件,即源视频文件,它的文件名是 source.mp4。在这个命令中,source.mp4 是你想要添加字幕的原始视频文件。
  • -vf subtitles=subtitles.srt:charenc=UTF-8: -vf 表示视频过滤器,这里是用于添加字幕的视频过滤器。subtitles=subtitles.srt 表示指定字幕文件,这里的 subtitles.srt 是你要添加到视频中的字幕文件的文件名。:charenc=UTF-8 表示字符编码,用于指定字幕文件的字符编码,这里是 UTF-8 编码。
  • -c:v libx264: 这个参数指定了视频编解码器,libx264 是一个常用的 H.264 视频编解码器。这个参数指定了视频流的编码方式,这里是将视频编码为 H.264 格式。
  • -c:a copy: 这个参数指定了音频编解码器,copy 表示直接复制音频流而不进行重新编码。这里是将音频流保持原样。
  • result.mp4: 这个参数指定了输出文件名,即生成的最终视频文件的文件名。在这个命令中,result.mp4 是生成的带有字幕的视频文件的文件名。

需要注意的是:charenc=UTF-8虽然设置了UTF-8,但需要确保服务器内有中文字体,不然合成出来的视频字幕中文会是乱码!

END

有兴趣的话可以试试!

相关推荐
寻找华年的锦瑟15 小时前
Qt-FFmpeg案例(0基础,包含环境配置)
开发语言·qt·ffmpeg
大新新大浩浩18 小时前
amazoncorretto:17镜像中安装ffmpeg
ffmpeg
Industio_触觉智能1 天前
瑞芯微RK3562平台FFmpeg硬件编解码移植及性能测试实战攻略
ffmpeg·视频编解码·瑞芯微·rk3562·触觉智能
八月的雨季 最後的冰吻1 天前
FFmepg--25-h265解码yuv格式
ffmpeg
weixin_462446231 天前
Python 使用 FFmpeg 给视频添加内嵌字幕(SRT)完整教程(含代码示例)
python·ffmpeg·音视频
百***35512 天前
从MySQL5.7平滑升级到MySQL8.0的最佳实践分享
ffmpeg
android_cai_niao2 天前
编译最新版本FFmpeg为so
ffmpeg·freetype·harfbuzz·drawtext·文字水印
feiyangqingyun2 天前
祖传独创/全网唯一/Qt结合ffmpeg实现读取ts文件节目流/动态切换多节目/实时切换不同轨道
qt·ffmpeg·节目流
快手技术2 天前
超越 VTM-RA!快手双向智能视频编码器 BRHVC 亮相 NeurIPS2025
音视频开发
i***58672 天前
从MySQL5.7平滑升级到MySQL8.0的最佳实践分享
ffmpeg