这是一款python源码,实现将没有文字字幕的视频,通过语音识别技术识别为文本,然后重写将字幕添加到视频底部的效果代码。
注意调用的是google语音识别服务,确保你的网络能访问谷歌。
import os
import speech_recognition as sr
from moviepy.editor import VideoFileClip, TextClip, CompositeVideoClip
from pydub import AudioSegment
def extract_audio(video_path):
video = VideoFileClip(video_path)
audio = video.audio
audio.write_audiofile("temp_audio.wav")
return "temp_audio.wav"
def transcribe_audio(audio_path):
recognizer = sr.Recognizer()
audio = AudioSegment.from_wav(audio_path)
# 将音频分割成较小的片段
chunk_length_ms = 10000 # 10秒
chunks = [audio[i:i+chunk_length_ms] for i in range(0, len(audio), chunk_length_ms)]
transcriptions = []
for i, chunk in enumerate(chunks):
chunk.export(f"temp_chunk_{i}.wav", format="wav")
with sr.AudioFile(f"temp_chunk_{i}.wav") as source:
audio_data = recognizer.record(source)
try:
text = recognizer.recognize_google(audio_data, language="zh-CN")
transcriptions.append((i * chunk_length_ms / 1000, text))
except sr.UnknownValueError:
print(f"Could not understand audio in chunk {i}")
except sr.RequestError as e:
print(f"Could not request results from Google Speech Recognition service; {e}")
os.remove(f"temp_chunk_{i}.wav")
return transcriptions
def create_subtitle_clips(transcriptions, videosize, fontsize=24, font='Arial', color='white', method='caption'):
subtitle_clips = []
for i, (t, text) in enumerate(transcriptions):
if i < len(transcriptions) - 1:
duration = transcriptions[i+1][0] - t
else:
duration = 5 # 最后一个字幕显示5秒
text_clip = TextClip(text, fontsize=fontsize, font=font, color=color, size=videosize, method=method)
text_clip = text_clip.set_pos('bottom').set_duration(duration).set_start(t)
subtitle_clips.append(text_clip)
return subtitle_clips
def add_subtitles_to_video(video_path, output_path):
# 提取音频
audio_path = extract_audio(video_path)
# 转写音频
transcriptions = transcribe_audio(audio_path)
# 创建视频剪辑
video = VideoFileClip(video_path)
# 创建字幕剪辑
subtitle_clips = create_subtitle_clips(transcriptions, video.size)
# 将字幕添加到视频
final_video = CompositeVideoClip([video] + subtitle_clips)
# 写入新视频
final_video.write_videofile(output_path)
# 清理临时文件
os.remove(audio_path)
# 使用示例
input_video = "inputvideo.mp4"
output_video = "output.mp4"
add_subtitles_to_video(input_video, output_video) 网友回复


