独自の音声認識コードの作成[終了]


17

問題の説明

ハードウェアプロジェクトの一部として音声認識を使用したいのですが、完全に自己完結型にしたいです(ArduinoやRaspberry Pi、Kinectsなどの小さな低電力、低速のデバイスを使用しています。 OSが関係しているため、クローズド/自己完結型プロジェクト)。

音声認識は、希望する洗練度によっては非常に複雑になる場合があります。私は、比較的単純な要件のセットを信じています。自分の声だけを認識したいのですが、認識したい20語ほどの小さな辞書があります。したがって、複雑な音声テキスト変換や音声認識ライブラリや、インターネット検索エンジンで見つけた優れたサードパーティソフトウェアは必要ありません(これらに不足はありません!)。私の要件は「十分に単純」で(理由の範囲内で)、自分のソリューションをコーディングできると考えています。私は誰かがこのような独自のプロセスを書いているのだろうかと思っていますが、私の方法は非常に欠陥がありますか?高レベルの数学を必要とせずに、または複雑なアルゴリズムを記述する必要なく、これを行うより良い方法はありますか? それが私が以下で考えようとした解決策です。

ソリューションの説明

私はこれをCで書くつもりですが、言語にとらわれないプロセスについて議論し、そのプロセスに焦点を当てたいと思います。可能な場合は無視してください。

1 話されている単語と一致するように単語の辞書を事前に記録します。20の異なる単語の20の録音、または2つまたは3つの単語の短いフレーズまたは文章があると想像できます。これにより、実際にオーディオをテキストに変換して2つの文字列を比較するよりも、2つの録音ファイルを比較するプロセスが簡単になると思います。

2。コードを実行しているハードウェアデバイスにマイクが接続されています。[1]。コードは、たとえば長さが10ミリ秒の固定長のサンプルを連続的に取得し、たとえば循環ログ形式で10の連続したサンプルを保存します。[2]。(これらの数字を頭の外で発明しているので、これらはプロセスを説明するための例にすぎません)。

[1]これはおそらく、辞書録音が行われるように、バンドパスフィルターとオペアンプを介して接続され、保存および収集されたオーディオサンプルを小さく保ちます。

[2]サンプルをどのように取得するか正確にはわかりません。10msecサンプル(おそらくCRC値)のオーディオを表す数値(整数/浮動小数点/倍精度)を生成していましたが、メソッドを実行する必要がありますまたはオーディオサンプルのMD5合計など)、または数字のストリーム(おそらく周波数のオーディオ測定値のストリーム)。最終的に、「サンプル」は数値または数字になります。この部分は、はるかに多くのハードウェアが関係するため、ここでの説明にはあまり適していません。

3。コードは、10個の連続したサンプルが格納されていることを確認し、単語またはフレーズが言われていることを示すボリュームの増加(無音からの中断)を探してから、たとえば500個のサンプルなどの連続したサンプルを収集します。つまり、10ミリ秒のサンプルで5秒間のオーディオをキャプチャします。

保存されたサウンドとキャプチャされたサウンドを比較するのは、これらのサンプルまたは「スライス」です。キャプチャされたサンプルの十分に高い割合が、保存されている同等のサンプルと一致した場合、コードは同じ単語と見なします。

The start of a store recording of the world "hello" for example,
stored words are split into 10 msec samples also

Stored Sample No           | 1| 2| 3| 4| 5| 6| 7|  8|
Stored Sample Value        |27|38|41|16|59|77|200|78|

Incoming audio (me saying "hello") with some "blank" samples
at the start to symbolise silence

Incoming Sample No         | 1| 2| 3| 4| 5| 6| 7| 8| 9|10| 11|12|
Incoming Sample Value      |  |  |  |20|27|38|46|16|59|77|200|78|

4。コードが完全なサンプルストリームを収集すると、開始時に空白サンプルを切り取り、次のオーディオ録音を生成します。また、保存されたサンプルとの整合性を高めるために、サンプルセットを数箇所前後に移動させることもできます。

これにより、次のようなサンプルセットが生成されます。

Stored Sample No           | 1| 2| 3| 4| 5| 6|  7| 8|
Stored Sample Value        |27|38|41|16|59|77|200|78|

Incoming Sample No      |-1| 1| 2| 3| 4| 5| 6|  7| 8|
Incoming Sample Value   |20|27|38|46|16|59|81|201|78|

5。各サンプルがどれだけ近くになければならないかというパーセンテージ値を持つことにより、サンプル7は%1未満の1の値と、サンプル一致パーセンテージ内にある必要があるサンプルの合計数のパーセンテージ値によって異なると信じています、コードの精度は簡単に調整できます。

これまでオーディオでこのようなことをしたことは一度もありませんでした。おそらくこの質問に対する答えが明白であると既に知っているなら(その答えはどうであれ)、私がこの質問をする理由です。使用するハードウェアの一部が低秒のものになるため、これが計算量の多いタスクにならないことを願っています。数百メガヘルツ(オーバークロックされたRasp Piを使用した1Ghzかもしれません)。したがって、これは、より低い計算能力を使用してオーディオサンプルを一致させるかなり粗雑な方法です。すぐに結果を狙うのではなく、適切な概念実証のために30秒未満を目指しています。

PS 「オーディオ」、「オーディオ認識」、「音声」、「音声認識」などの新しいタグでタグ付けする担当者がいません。


17
VRは非常に複雑で、この分野の知識のない人が多くの読書をせずに大きな前進を遂げることができるとは思えません。あなたのアルゴリズムについて私に最初に思い付くのは、単語が話される速さの違いを処理しないことです。単純なVRでさえ、正しく機能するのに何年もかかりました。
ロボットをゲット

4
確かに。開発の年月を気にしない限り、ターゲットにコンパイルできるライブラリを調べたいかもしれません。それらが存在すると確信しています。
リグ

6
追加のステップを提案します-各サンプルのフーリエ変換を行います。これにより、サンプルを直接処理するのではなく、時間の経過とともに各オーディオ周波数の強度が得られます。通常検出できる母音には、一定の基本周波数があります。音声だけでなく、音声の特定の特性を調べる必要があります。他の人が言ったように、これは難しい作業です。
ポールアンダーソン

1
最終製品に使用できない場合でも、いくつかの音声認識ライブラリを試してみることをお勧めします。概念実証の作成に役立ちます。
sav

回答:


3

よく私はArduinoがこれをする馬力を持っているとは思わない。16Mhz An Arduinoで動作するメモリは約32Kです。Mp3でサンプリングされた20個の単語(wavよりも小さい)でさえ、自分の声だけではありません。

rasberi piは、512MBのメモリがあるバージョンに応じて700Mhzで動作するトリックを行うかもしれません。それはまだそれほど生地ではありません。

fourierが必要な場合がありますhttp://www.drdobbs.com/cpp/a-simple-and-efficient-fft-implementatio/199500857

または、ボリュームを使用する場合は、
x =(x + x [n-1] + x [n-2] + x [n-3])/ 4 などの以前のサンプルでいくつかの平均を行います。もっといります

次に行う必要があるのは、これらのX値をプロットするかどうかを考えることです。その後、そのラインの何らかの勾配検出が必要になります。言葉

次に、パターンが別の時間に適合するように、勾配を記録する方法に少し依存します。つまり、コンピューターが一致できる正確なテンポでは話せず、傾斜が少し急になります。結局、これはこれらの線がどれほど急で、その長さy軸がある程度の平均内にあるべきだと思う


1
  1. ArduinoとRaspberry Piは、小さなチップを搭載したプロトタイプボードです。最初にチップに集中する必要があります。DSP(デジタル信号処理)ツールボックスで何かを探してください。多分あなたはすでにDSPツールボックスを持っていて、それを知らないかもしれません。DSPツールボックスには、高速周波数領域解析のためのfft(高速フーリエ変換)やifft(逆fft)などの呼び出しアルゴリズムがあります。

  2. プログラマチックなスタイルに焦点を合わせてください:サンプルはスタックですか、それともキューですか?このタイプのデータ用のキューが必要になります。キューは次のようになります。

    Position NO --|1|2|3|4|5|6|7|8|
    Sample Value  |5|7|9|1|2|2|9|8|
    

    次の反復:

    Position NO --|1|2|3|4|5|6|7|8|
    Sample Value  |0|5|7|9|1|2|2|9|
    ->  First in First out (FIFO)
    

    物事が「正しい」方向にどのようにシフトするかに注目してください。あなたは「循環」アルゴリズムを説明したと思います。2番目に古いサンプルを2番目に古いサンプルで上書きし、次に2番目に古いサンプルを3番目に古い...で上書きして、最新のデータを挿入するキューの先頭まで移動します。

  3. 「コードは連続的に固定長のサンプル、たとえば10msecを取得しています」<- 不正解 このように考えください:コードは、毎秒10000サンプルのサンプリングレートで量子化(高さ)サンプルを個別に取得し、各サンプルを0.1ミリ秒離します。

    サンプリング頻度は?量子化器のビットレートは何ですか?数値を小さくすると、メモリを解放できます。1秒あたり6600サンプル(ナイキスト)などの低いサンプリングレートをお勧めします。認識には4ビット(16レベル)で十分だと思います。つまり、1秒あたり3300バイトの記録です。次に、fftを実行し、3300 Hzを超えるすべてを削除します(テレフォニーフィルター)。これで、1秒のサウンドに1650バイトが使用されました。これらのDSPトリックは、多くのメモリを節約します。

    512 MBが小さいと誰が考えているのかわかりません。上記の情報は、300,000を超える録音時間であり、3日間以上安定しています。

  4. (fftを使用して)周波数領域が音声認識を実行するためのより良い環境であることがわかると思います。

私はあなたをもっと混乱させないことを望みます:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.