40 lines
1.1 KiB
Python
40 lines
1.1 KiB
Python
# convert_to_opus.py — Default voice pipeline: bandpass + compressor + limiter + gate
|
|
|
|
import subprocess
|
|
import os
|
|
|
|
def convert_to_opus(input_path, output_path):
|
|
if not os.path.exists(input_path):
|
|
raise FileNotFoundError(f"Input file not found: {input_path}")
|
|
|
|
filters = [
|
|
"highpass=f=400", # low-cut below 400 Hz
|
|
"lowpass=f=12000", # high-cut above 12 kHz
|
|
"acompressor=threshold=-18dB",
|
|
"alimiter=limit=-1dB",
|
|
"agate=threshold=0.02"
|
|
]
|
|
|
|
cmd = [
|
|
"ffmpeg", "-y",
|
|
"-i", input_path,
|
|
"-af", ",".join(filters),
|
|
"-ac", "1",
|
|
"-ar", "24000",
|
|
"-c:a", "libopus",
|
|
"-b:a", "40k",
|
|
"-vbr", "on",
|
|
"-application", "voip",
|
|
output_path
|
|
]
|
|
|
|
try:
|
|
subprocess.run(cmd, check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
except subprocess.CalledProcessError as e:
|
|
raise RuntimeError(f"FFmpeg conversion failed: {e}")
|
|
|
|
if not os.path.exists(output_path):
|
|
raise RuntimeError("Conversion did not produce output.")
|
|
|
|
return output_path
|