Artificial-intelligence-with-python-speech-recognition

提供:Dev Guides
移動先:案内検索

PythonとAI –音声認識

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

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

音声処理システムは主に3つのタスクを持っています-

  • 最初、機械が私たちが話す単語、フレーズ、文章をキャッチできる音声認識
  • *第二に、機械が私たちの話すことを理解できるようにする自然言語処理
  • 第三、機械が話すことを可能にする音声合成。

この章では、音声認識、つまり人間が話す言葉を理解するプロセスに焦点を当てます。 音声信号はマイクの助けを借りて取り込まれ、システムがそれを理解する必要があることに注意してください。

音声認識機能の構築

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

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

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

語彙のサイズ-語彙のサイズは、ASRの開発の容易さに影響します。 理解を深めるために、次のサイズの語彙を検討してください。

  • たとえば、音声メニューシステムのように、小さな語彙は2〜100語で構成されます。
  • 中規模の語彙は、たとえばデータベース検索タスクのように、数百から数千の単語で構成されます
  • 大規模な語彙は、一般的な口述タスクのように、数万の単語で構成されています。

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

チャネル特性-チャネルの品質も重要な要素です。 たとえば、人間の音声には全周波数範囲の高帯域幅が含まれていますが、電話音声には制限された周波数範囲の低帯域幅が含まれています。 後者の方が難しいことに注意してください。

スピーキングモード-ASRの開発のしやすさは、スピーキングモードにも依存します。つまり、スピーチが分離ワードモード、接続ワードモード、または連続スピーチモードのいずれであるかによって異なります。 連続した音声は認識しにくいことに注意してください。

スピーキングスタイル-読み上げのスピーチは、フォーマルなスタイルでも、カジュアルなスタイルで自発的で会話的なものでもかまいません。 後者は認識しにくいです。

スピーカー依存性-スピーチは、スピーカー依存、スピーカー適応、またはスピーカー非依存です。 独立したスピーカーは、構築するのが最も困難です。

ノイズのタイプ-ノイズは、ASRを開発する際に考慮すべきもう1つの要因です。 バックグラウンドノイズが少ないか多いかを観察する音響環境に応じて、S/N比はさまざまな範囲にあります。

  • S/N比が30dBを超える場合、高音域と見なされます
  • S/N比が30dB〜10dbの場合、SNRは中程度と見なされます。
  • S/N比が10dB未満の場合、低レンジと見なされます

たとえば、定常雑音、人間以外の雑音、背景音声、および他のスピーカーによるクロストークなどの背景雑音の種類も、問題の難しさに寄与します。

マイクの特性-マイクの品質は、良好、平均、または平均以下です。 また、口とマイクの間の距離はさまざまです。 これらの要因は、認識システムでも考慮する必要があります。

これらの困難にもかかわらず、研究者は、音声信号、話者の理解、アクセントの識別など、音声のさまざまな側面に多大な労力を費やしました。

あなたは、音声認識を構築するために、以下に示す手順に従う必要があります-

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

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

録音

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

サンプリング

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

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

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

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)

今、周波数領域の信号の正規化を行い、それを二乗-

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などのさまざまな特徴抽出手法を使用できます。 この目的のために。

次の例では、MFCC手法を使用して、Pythonを使用して段階的に信号から特徴を抽出します。

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

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)

次に、filterbankパラメーターを印刷します。

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 Speech APIを使用してそれを実現しています。 このために次のパッケージをインストールする必要があります-

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

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

finddevguides.com