Как вырезать ("подрезать") аудио с отметками времени Python - PullRequest
1 голос
/ 04 февраля 2020

Хорошо, это очень, очень, очень сложная проблема. Я провел уже 3 дня, и это похоже на математическую задачу на приз тысячелетия.

Хорошо, у меня есть .ttml меток времени, где я проанализировал видео в формате mp4 и удалил субтитры. Предполагается, что эти временные метки являются реальным звуком в видео (в основном эти временные метки являются звуком в видео)

Вот как выглядит .ttml

<p begin="00:00:04.550" end="00:00:06.920" style="s2">hello bob</p>
<p begin="00:00:07.500" end="00:00:10.075" style="s2">hey man lets play hockey/p>
<p begin="00:00:10.366" end="00:00:14.100" style="s2">sure</p>
<p begin="00:00:16.210" end="00:00:18.980" style="s2">actually I cannot</p>
<p begin="00:00:21.260" end="00:00:23.230" style="s2">Ok maybe next time</p>

Я использовал модуль datetime для посчитайте разницу всех временных меток и суммируйте их.

def calculate_time(file_name: str):
print("WTF")
diff = datetime.timedelta()

file_text = "".join(open(file_name).readlines())
p_tags = Selector(text=file_text).xpath("//p").getall()
for ptag in p_tags:
    begin = Selector(text=ptag).xpath("//@begin").get()
    endie = Selector(text=ptag).xpath("//@end").get()

    start_time = dt.strptime(begin, '%H:%M:%S.%f')
    endie_time = dt.strptime(endie, '%H:%M:%S.%f')

    diff += endie_time-start_time

  return diff


for fname in glob.glob(r"temp_results/*.ttml"):

    current_time = calculate_time(file_name=fname)

Приведенный выше код говорит, что моя общая временная метка (на самом деле звук в видео) составляет 7: 09 минут

Теперь вот где все становится действительно сложно , Таким образом, в mp4, где я получил эти метки времени / сабы, я преобразовал его в файл WAV. Звук wav-файла 9 минут

Как мне отредактировать wav-файл так, чтобы он на самом деле брал аудио из mp4 или самого себя, а включает только звук, указанный в файл метки времени ??

Я пытался использовать Pydub https://github.com/jiaaro/pydub, но я только вижу это, мне нужно как-то вычесть метки времени или преобразовать в миллисекунды ?? из pydub импортировать AudioSegment

 audio = AudioSegment.from_wav("never_gonna_give_you_up.wav")
 ten_seconds = 10 * 1000


 new_audio = audio[-5000:] .  #5000 = timestamp datetime object?
...