实现流程需要使用以下的工具。
1.python,需要自行安装,
2.python的音视频处理库moviepy安装
pip install moviepy
3.Whisper语音识别,在我之前的文章中有:Whisper语音识别安装教程。
4.文字翻译,我这里使用百度翻译。
步骤一,提取视频中的音频。
首先,需要从视频中提取音频。使用python的moviepy库。
from moviepy.editor import AudioFileClip
video = "video.mp4"#假如有一个视频文件
audio = "audio.mp3"#分离出来的音频文件
# 提取音频
clip = AudioFileClip(video)
clip.write_audiofile(audio)
clip.close()
需要注意,分离出来的音频可能会存在背景音,没有背景音的可以直接识别音频。
这里可以使用UVR5人声伴奏分离,分离出人声。
UVR5百度网盘下载链接:链接:https://pan.baidu.com/s/1jBcTr3MTyZt12QIU4JryKg?pwd=znuu 提取码:znuu
UVR5的b站使用教程:最强伴奏人声提取工具 - 开源免费,一键安装,直接使用!| Ultimate Vocal Remover | UVR5_哔哩哔哩_bilibili
我这里使用GPT-SoVITS的api来实现人声伴奏分离
import requests
response = requests.post("http://localhost:9873/run/uvr_convert", json={
"data": [
"HP2_all_vocals",
"E:/视频翻译添加字幕/mp3",#输入待处理音频文件夹路径
"E:/视频翻译添加字幕/mp3",#定输出主人声文件夹
{"name":"zip.zip","data":"data:@file/octet-stream;base64,UEsFBgAAAAAAAAAAAAAAAAAAAAAAAA=="},#也可批量输入音频文件, 二选一, 优先读文件夹
"E:/视频翻译添加字幕/mp3",#指定输出非主人声文件夹
10,#人声提取激进程度
"mp3",#导出文件格式
]}).json()
data = response["data"]
print(data)#输出返回的内容
GPT-SoVITS是花儿不哭大佬研发的低成本AI音色克隆软件。目前只有TTS(文字转语音)功能。
这是一个声音克隆,文字转语音的软件。
GPT-SoVITS的中文教程文档:GPT-SoVITS指南 · 语雀
只是刚好有人声伴奏分离这个api就拿来用一下了。
步骤二,处理好音频后就是直接使用Whisper来实现语音转文字的效果。
可以直接到音频目录文件中的cmd窗口中执行以下命令。
whisper audio.mp3 --model medium
medium是模型,需要根据电脑的显存来进行选择。
python代码。
为了让python可以执行命令行中的命令,可以使用subprocess库
pip install subprocess
import subprocess
# 要执行的命令
command = "whisper audio.mp3 --model medium" # 这里使用的是 Windows 的 dir 命令,可以替换为其他命令
# 打开命令行并执行命令
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# 获取命令执行结果
output, error = process.communicate()
# 打印结果
print("Output:")
print(output.decode()) # 将字节转换为字符串并打印输出
if error:
print("Error:")
print(error.decode()) # 将字节转换为字符串并打印错误信息
在执行这个代码后,会得到下面的几个文件。
其中的.srt就是视频字幕文件,它的格式是这样的,有编号,有时间。
1
00:00:00,000 --> 00:00:04,000
This is unlimited money, and the next person to buy a Feastables bar at my local Walmart,
2
00:00:04,000 --> 00:00:05,800
we're going to kidnap and give this money to.
3
00:00:05,800 --> 00:00:07,200
Her hand is on the Feastables.
4
00:00:07,200 --> 00:00:08,200
It's literally touching my back.
5
00:00:08,200 --> 00:00:09,200
She's walking away.
步骤三,翻译字幕文件,这里使用百度翻译。
from langdetect import detect # 使用 langdetect 库来检测文本语言
import requests
import json
def tokens():
url = "https://aip.baidubce.com/oauth/2.0/token?client_id=请填写自己的API Key&client_secret=请填写自己的Secret Key&grant_type=client_credentials"
payload = json.dumps("")
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
json_data = json.loads(response.text)
return json_data['access_token']
token = tokens()
url = 'https://aip.baidubce.com/rpc/2.0/mt/texttrans/v1?access_token=' + token
# 读取文本文件的每一行并保存到数组中
lines = []
with open("audio.srt", "r", encoding="utf-8") as file:
for line in file:
lines.append(line.strip()) # 打开字幕文件,添加每一行到数组中,同时去除行末尾的换行符
# 循环数组,判断文本是否有某种语言。
for index, line in enumerate(lines):
# 检测文本语言
try:
lang = detect(line)#检测语言
# For list of language codes, please refer to `https://ai.baidu.com/ai-doc/MT/4kqryjku9#语种列表`
#需要翻译成什么语言。
from_lang = "en" #原语言,en是英文
to_lang = 'zh' # 目标语言,zh是中文
term_ids = '' # 术语库id,多个逗号隔开
# Build request
headers = {'Content-Type': 'application/json'}
payload = {'q': line, 'from': from_lang, 'to': to_lang, 'termIds' : term_ids}
# Send request
r = requests.post(url, params=payload, headers=headers)
result = r.json()
#修改语言
lines[index] =result['result']['trans_result'][0]['dst']
except:
lang = "unknown"
# 重新保存字幕文件
with open("audios.srt", "w", encoding="utf-8") as file:
for line in lines:
file.write(line + '\n')
上面只是实现了翻译的流程,并没有处理其他的问题。
翻译的结果:
1
00:00:00,000 --> 00:00:04,000
这是无限的钱,下一个在我当地的沃尔玛买盛宴酒吧的人,
2
00:00:04,000 --> 00:00:05,800
我们要绑架并把这些钱交给。
3
00:00:05,800 --> 00:00:07,200
她的手放在宴会桌上。
4
00:00:07,200 --> 00:00:08,200
它真的在摸我的背。
5
00:00:08,200 --> 00:00:09,200
她要走了。
最后一步是给视频添加字幕。
from moviepy.editor import concatenate_audioclips,concatenate_videoclips
import ffmpeg
#给视频添加字幕
try:
(
ffmpeg
.input('video.mp4')
.output('videos.mp4', vf='subtitles=audios.srt')
.run()
)
except ffmpeg.Error as e:
print('ffmpeg error:', e)
以上就是实现了给视频翻译并添加字幕的流程。
总结:
1.对于个人讲解的教程类视频翻译非常的完美,准确度非常高。
2.对于唱歌类的视频翻译效果很差。
当然了,还可以实现更多的功能。
比如添加GPT-SoVITS的声音克隆,文本转语音功能,让原本说英文的视频,让他直接说中文也是可以实现的,就是感觉会很麻烦。
我的个人博客地址:https://luguode.top/archives/2024_5_6/66384ce92215b.html