Python と Keras でシンプルな音声認識エンジンを作成する

Python と Keras でシンプルな音声認識エンジンを作成する

音声認識とは、機械またはプログラムが話し言葉の単語やフレーズを認識し、機械が読み取り可能な形式に変換する機能です。通常、これらのアルゴリズムの単純な実装では語彙が限られており、単語やフレーズしか認識できない可能性があります。ただし、Cloud Speech-to-Text や Amazon Transcribe などのより複雑なアルゴリズムには、豊富な語彙があり、方言、ノイズ、俗語が組み込まれています。

[[317333]]

この記事では、次のことを説明します。

  • 音声テキスト変換の仕組み
  • 音声を文字起こし用に処理する方法
  • Keras を使用した問題解決のためのディープラーニング モデル
  • このモデルを評価する一つの方法は
  • 予測モデルをプロジェクトに統合するためのスクリプト

導入

音声は、単に声帯によって周囲の空気が振動することで生成される一連の音波です。これらの音波はマイクによって記録され、電気信号に変換されます。次に、信号は高度な信号処理技術を使用して処理され、音節と単語が分離されます。ディープラーニングの驚くべき進歩のおかげで、コンピューターは経験から音声を理解することも学べるようになりました。

音声認識は、音響および言語モデリングによるアルゴリズムを使用して機能します。音響モデリングは、音声とオーディオ信号の言語単位間の関係を表します。言語モデリングは、音を単語のシーケンスに一致させて、同じように聞こえる単語を区別するのに役立ちます。通常、再帰層に基づくディープラーニング モデルは、音声の時間的パターンを認識してシステム内の精度を向上させるために使用されます。隠れマルコフモデル (最初の音声認識アルゴリズムはこのアプローチを使用しました) などの他のアプローチも使用できます。この記事では、音響モデルについてのみ説明します。

信号処理

オーディオ波をアルゴリズムが処理できる要素に変換する方法はいくつかありますが、そのうちの 1 つ (このチュートリアルで使用する方法) は、等間隔のポイントで音波の高さを記録することです。

毎秒何千回も読み取り、その瞬間の音波の高さを表す数値を記録します。これは非圧縮の .wav オーディオ ファイルです。 「CD 品質」のオーディオは 44.1 kHz (1 秒あたり 44,100 回の読み取り) でサンプリングされます。しかし、音声認識の場合、16khz (1秒あたり16,000サンプル) のサンプリング レートは、人間の音声の周波数範囲をカバーするのに十分すぎるほどです。

この方法では、オーディオは数値のベクトルで表され、各数値は 1/16000 秒間隔での音波の振幅を表します。このプロセスは、次の例に示すように、画像の前処理に似ています。

ナイキストの定理 (1933 — ウラジミール コテルニコフ) のおかげで、サンプリング レートが記録したい最高周波数の 2 倍以上であれば、数学を使用して間隔を置いたサンプルから元の音波を完全に再構築できることがわかっています。

Python ライブラリ

このタスクを実行するために、Anaconda 環境 (Python 3.7) と次の Python ライブラリを使用します。

  • iPython (バージョン 7.10.2)
  • ケラス (v 2.2.4)
  • リブロサ (v 0.7.2)
  • scipy (バージョン 1.1.0)
  • sklearn (バージョン 0.20.1)
  • サウンドデバイス (v 0.3.14)
  • テンソルフロー (v 1.13.1)
  • テンソルフロー GPU (v 1.13.1)
  • numpy (バージョン 1.17.2)

  1. tensorflow.compat.v1からConfigProto をインポートします
  2. tensorflow.compat.v1からセッションをインポートする
  3. インポートOS
  4. librosa をインポートする
  5. IPython.displayをipdとしてインポートする
  6. matplotlib.pyplot をpltとしてインポートします。
  7. numpyをnpとしてインポートする
  8. scipy.ioからwavファイルをインポート
  9. 輸入警告
  10.  
  11. config = ConfigProto()
  12. config.gpu_options.allow_growth = True  
  13. sess = セッション(config=config)
  14.  
  15. 警告をフィルターする( "無視する" )

1. データセット

私たちの実験では、TensorFlow が提供する音声コマンド データセットを使用します。これは、何千人もの人々が発した 30 個の短い単語の 1 秒間の発話 65,000 回で構成されています。簡単な音声コマンドを理解できる音声認識システムを構築します。データセットはここからダウンロードできます。

2. オーディオ波形を前処理する

使用されたデータセットでは、一部のレコードの継続時間が 1 秒未満であり、サンプリング レートが高すぎます。そこで、音波を読み取り、次の前処理手順を使用してこの問題を解決してみましょう。実行する 2 つの手順は次のとおりです。

  • 再サンプリング
  • 1秒未満の短いコマンドを削除する

次の Python コード スニペットでこれらの前処理手順を定義しましょう。

  1. train_audio_path = './train/audio/'  
  2.  
  3. すべての波 = []
  4. すべてのラベル = []
  5. ラベル内のラベルの場合:
  6. 印刷(ラベル)
  7. waves = [f for f in os.listdir(train_audio_path + '/' + label) if f.endswith( '.wav' )]
  8. の中のwavの場合:
  9. サンプル、sample_rate = librosa.load (train_audio_path + '/' + label + '/' + wav、sr=16000)
  10. サンプル = librosa.resample(サンプル、sample_rate、8000)
  11. len(サンプル数)== 8000の場合:
  12. all_wave.append(サンプル)
  13. all_label.append(ラベル)

上記から、信号のサンプリング レートは 16000 Hz であることがわかります。音声関連の周波数のほとんどは 8000 Hz であるため、8000 Hz に再サンプリングします。

2 番目のステップはラベルを処理することです。これは多目的問題なので、ここでは出力ラベルを整数エンコーディングに変換し、整数でエンコードされたラベルをワンホット ベクトルに変換します。

  1. sklearn.preprocessingからLabelEncoder をインポートします
  2. keras.utilsからnp_utilsをインポートする
  3.  
  4. label_enconder = ラベルエンコーダー()
  5. y = label_encoder.fit_transform(すべてのラベル)
  6. クラス = リスト(label_enconder.classes_)
  7. y = np_utils.to_categorical(y, num_classes=len(ラベル))

前処理ステップの最後のステップは、conv1d への入力が 3D 配列である必要があるため、2D 配列を 3D に再形成することです。

  1. all_wave = np.array(all_wave).reshape(-1,8000,1)

3. トレーニングセットと検証セットを作成する

ディープラーニング モデルを実行するには、2 つのセット (トレーニングと検証) を生成する必要があります。この実験では、データの 80% を使用してモデルをトレーニングし、残りの 20% を使用して検証しました。

  1. sklearn.model_selectionからtrain_test_split をインポートします
  2. x_train、x_valid、y_train、y_valid = train_test_split(np.array(all_wave)、np.array(y)、stratify=y、test_size=0.2、random_state=777、shuffle= True )

4. 機械学習モデルのアーキテクチャ

私は Conv1d と GRU レイヤーを使用して音声認識用のネットワークをモデル化しています。 Conv1d は 1 次元のみで畳み込みを実行する畳み込みニューラル ネットワークですが、GRU の目標は標準的な再帰型ニューラル ネットワークの勾配消失問題を解決することです。 GRU は LSTM のバリエーションとも見なすことができます。この 2 つは設計が似ており、場合によっては同様に優れた結果を生み出すことができるためです。

このモデルは、よく知られている 2 つの音声認識方法、deepspeech h2 アルゴリズムと Wav2letter++ アルゴリズムに基づいています。次のコードは、Keras を使用して提案されたモデルを示しています。

  1. keras.layersからBidirectional、BatchNormalization、CuDNNGRU、TimeDistributed をインポートします
  2. keras.layersからDense、Dropout、Flatten、Conv1D、Input、MaxPooling1D をインポートします。
  3. keras.modelsからモデルをインポート
  4. keras.callbacksからEarlyStopping、ModelCheckpoint をインポートします
  5. kerasからバックエンドをKとしてインポートします
  6. K.clear_session()
  7.  
  8. 入力 = Input(shape=(8000,1))
  9. x = BatchNormalization(軸=-1、運動量=0.99、イプシロン=1e-3、中心= True 、スケール= True )(入力)
  10. #最初のConv1Dレイヤー
  11. x = Conv1D(8,13, パディング= 'valid' 、アクティベーション= 'relu' 、ストライド= 1)(x)
  12. x = MaxPooling1D(3)(x)
  13. x = ドロップアウト(0.3)(x)
  14. # 2番目のConv1Dレイヤー
  15. x = Conv1D(16, 11, パディング= 'valid' 、アクティベーション= 'relu' 、ストライド= 1)(x)
  16. x = MaxPooling1D(3)(x)
  17. x = ドロップアウト(0.3)(x)
  18. #3番目のConv1Dレイヤー
  19. x = Conv1D(32, 9, パディング= 'valid' 、アクティベーション= 'relu' 、ストライド= 1)(x)
  20. x = MaxPooling1D(3)(x)
  21. x = ドロップアウト(0.3)(x)
  22. x = BatchNormalization(軸=-1、運動量=0.99、イプシロン=1e-3、中心= True 、スケール= True )(x)
  23. x = 双方向(CuDNNGRU(128, return_sequences= True ), merge_mode= 'sum' )(x)
  24. x = 双方向(CuDNNGRU(128, return_sequences= True ), merge_mode= 'sum' )(x)
  25. x = 双方向(CuDNNGRU(128, return_sequences= False ), merge_mode= 'sum' )(x)
  26. x = BatchNormalization(軸=-1、運動量=0.99、イプシロン=1e-3、中心= True 、スケール= True )(x)
  27. #レイヤーをフラット化
  28. # x = フラット化()(x)
  29. #高密度レイヤー1
  30. x = Dense(256, activation= 'relu' )(x)
  31. 出力 = Dense(len(labels), activation= "softmax" )(x)
  32. モデル = モデル(入力、出力)
  33. モデル.要約()

注: このモデルのトレーニングに CPU のみを使用する場合は、CuDNNGRU レイヤーを GRU に置き換えます。

次のステップは、多クラス分類問題であるため、損失関数をカテゴリクロスエントロピーとして定義することです。

  1. model.compile(損失= 'categorical_crossentropy' 、オプティマイザー= 'nadam' 、メトリック=[ 'accuracy' ])

早期停止とモデル チェックポイントは、適切なタイミングでニューラル ネットワークのトレーニングを停止し、各エポック後に最適なモデルを保存するためのコールバックです。

  1. early_stop = EarlyStopping(モニター= 'val_loss' 、モード= 'min' 、詳細=1、忍耐=10、min_delta=0.0001)
  2. チェックポイント= ModelCheckpoint( 'speech2text_model.hdf5' 、モニター= 'val_acc' 、詳細= 1、save_best_only= True 、モード= 'max' )

バッチサイズ 32 で機械学習モデルをトレーニングし、ホールドアウト セットでパフォーマンスを評価してみましょう。

  1. hist = モデル.fit(
  2. x=x_train、
  3. y=y_train、
  4. エポック=100、
  5. コールバック=[early_stop,チェックポイント],
  6. バッチサイズ=32、
  7. 検証データ=(x_valid,y_valid)

このコマンドの出力は次のとおりです。

5. 視覚化

時間の経過に伴う機械学習モデルのパフォーマンスを理解するために、視覚化を活用します。

  1. matplotlibからpyplotをインポートする
  2. pyplot.plot(hist.history[ '損失' ], ラベル= '列車' )
  3. pyplot.plot(hist.history[ 'val_loss' ], ラベル= 'test' )
  4. pyplot.凡例()
  5. pyplot.show()

6. 予測

このステップでは、最適な重みを読み込み、オーディオを認識してテキストに変換するための関数を定義します。

  1. keras.modelsからload_modelをインポートする
  2. モデル = load_model( 'speech2text_model.hdf5' )
  3.  
  4. def s2t_predict(オーディオ、shape_num=8000):
  5. 確率 = model.predict(audio.reshape(1,shape_num,1))
  6. インデックス= np.argmax(prob[0])
  7. 戻りクラス[インデックス]

検証データに基づいて予測を行います。

  1. ランダムにインポート
  2. インデックス= random.randint(0,len(x_valid)-1)
  3. サンプル = x_valid[インデックス].ravel()
  4. print( "オーディオ: " ,classes[np.argmax(y_valid[インデックス])])
  5. ipd.Audio(サンプル、レート=8000)

これは、ユーザーに音声コマンドを録音するように促すスクリプトです。独自の音声コマンドを録音し、機械学習モデルでテストすることができます。

  1. サウンドデバイスをSDとしてインポート
  2. サウンドファイルをSFとしてインポート
  3.  
  4. サンプルレート = 16000
  5. 期間 = 1 # 秒
  6. ファイル名 = 'yes.wav'  
  7. print( "開始" )
  8. mydata = sd.rec( int (サンプルレート * 期間), サンプルレート=サンプルレート,
  9. チャネル=1、ブロッキング= True )
  10. print( "終了" )
  11. sd.wait()
  12. sf.write(ファイル名, mydata, サンプルレート)

最後に、保存した音声コマンドを読み取ってテキストに変換するスクリプトを作成します。

  1. #音声コマンドの読み上げ
  2. テスト、test_rate = librosa.load ( './test/left.wav' 、 sr=16000)
  3. test_sample = librosa.resample(テスト、test_rate、4351)
  4. 印刷(test_sample.shape)
  5. ipd.Audio(テストサンプル、レート=8000)
  6.  
  7. #音声コマンドをテキスト変換する
  8. s2t_predict(テストサンプル)

やっと

音声認識技術は私たちの日常生活の一部になっていますが、現時点では比較的単純なコマンドに限られています。技術が進歩するにつれて、研究者は会話の音声を理解できるよりインテリジェントなシステムを開発できるようになります。

<<:  理解すべき記事:この流行は7大テクノロジー企業を襲い、彼らがどう対応したかを見る

>>:  人工知能の時代にITキャリアを築く方法

ブログ    

推薦する

知識共有: 管理距離と最大ホップ数の違いに関するルーティングアルゴリズムの分析

管理距離は、ルーティング プロトコルの優先度を表す人工的に指定された数値です。数値が小さいほど、ルー...

プログラミング面接で学ぶべきアルゴリズム概念トップ10のまとめ

コーディング面接でよく聞かれるアルゴリズム関連の概念トップ 10 を紹介します。簡単な例を使ってこれ...

左手にビッグデータ、右手に人工知能。これらのプログラマーは、パンデミック中に何をしたのでしょうか?

今年初めの流行は、特にCOVID-19の非常に感染力が強い性質により、適切な免疫ワクチンがない中で原...

なぜ多くの大学や大富豪が協力して AI 技術制御の研究を進めているのでしょうか?

[[268857]]最近、億万長者でブラックストーン・グループの共同創設者であるスティーブン・シュ...

特許出願は世界中に広がっています!中国の新興人工知能についてあなたが知らないこと

待望の2020年世界インターネット会議が先日、烏鎮で開催されました。中国サイバースペースアカデミーが...

...

人工知能のアプリケーションアーキテクチャを考える

[[408914]] 1. パドルライトとパドルスリム現在、ディープラーニングの分野には 2 つの派...

トリソララン人は救われた!ディープラーニングは三体問題を解決する

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...

ChatGPTという独立系ゲームがSteamから削除されました。開発者は「貯金と3年半の人生が消えてしまいました」と語っています。

3年半このゲームに一生懸命取り組んだのに、ChatGPT を使用したという理由だけで Steam ...

テンセントクラウドの「AIスーパーベース」特別セッションがWOTカンファレンスで発表され、技術革新がAIインフラの新たな章を導く

過去2年間、「百機種戦争」は中国で人気の技術トピックになりました。 2020年以降、中国は大型モデル...

キャッシュに関して最も懸念される問題は何ですか?種類は何ですか?リサイクル戦略とアルゴリズム?

[[342437]]著者は、正確なタイミング タスクと遅延キュー処理機能を備えた、高同時実行シナリ...

生成 AI を構築するか、購入するか?

テキスト、画像、ビデオ、またはおそらく複数のモデルとサービスの組み合わせであっても、生成 AI を活...

米メディア予測:2021年の人工知能の4大トレンド

9月21日、米フォーブス隔週刊ウェブサイトは「2021年の人工知能の4大トレンド」と題するレポートを...