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

有兴趣的话可以试试!

相关推荐
cuijiecheng20184 小时前
音视频入门基础:FLV专题(13)——FFmpeg源码中,解析任意Type值的SCRIPTDATAVALUE类型的实现
ffmpeg·音视频
dvlinker20 小时前
【音视频开发】使用支持硬件加速的D3D11绘图遇到的绘图失败与绘图崩溃问题的记录与总结
音视频开发·c/c++·视频播放·d3d11·d3d11绘图模式
小神.Chen1 天前
YouTube音视频合并批处理基于 FFmpeg的
ffmpeg·音视频
昱禹2 天前
记一次因视频编码无法在浏览器播放、编码视频报错问题
linux·python·opencv·ffmpeg·音视频
寻找09之夏3 天前
【FFmpeg 深度解析】:全方位视频合成
ffmpeg·音视频
zanglengyu3 天前
ffmpeg取rtsp流音频数据保存声音为wav文件
ffmpeg·音视频
cuijiecheng20183 天前
音视频入门基础:FLV专题(11)——FFmpeg源码中,解析SCRIPTDATASTRING类型的ScriptDataValue的实现
ffmpeg·音视频
汪子熙3 天前
什么是 LDAC、SBC 和 AAC 音频编码技术
ffmpeg·音视频·aac
cpp_learners3 天前
Windows环境 源码编译 FFmpeg
windows·ffmpeg·源码编译·ffmpeg源码编译
cuijiecheng20183 天前
音视频入门基础:FLV专题(8)——FFmpeg源码中,解码Tag header的实现
ffmpeg·音视频