67 lines
2.2 KiB
Python
67 lines
2.2 KiB
Python
#!/usr/bin/env python3
|
|
import os
|
|
import subprocess
|
|
import whisper
|
|
from moviepy import VideoFileClip
|
|
from whisper.utils import get_writer
|
|
|
|
model = whisper.load_model("base")
|
|
|
|
def extract_audio(video_path, audio_temp_path):
|
|
# Create a temporary path for a sanitized copy of the video
|
|
sanitized_video_path = video_path.replace(".mp4", "_clean.mp4")
|
|
|
|
print("Sanitizing video metadata for MoviePy parser...")
|
|
# -map_chapters -1 removes chapter layouts that break the parser.
|
|
# -sn strips text/subtitle streams that crash MoviePy.
|
|
# -c copy copies video and audio instantly without quality loss.
|
|
cleanup_cmd = [
|
|
"ffmpeg", "-y", "-i", video_path,
|
|
"-map_chapters", "-1", "-sn",
|
|
"-c", "copy", sanitized_video_path
|
|
]
|
|
|
|
# Run the sanitization process silently
|
|
subprocess.run(cleanup_cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
|
|
print("Extracting uncompressed WAV audio...")
|
|
try:
|
|
# Load the sanitized file instead of the raw Twitch clip
|
|
with VideoFileClip(sanitized_video_path) as video:
|
|
video.audio.write_audiofile(
|
|
audio_temp_path,
|
|
fps=16000,
|
|
codec="pcm_s16le",
|
|
ffmpeg_params=["-ac", "1"]
|
|
)
|
|
finally:
|
|
# Always clean up the temporary sanitized video on Windows 11
|
|
if os.path.exists(sanitized_video_path):
|
|
os.remove(sanitized_video_path)
|
|
|
|
|
|
def transcribe_to_srt(audio_path, output_directory, output_filename):
|
|
print("Transcribing audio...")
|
|
result = model.transcribe(audio_path)
|
|
|
|
print("Creating SRT file...")
|
|
srt_writer = get_writer("srt", output_directory)
|
|
srt_writer(result, output_filename, {})
|
|
|
|
print(f"SRT subtitle file saved in: {output_directory}")
|
|
if os.path.exists(audio_path):
|
|
os.remove(audio_path)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
video_path = "my_video.mp4"
|
|
audio_temp_path = "temp_audio.wav" # Changed extension to .wav
|
|
|
|
output_dir = os.getcwd()
|
|
output_prefix = "my_video_subtitles"
|
|
|
|
extract_audio(video_path, audio_temp_path)
|
|
transcribe_to_srt(audio_temp_path, output_dir, output_prefix)
|
|
|
|
if os.path.exists(audio_temp_path):
|
|
os.remove(audio_temp_path) |