Мне очень тяжело с этой проблемой. Я все еще новичок, так что, конечно, ожидается.
Вот что я хочу:
Я пытаюсь использовать какой-то алгоритм принудительного выравнивания, чтобы извлечь начальные и конечные временные метки для транскрипта и аудиофайла.
Проблема в том, что аудиофайл содержит посторонние слова и предложения, которые намеренно удалены из стенограммы. (Например, «Можете ли вы переместить этот стул? Хорошо ...»)
К счастью, я нашел этот замечательный инструмент под названием Нежный , который очень точен и может выдержать эти несоответствия, отлично!
Я использовал этот инструмент для получения меток времени принудительного выравнивания на уровне слов.
Это тип вывода, который он мне дал ...
Слова , Обнаруженные слова , Время начала слова в секундах , Время окончания Word в секундах
,, 0,0, 0,07
вопрос, вопрос, 0,07, 0,19
, составляет 0,19, 0,33
....
А и 823, 823,2
и др. c.
Итак, теперь у меня есть файл CSV с метками времени для каждого слова (исключая пунктуацию, конечно), отлично!
Как теперь из этого получить временные метки для каждой строки в моем текстовом файле с расшифровкой?
Я знаю, что могу преобразовать секунды в часы-минуты-секунды. Очень просто. Но я не знаю, как я могу написать скрипт, который принимает текстовый файл, который выглядит следующим образом:
"Вопрос в следующем. Почему, черт возьми, это так сложно сделать? вы просто делаете начальную временную отметку для уровня предложения и уровня абзаца, если вы так точны?
Поэтому я сказал себе: может быть, у людей с переполнением стека есть решение, эти люди склонны быть очень рад приветствовать новичков! Очень теплый и услужливый, я никогда в своей жизни не был так благодарен за публикацию сообщения о том, как глупый новичок в переполнении стека ».
И каким-то образом анализирует CSV и получает время начала этого абзаца и время окончания. Я уже пытался сделать это, но я сталкиваюсь с самыми странными проблемами.
Некоторые определения, чтобы (попытаться) понять, что происходит в моем коде: «выровнять по index.csv» относится к CSV-файлу, о котором я говорил выше, из Gentle, за исключением того, что я добавил к нему индекс, так что что я могу исключить уже проанализированные слова Что я пытаюсь сделать в приведенном ниже коде? Я пытаюсь выяснить, могу ли я получить точную последовательность слов, которая соответствует каждому абзацу, и записать ее в CSV рядом с индексом абзаца. Почему? Потому что, если я могу это сделать, тогда я могу получить индекс первого слова и последнего слова для каждого абзаца и использовать этот индекс для извлечения меток времени из первого и последнего слов этого абзаца.
Вот мой тупой ужасный ужасный код (я не рекомендую читать его, если вы не заинтересованы в том, чтобы ослепнуть. Вместо этого я был бы признателен за любой лучший метод или помощь):
header_added = False
aligndict = {}
with open('align with index.csv', 'r') as f:
csv_reader = csv.reader(f, delimiter=',')
for row in csv_reader:
index = row[0]
start = row[3]
end = row[4]
word = row[1]
#if index not in aligndict.keys():
aligndict.update({index:[word, start, end]})
with open('transcript.txt', 'r') as f:
lines = f.readlines()
paragraphindextimestamps = {}
words_start_end_index = {}
lastwordinalignment = 0
lastparagraphindex = 0.01 #arbitrary value
indextogetridof = set([])
lines_dict = {}
for index_for_line, line in enumerate(lines):
lines_dict.update({index_for_line:line})
for index_for_paragraph, line in lines_dict.items():
last2words = line.split()[-2:]
listofwords = []
if line == '\n':
continue
if line == '\n\n':
continue
if line == '\n\n\n':
continue
for index, wordstartend in aligndict.items():
tobreakornot = False
word_in_alignment = wordstartend[0]
if word_in_alignment and lastwordinalignment in last2words:
tobreakornot = True
#at this point it seems to lose track of the index of paragraph right after the index in indextogetridof and continue
if index in indextogetridof:
continue
indextogetridof.add(index)
start = wordstartend[1]
end = wordstartend[2]
if index_for_paragraph not in words_start_end_index.keys():
words_start_end_index.update({index_for_paragraph:[word_in_alignment]})
elif index_for_paragraph in words_start_end_index.keys():
words_start_end_index[index_for_paragraph].append([word_in_alignment])
lastwordinalignment = word_in_alignment
if tobreakornot == True:
break
lastparagraphindex = index_for_paragraph
for index_for_paragraph_inside_dict, words in words_start_end_index.items():
with open('paragraphindextimestamps.csv', 'a') as csv_writer:
csv_writer = csv.writer(csv_writer, delimiter=',',quotechar='"', quoting=csv.QUOTE_MINIMAL)
if not header_added:
csv_writer.writerow(['Paragraph Index', 'Words in Alignment'])
header_added = True
csv_writer.writerow([index_for_paragraph_inside_dict, words])
for index_for_paragraph, words in words_start_end_index.items():
with open('paragraphindextimestamps.csv', 'a') as csv_writer:
csv_writer = csv.writer(csv_writer, delimiter=',',quotechar='"', quoting=csv.QUOTE_MINIMAL)
if not header_added:
csv_writer.writerow(['Paragraph Index', 'Words in Alignment'])
header_added = True
csv_writer.writerow([index_for_paragraph, words])
Так что же происходит, когда вы запускаете этот код? Ваш компьютер взрывается. Больше похоже на то, как ты взрываешься изнутри. Код дает надежду на вывод:
Индекс абзаца, выравнивание слов
2, ['words', ['The'], ['question' ], ['is'], ['this'], ['Why'] и др. c. (до конца первого абзаца / строки, отлично!)
3, ['So'], ['I'], ['сказали'], ['to'], ['себя' ] - подождите минуту, это продолжается до конца всего текста, каждое отдельное слово до конца заканчивается в этом небольшом ряду, и тогда больше не будет идеальных абзацев, как первый, сценарий просто заканчивается.
Буду рад любой помощи.