基于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

有兴趣的话可以试试!

相关推荐
aqi0016 小时前
FFmpeg开发笔记(七十二)Linux给FFmpeg集成MPEG-5视频编解码器EVC
android·ffmpeg·音视频·流媒体
不太会编程的IT男2 天前
在 Jetson Orin 开发套件上使用 Hardware Encoder / Decoder 构建 FFmpeg
ffmpeg·视频编解码·h.264
m0_687399842 天前
写一个Ununtu C++ 程序,调用ffmpeg API, 来判断一个数字电影的视频文件mxf 是不是Jpeg2000?
开发语言·c++·ffmpeg
aqi002 天前
FFmpeg开发笔记(七十一)使用国产的QPlayer2实现双播放器观看视频
android·ffmpeg·音视频·流媒体
Java患者·2 天前
【小白】linux安装ffmpeg | java转码 【超详细】
ffmpeg
suifen_2 天前
RK平台ffmpeg支持硬件编解码
ffmpeg
feiyangqingyun2 天前
全网唯一/Qt结合ffmpeg实现手机端采集摄像头推流到rtsp或rtmp/可切换前置后置摄像头/指定分辨率帧率
qt·智能手机·ffmpeg
melonbo2 天前
使用FFmpeg将H.264码流封装为MP4
ffmpeg·音视频·h.264
aqi002 天前
FFmpeg开发笔记(七十七)Android的开源音视频剪辑框架RxFFmpeg
android·ffmpeg·音视频·流媒体
慢行的骑兵2 天前
Android音视频探索之旅 | CMake基础语法 && 创建支持Ffmpeg的Android项目
ffmpeg·音视频