大家搞短视频创作,难免要去youtube等国外视频网站搞些素材。
国外视频大部分都是英文的。为了方便我们二次创作,如何提取音轨、识别文字、英对中的翻译呢?
流程基本如下:
-
从视频中提取音轨以便后续处理
-
语音识别技术将音频转换为文本
-
将转换后的文本翻译为中文
-
剪辑软件文本字幕
步骤1:提取视频音轨
需要从视频中提取音轨以便后续处理。为了实现这一步骤,我们可以使用moviepy库。在base虚拟环境中安装moviepy
pip install moviepy
VideoFileClip类加载视频文件,并使用audio属性提取音频。
然后,我们使用write_audiofile方法将音频保存到指定路径的文件中。
from moviepy.editor import VideoFileClip
def extract_audio(video_path, audio_path):
video = VideoFileClip(video_path)
audio = video.audio
audio.write_audiofile(audio_path)
# 我们测试一下
extract_audio(r"E:\01.mp4",r"E:\111.wav")
效果如下:
步骤2:使用语音识别将音频转换为文本
我们需要将音频转换为文本。为了实现这一步骤,我们可以使用SpeechRecognition库。
pip install SpeechRecognition
pip install vosk
这个库大部分是调用API,很多国外API我们访问不了,比如:Google Speech API
import speech_recognition as sr
import vosk
import json
def convert_audio_to_text(audio_path):
r = sr.Recognizer()
with sr.AudioFile(audio_path) as source:
print("正在读取内容....")
audio = r.record(source)
print("模型正在识别,要等待....")
# 这要注意去去vosk的官网下模型修改模型文件夹名称为model
# 保存到项目目录下
return r.recognize_vosk(audio)
# 测试一下函数
txt = convert_audio_to_text(r'E:\111.wav')
entext = json.loads(txt)['text']
print(entext)
效果如下图:
首先创建了一个Recognizer对象。然后,我们使用AudioFile对象加载音频文件,并使用record方法记录音频。
接下来,我们使用recognize_vosk方法将音频转换为文本。
步骤3:翻译文本为中文
获得了音频的文本表示,我们可以将其翻译为中文。为了实现这一步骤,我们可以百度翻译,去百度翻译云申请开发者账号和服务
https://api.fanyi.baidu.com/
import requests
import random
import json
from hashlib import md5
API_URL = 'http://api.fanyi.baidu.com/api/trans/vip/translate'
def translate_text(query, from_lang="en",to_lang="zh"):
appid = '你申请的appid'
appkey = '你申请的秘钥'
salt = random.randint(32768, 65536)
signstr = appid + query + str(salt) + appkey
sign = md5(signstr.encode("utf-8")).hexdigest()
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
payload = {'appid': appid, 'q': query, 'from': from_lang, 'to': to_lang, 'salt': salt, 'sign': sign}
# Send request
r = requests.post(API_URL, params=payload, headers=headers)
return r.json()
result = translate_text(entext)
print(json.dumps(result, indent=4, ensure_ascii=False))
txt = result['trans_result'][0]['dst']
print(txt)
with open('output.txt','w') as fp:
fp.write(txt)
我也有从剪映中提取文字,抽取字幕,导出字幕文本,然后翻译,下面是两个的对照结果。你感觉哪个更好一些?