当前位置:AIGC资讯 > AIGC > 正文

利用Python与Whisper革新视频翻译:打造高精度字幕翻译流程。

实现流程需要使用以下的工具。

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

更新时间 2024-06-18