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

有兴趣的话可以试试!

相关推荐
可乐鸡翅yeah_1 天前
多浏览器 HLS 兼容性差异排查,Chrome、Firefox、Safari 表现不一致定位
chrome·ffmpeg·音视频·firefox·safari·m3u8
字节跳动视频云技术团队2 天前
火山引擎 AI MediaKit X 懂车帝,探索汽车内容智能创作新方式
人工智能·音视频开发
行者-全栈开发2 天前
Spring Boot + FFmpeg 视频批量处理实战:压缩、HLS切片与异步任务引擎
spring boot·ffmpeg·异步处理·视频压缩·hls切片·批量任务·redis队列
可乐鸡翅yeah_2 天前
M3U8测试流使用指南,流媒体开发自测与环境校验标准化方案
网络·ffmpeg·音视频·m3u8·m3u8在线·音视频在线播放
heqingchun162 天前
Ubuntu 22.04 交叉编译 RK3568 MPP + FFmpeg 完整指南
linux·ubuntu·ffmpeg
刘广睿2 天前
音频降噪实战:ffmpeg 滤镜、RNNoise 与人声分离方案对比
ffmpeg·音视频·效率工具·剪辑
IvorySQL3 天前
代价比较的变革——PostgreSQL执行计划干预增强深度解析
数据库·postgresql·ffmpeg
老孙讲技术4 天前
【监控开发】把车间未戴帽和烟火报警接进安监值班群:workwearDetect 对图与 setMessageCallback 订 smokeAlarm
后端·物联网·音视频开发
≮傷£≯√5 天前
Qt 面试(一)
qt·ffmpeg·音视频
刘广睿6 天前
视频字幕从提取到烧录:SRT/ASS 格式与 ffmpeg 字幕滤镜全流程
ffmpeg·音视频·效率工具·剪辑·字幕