Pythonを使用したAI–音声認識

この章では、PythonでAIを使用した音声認識について学習します。

スピーチは、成人の人間のコミュニケーションの最も基本的な手段です。音声処理の基本的な目標は、人間と機械の間の相互作用を提供することです。

音声処理システムには主に3つのタスクがあります-

  • First、私たちが話す単語、フレーズ、文を機械がキャッチできるようにする音声認識

  • Second、機械が私たちの話していることを理解できるようにする自然言語処理、および

  • Third、機械が話すことを可能にする音声合成。

この章では、 speech recognition、人間が話す言葉を理解するプロセス。音声信号はマイクを使用してキャプチャされ、システムによって理解される必要があることを忘れないでください。

音声認識機能の構築

音声認識または自動音声認識(ASR)は、ロボット工学などのAIプロジェクトの注目の的です。ASRがなければ、認知ロボットが人間と相互作用することを想像することはできません。ただし、音声認識機能を構築するのは簡単ではありません。

音声認識システムの開発の難しさ

高品質の音声認識システムを開発することは、本当に難しい問題です。音声認識技術の難しさは、以下で説明するように、さまざまな側面に沿って広く特徴付けることができます。

  • Size of the vocabulary−語彙のサイズは、ASRの開発のしやすさに影響します。理解を深めるために、次のサイズの語彙を検討してください。

    • 小さなサイズの語彙は、たとえば、音声メニューシステムのように、2〜100語で構成されます。

    • 中規模の語彙は、たとえばデータベース検索タスクのように、数百から数千の単語で構成されます。

    • 大きなサイズの語彙は、一般的な口述タスクのように、数十万の単語で構成されています。

    語彙のサイズが大きいほど、認識を実行するのが難しくなることに注意してください。

  • Channel characteristics−チャネル品質も重要な側面です。たとえば、人間のスピーチには全周波数範囲の高帯域幅が含まれますが、電話のスピーチには限られた周波数範囲の低帯域幅が含まれます。後者の方が難しいことに注意してください。

  • Speaking mode− ASRの開発のしやすさは、発話モード、つまり、発話が孤立語モード、接続語モード、または連続発話モードのいずれであるかによっても異なります。連続したスピーチは認識しにくいことに注意してください。

  • Speaking style−読み上げのスピーチは、フォーマルなスタイルでも、カジュアルなスタイルで自発的かつ会話的なものでもかまいません。後者は認識が困難です。

  • Speaker dependency−音声は、話者に依存する、話者に適応する、または話者に依存しない場合があります。独立したスピーカーは構築が最も困難です。

  • Type of noise− ASRを開発する際に考慮すべきもう1つの要素は、ノイズです。信号対雑音比は、バックグラウンドノイズが少ないか多いかを観察する音響環境に応じて、さまざまな範囲になります。

    • 信号対雑音比が30dBより大きい場合、それは高範囲と見なされます

    • 信号対雑音比が30dBから10dbの間にある場合、それは中程度のSNRと見なされます

    • 信号対雑音比が10dB未満の場合、低範囲と見なされます

    たとえば、静止した、人間以外のノイズ、バックグラウンドスピーチ、他のスピーカーによるクロストークなどのバックグラウンドノイズのタイプも、問題の難しさに寄与します。

  • Microphone characteristics−マイクの品質は、良好、平均、または平均以下の場合があります。また、口とマイクの間の距離は変化する可能性があります。これらの要素は、認識システムでも考慮する必要があります。

これらの困難にもかかわらず、研究者は、音声信号、話者の理解、アクセントの特定など、音声のさまざまな側面に多くの作業を行いました。

音声認識機能を構築するには、以下の手順に従う必要があります-

オーディオ信号の視覚化-ファイルからの読み取りと作業

これは、音声信号がどのように構成されているかを理解できるため、音声認識システムを構築するための最初のステップです。オーディオ信号を操作するために従うことができるいくつかの一般的な手順は次のとおりです-

録音

ファイルからオーディオ信号を読み取る必要がある場合は、最初にマイクを使用して録音します。

サンプリング

マイクで録音する場合、信号はデジタル化された形式で保存されます。しかし、それに取り組むために、マシンは離散的な数値形式でそれらを必要とします。したがって、特定の周波数でサンプリングを実行し、信号を離散数値形式に変換する必要があります。サンプリングに高周波数を選択することは、人間が信号を聞くとき、それを連続的なオーディオ信号として感じることを意味します。

次の例は、ファイルに保存されているPythonを使用して、オーディオ信号を分析するための段階的なアプローチを示しています。このオーディオ信号の周波数は44,100HZです。

ここに示すように、必要なパッケージをインポートします-

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

次に、保存されているオーディオファイルを読み取ります。サンプリング周波数とオーディオ信号の2つの値を返します。ここに示すように、オーディオファイルが保存されているパスを指定します-

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

次に、保存されているオーディオファイルを読み取ります。サンプリング周波数とオーディオ信号の2つの値を返します。ここのコマンドに示すように、オーディオファイルが保存されているパスを指定します-

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)

ここで、周波数領域信号の正規化を行い、それを2乗します-

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

ここで、パワーをデシベル(dB)で抽出します-

signal_power = 10 * np.log10(signal_frequency)

X軸の周波数をkHzで調整します-

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()

下の画像に示すように、上記のコードの出力グラフを確認できます。

モノトーンオーディオ信号の生成

これまで見てきた2つのステップは、信号について学ぶために重要です。ここで、この手順は、いくつかの事前定義されたパラメーターを使用してオーディオ信号を生成する場合に役立ちます。この手順では、オーディオ信号が出力ファイルに保存されることに注意してください。

次の例では、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

次に、保存されているオーディオファイルを読み取ります。サンプリング周波数とオーディオ信号の2つの値を返します。保存されているオーディオファイルのパスを指定します。

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()

上記の手順の結果として、次の出力を確認できます。MFCCの場合は図1、フィルターバンクの場合は図2

話し言葉の認識

音声認識とは、人間が話しているときに機械がそれを理解することを意味します。ここでは、PythonでGoogle SpeechAPIを使用してそれを実現しています。このために次のパッケージをインストールする必要があります-

  • 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)

これで、google APIが音声を認識し、出力を提供します。

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

次の出力を見ることができます-

Please Say Something:
You said:

たとえば、あなたが言った場合 tutorialspoint.com、システムはそれを次のように正しく認識します-

tutorialspoint.com