+
108
-

回答

这是一款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)

网友回复

我知道答案,我要回答