improve example subrip to mp3 perf

This commit is contained in:
rany
2022-03-10 14:51:46 +02:00
parent 05e31e6f08
commit 842352ddce
2 changed files with 69 additions and 44 deletions

View File

@@ -1,6 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import asyncio import asyncio
import os
import shutil import shutil
import subprocess import subprocess
import sys import sys
@@ -14,7 +15,7 @@ if shutil.which("ffmpeg") is None:
def parse_srt(srt_file): def parse_srt(srt_file):
with open(srt_file, "r") as f: with open(srt_file, "r", encoding="utf-8") as f:
data = f.read().strip().split("\n\n") data = f.read().strip().split("\n\n")
data = [i.strip() for i in data] data = [i.strip() for i in data]
data = [(*i.split("\n")[:2], " ".join(i.split("\n")[2:])) for i in data] data = [(*i.split("\n")[:2], " ".join(i.split("\n")[2:])) for i in data]
@@ -86,48 +87,71 @@ async def _main(srt_data, voice_name, out_file):
stderr=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
) )
input_files = []
input_files_start = {}
with tempfile.TemporaryDirectory() as temp_dir:
for i in srt_data: for i in srt_data:
print(f"Processing {i[0]}...")
fname = os.path.join(temp_dir, f"{i[0]}.mp3")
input_files.append(fname)
duration = i[1].replace(",", ".") duration = i[1].replace(",", ".")
duration = duration.split("-->") duration = duration.split("-->")
start = duration[0].split(":") start = duration[0].split(":")
start = int(start[0]) * 3600 + int(start[1]) * 60 + float(start[2]) start = int(start[0]) * 3600 + int(start[1]) * 60 + float(start[2])
input_files_start[fname] = start
end = duration[1].split(":") end = duration[1].split(":")
end = int(end[0]) * 3600 + int(end[1]) * 60 + float(end[2]) end = int(end[0]) * 3600 + int(end[1]) * 60 + float(end[2])
duration = end - start duration = end - start
with tempfile.NamedTemporaryFile(suffix=".mp3") as temporary_file: with open(fname, "wb") as f:
async for j in communicate.run( async for j in communicate.run(
i[2], codec="audio-24khz-48kbitrate-mono-mp3", voice=voice_name i[2], codec="audio-24khz-48kbitrate-mono-mp3", voice=voice_name
): ):
if j[2] is not None: if j[2] is not None:
temporary_file.write(j[2]) f.write(j[2])
temporary_file2 = tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) temporary_file = tempfile.NamedTemporaryFile(
try: suffix=".mp3", delete=False
ensure_audio_length(
temporary_file.name, temporary_file2.name, duration
) )
try:
ensure_audio_length(fname, temporary_file.name, duration)
finally: finally:
shutil.move(temporary_file2.name, temporary_file.name) shutil.move(temporary_file.name, fname)
ffmpeg_opts = []
for i in range(len(input_files)):
ffmpeg_opts.append("-i")
ffmpeg_opts.append(input_files[i])
filter_complex = ""
for i in range(len(input_files)):
filter_complex += (
f"aevalsrc=0:d={input_files_start[input_files[i]]}[s{i+1}];"
)
filter_complex += f"[s{i+1}][{i+1}:a]concat=n=2:v=0:a=1[ac{i+1}];"
filter_complex += f"[0:a]"
for i in range(len(input_files)):
filter_complex += f"[ac{i+1}]"
filter_complex += f"amix={len(input_files)+1}[aout]"
ffmpeg_opts.append("-filter_complex")
ffmpeg_opts.append(filter_complex)
ffmpeg_opts.append("-map")
ffmpeg_opts.append("[aout]")
temporary_file2 = tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) temporary_file2 = tempfile.NamedTemporaryFile(suffix=".mp3", delete=False)
try: try:
print("Concatenating...")
subprocess.call( subprocess.call(
[ ["ffmpeg", "-y", "-i", mother_temp_file.name]
"ffmpeg", + ffmpeg_opts
"-y", + [temporary_file2.name],
"-i",
mother_temp_file.name,
"-i",
temporary_file.name,
"-filter_complex",
f"aevalsrc=0:d={start}[s1];[s1][1:a]concat=n=2:v=0:a=1[ac1];[0:a][ac1]amix=2[aout]",
"-map",
"[aout]",
temporary_file2.name,
],
stdout=subprocess.DEVNULL, stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
) )
@@ -135,6 +159,7 @@ async def _main(srt_data, voice_name, out_file):
shutil.move(temporary_file2.name, mother_temp_file.name) shutil.move(temporary_file2.name, mother_temp_file.name)
finally: finally:
shutil.move(mother_temp_file.name, out_file) shutil.move(mother_temp_file.name, out_file)
print("Done")
def main(): def main():

View File

@@ -1,2 +1,2 @@
find src -name '*.py' | xargs black find src examples -name '*.py' | xargs black
find src -name '*.py' | xargs isort find src examples -name '*.py' | xargs isort