Обработка ответа из Google Speech

#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) должен работать быстрее, чем bi clean_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. Спасибо, попробую это на моем коде. Не могли бы вы также проверить мою правку, там есть пример, как я пытался решить свою проблему.