AI Transcriber tool
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
def extract_audio(video_path, output_path=None):
|
||||
"""
|
||||
Extracts audio from a video file using ffmpeg.
|
||||
|
||||
Args:
|
||||
video_path (str): Path to the input video file.
|
||||
output_path (str, optional): Path for the output audio file.
|
||||
If None, defaults to same name with .wav extension.
|
||||
|
||||
Returns:
|
||||
str: Path to the generated audio file.
|
||||
"""
|
||||
if not os.path.exists(video_path):
|
||||
raise FileNotFoundError(f"Video file not found: {video_path}")
|
||||
|
||||
if output_path is None:
|
||||
base_name = os.path.splitext(video_path)[0]
|
||||
output_path = f"{base_name}.wav"
|
||||
|
||||
# Check if output file already exists to avoid redundant processing
|
||||
if os.path.exists(output_path):
|
||||
print(f"Audio file already exists: {output_path}")
|
||||
return output_path
|
||||
|
||||
print(f"Extracting audio from {video_path}...")
|
||||
|
||||
# Command matching the user's preferred settings: 16kHz, Mono, PCM s16le
|
||||
# -y overwrites without asking (though we checked existence above, this is for safety if we force it)
|
||||
command = [
|
||||
"ffmpeg",
|
||||
"-i", video_path,
|
||||
"-ar", "16000",
|
||||
"-ac", "1",
|
||||
"-c:a", "pcm_s16le",
|
||||
"-y",
|
||||
"-v", "error", # Less verbose
|
||||
output_path
|
||||
]
|
||||
|
||||
try:
|
||||
subprocess.run(command, check=True)
|
||||
print(f"Audio extracted to: {output_path}")
|
||||
return output_path
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f"Error extracting audio: {e}")
|
||||
sys.exit(1)
|
||||
|
||||
def embed_subtitles(video_path, srt_path, output_path=None):
|
||||
"""
|
||||
Embeds subtitles into the video file (Soft Subs) and sets them as primary.
|
||||
|
||||
Args:
|
||||
video_path (str): Path to the input video.
|
||||
srt_path (str): Path to the SRT file.
|
||||
output_path (str, optional): Path for the output video.
|
||||
"""
|
||||
if not os.path.exists(video_path) or not os.path.exists(srt_path):
|
||||
print("Error: Video or SRT file not found for embedding.")
|
||||
return
|
||||
|
||||
if output_path is None:
|
||||
base, ext = os.path.splitext(video_path)
|
||||
output_path = f"{base}.subbed{ext}"
|
||||
|
||||
print(f"Embedding subtitles into: {output_path}...")
|
||||
|
||||
# Determine subtitle codec based on container
|
||||
sub_codec = "mov_text" if video_path.lower().endswith(".mp4") else "srt"
|
||||
|
||||
# Command breakdown:
|
||||
# -map 0:v -map 0:a -> Keep all video and audio from source
|
||||
# -map 1:0 -> Add the subtitle from the 2nd input (srt_path)
|
||||
# -c copy -> Copy video/audio streams (no re-encoding)
|
||||
# -disposition:s:0 default -> Make the first subtitle track (ours) the default
|
||||
# -metadata:s:s:0 -> Set metadata for the first subtitle stream
|
||||
|
||||
command = [
|
||||
"ffmpeg",
|
||||
"-i", video_path,
|
||||
"-i", srt_path,
|
||||
"-map", "0:v",
|
||||
"-map", "0:a",
|
||||
"-map", "1:0",
|
||||
"-c", "copy",
|
||||
"-c:s", sub_codec,
|
||||
"-disposition:s:0", "default",
|
||||
"-metadata:s:s:0", "language=eng",
|
||||
"-metadata:s:s:0", "title=English (AI Translated)",
|
||||
"-y",
|
||||
"-v", "error",
|
||||
output_path
|
||||
]
|
||||
|
||||
try:
|
||||
subprocess.run(command, check=True)
|
||||
print(f"Subtitles embedded successfully: {output_path} (Set as primary)")
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f"Error embedding subtitles: {e}")
|
||||
Reference in New Issue
Block a user