#python #python-3.x #speech-recognition #speech-to-text
#python #python-3.x #распознавание речи #преобразование речи в текст
Вопрос:
У меня есть приложение для преобразования речи в текст, и я немного теряюсь в догадках, как эффективно обработать ответ и организовать его в виде транскрипции. Я передаю функции транскрибирования 45-секундные фрагменты следующим образом: all_text = pool.map(transcribe, enumerate(files))
. Это ответ, который я получаю:
all text: [{'idx': 0, 'text': ['users outnumber', ' future'], 'participant': 'str_MIC_Ct3G_con_O6qn4m00bs', 'file_index': 0, 'words': [{'word': 'users', 'start_time': 0, 'participant': 'str_MIC_Ct3G_con_O6qn4m00bs'}, {'word': 'outnumber', 'start_time': 0, 'participant': 'str_MIC_Ct3G_con_O6qn4m00bs'}, {'word': 'future', 'start_time': 4, 'participant': 'str_MIC_Ct3G_con_O6qn4m00bs'}]},
{'idx': 1, 'text': ["and the sustainable energy'], 'participant': 'str_MIC_Ct3G_con_O6qn4m00bs', 'file_index': 1, 'words': [{'word': 'and', 'start_time': 45, 'participant': 'str_MIC_Ct3G_con_O6qn4m00bs'}, {'word': 'the', 'start_time': 45, 'participant': 'str_MIC_Ct3G_con_O6qn4m00bs'}, {'word': 'sustainable', 'start_time': 45, 'participant': 'str_MIC_Ct3G_con_O6qn4m00bs'}, {'word': 'energy', 'start_time': 52, 'participant': 'str_MIC_Ct3G_con_O6qn4m00bs'}]}]
Итак, здесь у меня было два фрагмента по 45 секунд из речи Илона Маска. Я сократил большую часть ответа, чтобы сделать его короче, но, как вы можете видеть, есть два фрагмента с индексами 0 и 1. Мне интересно, как я могу получить транскрипцию из этого ответа на основе значения word starting_time? Здесь у меня ушло всего несколько секунд, но, конечно, я могу получить и nanos. Можно ли создать другой список, в который будут вставлены все слова, а затем отсортировать список с использованием starting_time? Это подводит меня ко второму вопросу: насколько это эффективно? Если у меня, наконец, будет список слов длиной в милю и другая информация от нескольких пользователей, вероятно, возникнут какие-то проблемы? Есть ли какой-нибудь лучший способ сделать это?
Редактировать. Это то, что я пробовал. Это работает с короткими сеансами, но приложение вылетает при более длительных. Интересно, связано ли это как-то с тем, что список становится слишком большим?
words = []
clean_transcript = ''
for word in alternative.words:
words.append({'word': word.word, 'start_time': word.start_time.seconds, 'participant': participant})
words.sort(key=lambda x: x['start_time'])
print('ALL WORDS: ', words)
for w in words:
clean_transcript = w['word'] ' '
print(clean_transcript)
Есть ли какое-то очевидное «не делай это так»?
Комментарии:
1. сначала попробуйте сделать это с помощью обычного
for
цикла (или даже с помощью вложенныхfor
циклов).2. вы можете использовать list
clean_transcript = []
иclean_transcript.append(w['word'])
, а затем преобразовать в одну строкуclean_transcript = " ".join(clean_transcript)
3. Он сортируется, когда поступает от транскриптора, да, но когда я запускаю, например, десять аудиофайлов с помощью этой функции, они сортируются по файлам за раз. И я хочу, чтобы они были отсортированы к тому времени, когда все они будут готовы, независимо от того, из какого файла поступают данные. Итак, в окончательном списке я хочу, чтобы данные были в порядке во времени из всех разных файлов.
4. теперь
sort()
имеет смысл. Код выглядит нормально — и он более удобочитаем, чем понимание списка в моем ответе.5. тогда код
" ".join(clean_transcript)
должен работать быстрее, чем biclean_transcript = w['word'] ' '
, но разница должна быть видна только в очень больших данных. Обычноprint()
в цикле проблема решается лучше, потому что отображение занимает много времени, и peole сначала удаляетprint()
или печатает меньше текста (т. Е. только.
поставьте точку, чтобы увидеть, работает ли код по-прежнему), чтобы сделать код быстрее. Я бы скорее ожидал проблем с отправкой и получением данных в / из Google Speach, чем с этой частью кода. С большими данными в конечном итоге подразделения могут сохранить его вpandas.DataFrame
, которые используют код, созданный на C / C , и он может работать быстрее.
Ответ №1:
Сначала вы должны попробовать использовать обычный for
цикл или, скорее, вложенные for
циклы.
text = [
{'idx': 0, 'text': ['users outnumber', ' future'], 'participant': 'str_MIC_Ct3G_con_O6qn4m00bs', 'file_index': 0, 'words': [{'word': 'users', 'start_time': 0, 'participant': 'str_MIC_Ct3G_con_O6qn4m00bs'}, {'word': 'outnumber', 'start_time': 0, 'participant': 'str_MIC_Ct3G_con_O6qn4m00bs'}, {'word': 'future', 'start_time': 4, 'participant': 'str_MIC_Ct3G_con_O6qn4m00bs'}]},
{'idx': 1, 'text': ['and the sustainable energy'], 'participant': 'str_MIC_Ct3G_con_O6qn4m00bs', 'file_index': 1, 'words': [{'word': 'and', 'start_time': 45, 'participant': 'str_MIC_Ct3G_con_O6qn4m00bs'}, {'word': 'the', 'start_time': 45, 'participant': 'str_MIC_Ct3G_con_O6qn4m00bs'}, {'word': 'sustainable', 'start_time': 45, 'participant': 'str_MIC_Ct3G_con_O6qn4m00bs'}, {'word': 'energy', 'start_time': 52, 'participant': 'str_MIC_Ct3G_con_O6qn4m00bs'}]}
]
for item in text:
print('---', item['idx'], '---')
for word in item['words']:
if word['start_time'] >= 45:
print(word['start_time'], word['word'])
Результат:
--- 0 ---
--- 1 ---
45 and
45 the
45 sustainable
52 energy
А позже вы можете попытаться преобразовать его в понимание списка.
result = [[(word['start_time'], word['word']) for word in item['words'] if word['start_time'] >= 45] for item in text]
print(result)
Результат
[[], [(45, 'and'), (45, 'the'), (45, 'sustainable'), (52, 'energy')]]
Или без start_time
result = [[word['word'] for word in item['words'] if word['start_time'] >= 45] for item in text]
print(result)
Результат
[[], ['and', 'the', 'sustainable', 'energy']]
Или, если вы хотите создать плоский список вместо подсписков
result = [word['word'] for item in text for word in item['words'] if word['start_time'] >= 45]
print(result)
Результат
['and', 'the', 'sustainable', 'energy']
Комментарии:
1. Спасибо, попробую это на моем коде. Не могли бы вы также проверить мою правку, там есть пример, как я пытался решить свою проблему.