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

有兴趣的话可以试试!

相关推荐
EasyCVR12 分钟前
EHOME视频平台EasyCVR视频融合平台使用OBS进行RTMP推流,WebRTC播放出现抖动、卡顿如何解决?
人工智能·算法·ffmpeg·音视频·webrtc·监控视频接入
简鹿办公1 小时前
使用 FFmpeg 进行音视频转换的相关命令行参数解释
ffmpeg·简鹿视频格式转换器·ffmpeg视频转换
EasyCVR5 小时前
萤石设备视频接入平台EasyCVR多品牌摄像机视频平台海康ehome平台(ISUP)接入EasyCVR不在线如何排查?
运维·服务器·网络·人工智能·ffmpeg·音视频
runing_an_min5 小时前
ffmpeg 视频滤镜:屏蔽边框杂色- fillborders
ffmpeg·音视频·fillborders
岁月小龙15 小时前
如何让ffmpeg运行时从当前目录加载库,而不是从/lib64
ffmpeg·origin·ffprobe·rpath
关键帧Keyframe2 天前
音视频面试题集锦第 7 期
音视频开发·视频编码·客户端
关键帧Keyframe2 天前
音视频面试题集锦第 8 期
ios·音视频开发·客户端
行者记2 天前
ffmpeg命令——从wireshark包中的rtp包中分离h264
测试工具·ffmpeg·wireshark
EasyCVR2 天前
国标GB28181视频平台EasyCVR私有化视频平台工地防盗视频监控系统方案
运维·科技·ffmpeg·音视频·1024程序员节·监控视频接入
hypoqqq2 天前
使用ffmpeg播放rtsp视频流
ffmpeg