AI с Python - Распознавание речи

В этой главе мы узнаем о распознавании речи с использованием ИИ с Python.

Речь - это самое основное средство общения взрослых людей. Основная цель обработки речи - обеспечить взаимодействие человека и машины.

Система обработки речи имеет в основном три задачи:

  • First, распознавание речи, которое позволяет машине улавливать слова, фразы и предложения, которые мы произносим

  • Second, обработка естественного языка, позволяющая машине понимать, о чем мы говорим, и

  • Third, синтез речи, чтобы машина могла говорить.

В этой главе основное внимание уделяется speech recognition, процесс понимания слов, которые говорят люди. Помните, что речевые сигналы фиксируются с помощью микрофона, а затем они должны быть поняты системой.

Создание распознавателя речи

Распознавание речи или автоматическое распознавание речи (ASR) находится в центре внимания таких проектов ИИ, как робототехника. Без ASR невозможно представить когнитивного робота, взаимодействующего с человеком. Однако создать распознаватель речи непросто.

Трудности в разработке системы распознавания речи

Разработка качественной системы распознавания речи - действительно сложная задача. Сложность технологии распознавания речи можно в общих чертах охарактеризовать по ряду аспектов, как обсуждается ниже:

  • Size of the vocabulary- Размер словарного запаса влияет на легкость разработки ASR. Для лучшего понимания рассмотрите следующие объемы словарного запаса.

    • Небольшой словарный запас состоит из 2-100 слов, например, как в системе голосового меню.

    • Словарь среднего размера состоит из нескольких сотен или тысяч слов, например, как в задаче поиска в базе данных.

    • Большой словарный запас состоит из нескольких десятков тысяч слов, как в общем задании на диктовку.

    Учтите, что чем больше словарный запас, тем труднее выполнять распознавание.

  • Channel characteristics- Качество канала также является важным параметром. Например, человеческая речь имеет широкую полосу пропускания с полным частотным диапазоном, тогда как телефонная речь состоит из узкой полосы пропускания с ограниченным частотным диапазоном. Учтите, что в последнем случае сложнее.

  • Speaking mode- Простота разработки ASR также зависит от режима разговора, то есть от того, идет ли речь в режиме изолированного слова, в режиме связного слова или в режиме непрерывной речи. Обратите внимание, что непрерывную речь труднее распознать.

  • Speaking style- Прочитанная речь может быть формальной или спонтанной и разговорной с повседневным стилем. Последних распознать сложнее.

  • Speaker dependency- Речь может быть зависимой от говорящего, адаптивной или независимой. Сложнее всего построить независимый динамик.

  • Type of noise- Шум - еще один фактор, который следует учитывать при разработке ASR. Отношение сигнал / шум может быть в различных диапазонах, в зависимости от акустической среды, в которой наблюдается меньше фонового шума или больше -

    • Если отношение сигнал / шум больше 30 дБ, это считается высоким диапазоном.

    • Если отношение сигнал / шум находится в пределах от 30 до 10 дБ, это считается средним SNR.

    • Если отношение сигнал / шум меньше 10 дБ, это считается низким диапазоном.

    Например, тип фонового шума, такой как стационарный, нечеловеческий шум, фоновая речь и перекрестные помехи от других ораторов, также усложняет проблему.

  • Microphone characteristics- Качество микрофона может быть хорошим, средним или ниже среднего. Также может варьироваться расстояние между ртом и микрофоном. Эти факторы также следует учитывать для систем распознавания.

Несмотря на эти трудности, исследователи много работали над различными аспектами речи, такими как понимание речевого сигнала, говорящего и определение акцентов.

Вам нужно будет выполнить следующие шаги, чтобы создать распознаватель речи -

Визуализация аудиосигналов - чтение из файла и работа с ним

Это первый шаг в построении системы распознавания речи, поскольку он дает понимание того, как структурирован звуковой сигнал. Некоторые общие шаги, которые можно выполнить для работы со звуковыми сигналами, следующие:

Запись

Когда вам нужно прочитать аудиосигнал из файла, сначала запишите его с помощью микрофона.

Отбор проб

При записи с микрофона сигналы сохраняются в оцифрованном виде. Но чтобы работать с этим, машине они нужны в дискретной числовой форме. Следовательно, мы должны выполнить выборку на определенной частоте и преобразовать сигнал в дискретную числовую форму. Выбор высокой частоты для выборки подразумевает, что когда люди слушают сигнал, они воспринимают его как непрерывный звуковой сигнал.

пример

В следующем примере показан пошаговый подход к анализу аудиосигнала с использованием Python, который хранится в файле. Частота этого аудиосигнала составляет 44 100 Гц.

Импортируйте необходимые пакеты, как показано здесь -

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile

Теперь прочтите сохраненный аудиофайл. Он вернет два значения: частоту дискретизации и звуковой сигнал. Укажите путь к аудиофайлу, в котором он хранится, как показано здесь -

frequency_sampling, audio_signal = wavfile.read("/Users/admin/audio_file.wav")

Отобразите параметры, такие как частота дискретизации аудиосигнала, тип данных сигнала и его продолжительность, используя показанные команды -

print('\nSignal shape:', audio_signal.shape)
print('Signal Datatype:', audio_signal.dtype)
print('Signal duration:', round(audio_signal.shape[0] / 
float(frequency_sampling), 2), 'seconds')

Этот шаг включает в себя нормализацию сигнала, как показано ниже -

audio_signal = audio_signal / np.power(2, 15)

На этом этапе мы извлекаем первые 100 значений из этого сигнала для визуализации. Для этого используйте следующие команды -

audio_signal = audio_signal [:100]
time_axis = 1000 * np.arange(0, len(signal), 1) / float(frequency_sampling)

Теперь визуализируйте сигнал, используя команды, приведенные ниже -

plt.plot(time_axis, signal, color='blue')
plt.xlabel('Time (milliseconds)')
plt.ylabel('Amplitude')
plt.title('Input audio signal')
plt.show()

Вы сможете увидеть выходной график и данные, извлеченные для вышеуказанного аудиосигнала, как показано на изображении здесь.

Signal shape: (132300,)
Signal Datatype: int16
Signal duration: 3.0 seconds

Характеристика аудиосигнала: преобразование в частотную область

Характеристика аудиосигнала включает преобразование сигнала временной области в частотную область и понимание его частотных компонентов с помощью. Это важный шаг, потому что он дает много информации о сигнале. Вы можете использовать математический инструмент, такой как преобразование Фурье, для выполнения этого преобразования.

пример

В следующем примере показано, шаг за шагом, как охарактеризовать сигнал с помощью Python, который хранится в файле. Обратите внимание, что здесь мы используем математический инструмент преобразования Фурье, чтобы преобразовать его в частотную область.

Импортируйте необходимые пакеты, как показано здесь -

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile

Теперь прочтите сохраненный аудиофайл. Он вернет два значения: частоту дискретизации и звуковой сигнал. Укажите путь к аудиофайлу, в котором он хранится, как показано в команде здесь -

frequency_sampling, audio_signal = wavfile.read("/Users/admin/sample.wav")

На этом шаге мы отобразим такие параметры, как частота дискретизации аудиосигнала, тип данных сигнала и его продолжительность, используя команды, приведенные ниже -

print('\nSignal shape:', audio_signal.shape)
print('Signal Datatype:', audio_signal.dtype)
print('Signal duration:', round(audio_signal.shape[0] / 
float(frequency_sampling), 2), 'seconds')

На этом этапе нам нужно нормализовать сигнал, как показано в следующей команде -

audio_signal = audio_signal / np.power(2, 15)

Этот шаг включает извлечение длины и половинной длины сигнала. Для этого используйте следующие команды -

length_signal = len(audio_signal)
half_length = np.ceil((length_signal + 1) / 2.0).astype(np.int)

Теперь нам нужно применить математические инструменты для преобразования в частотную область. Здесь мы используем преобразование Фурье.

signal_frequency = np.fft.fft(audio_signal)

Теперь сделайте нормализацию сигнала частотной области и возведите его в квадрат -

signal_frequency = abs(signal_frequency[0:half_length]) / length_signal
signal_frequency **= 2

Затем извлеките длину и половину длины преобразованного по частоте сигнала -

len_fts = len(signal_frequency)

Обратите внимание, что преобразованный сигнал Фурье должен быть настроен как для четного, так и для нечетного случая.

if length_signal % 2:
   signal_frequency[1:len_fts] *= 2
else:
   signal_frequency[1:len_fts-1] *= 2

Теперь извлеките мощность в децибалах (дБ) -

signal_power = 10 * np.log10(signal_frequency)

Отрегулируйте частоту в кГц для оси X -

x_axis = np.arange(0, len_half, 1) * (frequency_sampling / length_signal) / 1000.0

Теперь представьте себе характеристику сигнала следующим образом -

plt.figure()
plt.plot(x_axis, signal_power, color='black')
plt.xlabel('Frequency (kHz)')
plt.ylabel('Signal power (dB)')
plt.show()

Вы можете наблюдать выходной график приведенного выше кода, как показано на изображении ниже -

Генерация монотонного аудиосигнала

Два шага, которые вы видели до сих пор, важны для изучения сигналов. Теперь этот шаг будет полезен, если вы хотите сгенерировать аудиосигнал с некоторыми предопределенными параметрами. Обратите внимание, что этот шаг сохранит аудиосигнал в выходном файле.

пример

В следующем примере мы собираемся сгенерировать монотонный сигнал с помощью Python, который будет сохранен в файле. Для этого вам нужно будет предпринять следующие шаги -

Импортируйте необходимые пакеты, как показано -

import numpy as np
import matplotlib.pyplot as plt
from scipy.io.wavfile import write

Укажите файл, в котором должен быть сохранен выходной файл

output_file = 'audio_signal_generated.wav'

Теперь укажите параметры по вашему выбору, как показано -

duration = 4 # in seconds
frequency_sampling = 44100 # in Hz
frequency_tone = 784
min_val = -4 * np.pi
max_val = 4 * np.pi

На этом этапе мы можем сгенерировать аудиосигнал, как показано -

t = np.linspace(min_val, max_val, duration * frequency_sampling)
audio_signal = np.sin(2 * np.pi * tone_freq * t)

Теперь сохраните аудиофайл в выходном файле -

write(output_file, frequency_sampling, signal_scaled)

Извлеките первые 100 значений для нашего графика, как показано -

audio_signal = audio_signal[:100]
time_axis = 1000 * np.arange(0, len(signal), 1) / float(sampling_freq)

Теперь визуализируйте сгенерированный звуковой сигнал следующим образом -

plt.plot(time_axis, signal, color='blue')
plt.xlabel('Time in milliseconds')
plt.ylabel('Amplitude')
plt.title('Generated audio signal')
plt.show()

Вы можете наблюдать сюжет, как показано на рисунке, приведенном здесь -

Извлечение функций из речи

Это наиболее важный шаг в создании распознавателя речи, потому что после преобразования речевого сигнала в частотную область мы должны преобразовать его в пригодную для использования форму вектора признаков. Для этой цели мы можем использовать различные методы извлечения функций, такие как MFCC, PLP, PLP-RASTA и т. Д.

пример

В следующем примере мы собираемся извлекать функции из сигнала, шаг за шагом, используя Python, используя технику MFCC.

Импортируйте необходимые пакеты, как показано здесь -

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
from python_speech_features import mfcc, logfbank

Теперь прочтите сохраненный аудиофайл. Он вернет два значения - частоту дискретизации и звуковой сигнал. Укажите путь к аудиофайлу, в котором он хранится.

frequency_sampling, audio_signal = wavfile.read("/Users/admin/audio_file.wav")

Обратите внимание, что здесь мы берем на анализ первые 15000 проб.

audio_signal = audio_signal[:15000]

Используйте методы MFCC и выполните следующую команду, чтобы извлечь функции MFCC:

features_mfcc = mfcc(audio_signal, frequency_sampling)

Теперь распечатайте параметры MFCC, как показано -

print('\nMFCC:\nNumber of windows =', features_mfcc.shape[0])
print('Length of each feature =', features_mfcc.shape[1])

Теперь постройте и визуализируйте функции MFCC, используя команды, приведенные ниже -

features_mfcc = features_mfcc.T
plt.matshow(features_mfcc)
plt.title('MFCC')

На этом этапе мы работаем с функциями банка фильтров, как показано -

Извлеките функции банка фильтров -

filterbank_features = logfbank(audio_signal, frequency_sampling)

Теперь распечатайте параметры набора фильтров.

print('\nFilter bank:\nNumber of windows =', filterbank_features.shape[0])
print('Length of each feature =', filterbank_features.shape[1])

Теперь постройте и визуализируйте функции банка фильтров.

filterbank_features = filterbank_features.T
plt.matshow(filterbank_features)
plt.title('Filter bank')
plt.show()

В результате описанных выше шагов вы можете наблюдать следующие выходные данные: Рисунок 1 для MFCC и Рисунок 2 для банка фильтров.

Распознавание произнесенных слов

Распознавание речи означает, что когда люди говорят, машина их понимает. Здесь мы используем Google Speech API в Python, чтобы это произошло. Для этого нам нужно установить следующие пакеты -

  • Pyaudio - Его можно установить с помощью pip install Pyaudio команда.

  • SpeechRecognition - Этот пакет можно установить с помощью pip install SpeechRecognition.

  • Google-Speech-API - Его можно установить с помощью команды pip install google-api-python-client.

пример

Обратите внимание на следующий пример, чтобы понять распознавание произносимых слов -

Импортируйте необходимые пакеты, как показано -

import speech_recognition as sr

Создайте объект, как показано ниже -

recording = sr.Recognizer()

Теперь Microphone() модуль примет голос как вход -

with sr.Microphone() as source: recording.adjust_for_ambient_noise(source)
   print("Please Say something:")
   audio = recording.listen(source)

Теперь API Google распознает голос и выдаст результат.

try:
   print("You said: \n" + recording.recognize_google(audio))
except Exception as e:
   print(e)

Вы можете увидеть следующий результат -

Please Say Something:
You said:

Например, если вы сказали tutorialspoint.com, то система распознает его правильно следующим образом -

tutorialspoint.com