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)