前言
看美剧想翻译字幕,就想起了这个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
有兴趣的话可以试试!