ダミヌの音声認識


この蚘事では、音声認識などの゜フトりェア開発の興味深い分野の基本に぀いお考えたいず思いたす。 圓然、私はこのトピックの専門家ではないので、私の話には䞍正確、゚ラヌ、倱望がたくさんありたす。 しかし、私の「仕事」の䞻な目暙は、その名前が瀺すように、問題の専門的な分析ではなく、基本抂念、問題、およびそれらの解決策の説明です。 䞀般に、私は猫の䞋で歓迎されおいるすべおの人に尋ねたす



プロロヌグ



そもそも、音声は䞀連の音です。 音は、さたざたな呚波数の音の振動波の重ね合わせ重ね合わせです。 物理孊からわかるように、波は振幅ず呚波数ずいう2぀の属性によっお特城付けられたす。



オヌディオ信号をデゞタルメディアに保存するには、それを倚くのギャップに分割し、それぞれの「平均」倀をずる必芁がありたす。



このようにしお、機械的振動は、最新のコンピュヌタヌでの凊理に適した䞀連の数倀に倉わりたす。

したがっお、音声認識のタスクは、数倀セットデゞタル信号ず蟞曞ロシア語などからの単語の「マッチング」に限定されたす。

実際、このたさに「比范」を実珟する方法を芋おみたしょう。



入力デヌタ



オヌディオデヌタを含むファむル/ストリヌムがあるずしたす。 たず、それがどのように機胜し、どのように読むかを理解する必芁がありたす。 最も簡単なオプション-WAVファむルを芋おみたしょう。



この圢匏は、ファむル内に2぀のブロックが存圚するこずを意味したす。 最初のブロックは、オヌディオストリヌムに関する情報を含むヘッダヌですビットレヌト、呚波数、チャンネル数、ファむル長など。 2番目のブロックは、「生の」デヌタ、぀たり同じデゞタル信号、振幅のセットで構成されおいたす。

この堎合のデヌタ読み取りのロゞックは非垞に単玔です。 ヘッダヌを読み取り、いく぀かの制限圧瞮の欠劂などを確認し、特別に割り圓おられた配列にデヌタを保存したす。

䟋 。



認識



玔粋に理論的には、既存のサンプルを芁玠ごずに他のサンプルず比范できたす。テキストはすでにわかっおいたす。 ぀たり、スピヌチを「認識」しようずしたす...しかし、これをしない方が良いです:)

私たちのアプロヌチは、音声の音色単語を発音する人、ラりドネス、発音速床の倉化に察しお安定しおいる必芁がありたす少なくずも少し。 2぀のオヌディオ信号の芁玠ごずの比范では、もちろんこれは達成できたせん。

したがっお、少し異なる方法で進みたす。



フレヌム



たず、デヌタを小さな時間枠フレヌムに分割したす。 さらに、フレヌムは厳密に次々に移動するのではなく、「オヌバヌラップ」する必芁がありたす。 ぀たり 1぀のフレヌムの終わりが別のフレヌムの始たりず亀差する必芁がありたす。

特定のポむントよりも特定の間隔で波を分析する方がはるかに䟿利なので、フレヌムは特定の信号倀よりもデヌタ分析の適切な単䜍です。 重耇するフレヌムの䜍眮により、フレヌムの分析結果を平滑化し、フレヌムの抂念を元の関数信号倀に沿っお移動する特定の「りィンドり」に倉えるこずができたす。

最適なフレヌム長は10ミリ秒のギャップ、぀たり「オヌバヌラップ」-50に察応する必芁があるこずが実隓的に確立されたした。 少なくずも私の実隓では平均ワヌド長が500msであるずするず、このステップでは玄500 /10 * 0.5=ワヌドあたり100フレヌムが埗られたす。



単語分割



音声認識で解決しなければならない最初のタスクは、この音声を個別の単語に分割するこずです。 簡単にするために、この堎合、音声にはいく぀かの䞀時停止沈黙の間隔が含たれおいるず仮定したす。これは単語の「区切り文字」ず芋なすこずができたす。

この堎合、いく぀かの倀、しきい倀-䞊の倀は単語、䞋の倀-沈黙を芋぀ける必芁がありたす。 いく぀かのオプションがありたす。



ご想像のずおり、ここで最埌の点に぀いお説明したす:)そもそも、゚ントロピヌは無秩序の尺床であり、「あらゆる経隓の䞍確実性の尺床」ですc。 この堎合、゚ントロピヌずは、特定のフレヌム内で信号がどれだけ「倉動」するかを意味したす。

特定のフレヌムの゚ントロピヌを蚈算するには、次の手順を実行したす。

゚ントロピヌを次のように蚈算したす ;



䟋 。

そしお、゚ントロピヌの䟡倀を埗たした。 しかし、これはフレヌムのもう1぀の特城であり、音ず静寂を分離するために、それを䜕かず比范する必芁がありたす。 䞀郚の蚘事では、すべおのフレヌム間で最倧倀ず最小倀の間の平均に等しい゚ントロピヌしきい倀を取るこずを掚奚しおいたす。 しかし、私の堎合、このアプロヌチでは良い結果が埗られたせんでした。
幞いなこずに、゚ントロピヌは倀の同じ平均二乗ずは察照的に比范的独立した倀です。 これにより、定数0.1の圢匏でしきい倀の倀を遞択できたした。

それでも、問題はそこで終わるわけではありたせん゚ントロピヌは単語の途䞭で母音で垂れ䞋がるこずがありたす。たたは、わずかなノむズにより突然跳ね䞊がるこずがありたす。最初の問題に察凊するために、 2番目の問題は、「最小語長」を䜿甚しお、遞択に合栌しおいない最初の段萜で䜿甚されおいないすべおの候補をカットするこずで解決されたす。

原則ずしお、音声が「明瞭」でない堎合、フレヌムの初期セットを特定の方法で準備されたサブシヌケンスに分割しお、それぞれが認識手順の察象ずなるようにするこずができたす。 しかし、これは完党に異なる話です:)



Mfcc



したがっお、特定の単語に察応するフレヌムのセットがありたす。 最小抵抗の経路をたどり、そのすべおの倀の平均二乗ルヌト平均二乗をフレヌムの数倀特性ずしお䜿甚できたす。 ただし、このようなメトリックには、さらなる分析に適した情報がほずんど含たれおいたせん。

これは、メル呚波数ケプストラル係数が䜜甚する堎所です。 りィキペディアご存知のずおり、嘘ではないによるず、MFCCは信号スペクトルの゚ネルギヌの䞀皮の衚珟です。 その䜿甚の利点は次のずおりです。



特定のフレヌムのMFCC係数を蚈算するプロセスを芋おみたしょう。

フレヌムをベクトルずしお想像しおください Nはフレヌムサむズです。



フヌリ゚展開



たず、離散フヌリ゚倉換を䜿甚しお信号スペクトルを蚈算したす「高速」FFT実装が望たしい。



フレヌムの境界の倀を「滑らかにする」ために、取埗した倀にハミングりィンドり関数を適甚するこずもお勧めしたす。



぀たり、結果は次の圢匏のベクトルになりたす。



X軞に沿ったこの倉換埌、信号の呚波数hzが埗られ、Y軞に沿っお耇玠数倀から抜け出す方法ずしお振幅があるこずを理解するこずが重芁です。





メルフィルタヌの蚈算



メルずは䜕かから始めたしょう。 繰り返しになりたすが、Wikipediaによるず、melは平均的な人々の䞻芳的な認識に基づく「ピッチの心理物理孊的単䜍」です。 䞻に音の呚波数に䟝存したす音量ず音色にも䟝存したす。 蚀い換えれば、この倀は、特定の呚波数の音が私たちにずっお「重芁」であるこずを瀺しおいたす。

呚波数は、次の匏を䜿甚しおチョヌクに倉換できたす「匏1」ずしお芚えおおいおください。


逆倉換は次のようになりたす「匏2」ずしお芚えおおいおください。


メル/呚波数プロット


しかし、タスクに戻りたす。 256芁玠のサむズのフレヌムがあるずしたしょう。 オヌディオ圢匏のデヌタからこのフレヌムのサりンド呚波数は16000hzであるこずがわかりたす。 人間の発話が[300; 8000] hz。 垌望するチョヌク係数の数は、M = 10掚奚倀に蚭定されおいたす。

䞊蚘で埗られたスペクトルをメルスケヌルで分解するには、フィルタヌの「櫛」を䜜成する必芁がありたす。 実際、各メルフィルタヌは䞉角窓関数です 。これにより、特定の呚波数範囲で゚ネルギヌ量を合蚈し、メル係数を取埗できたす。 チョヌク係数の数ず分析された呚波数範囲がわかれば、このようなフィルタヌのセットを䜜成できたす。



チョヌクファクタヌの数が倚いほど、フィルタヌのベヌスが広くなるこずに泚意しおください。 これは、察象の呚波数範囲がフィルタヌで凊理される範囲にチョヌクスケヌルで分割されるためです。

しかし、再び気が散りたした。 したがっお、私たちの堎合、察象ずなる呚波数の範囲は[300、8000]です。 匏1によれば、チョヌクスケヌルでは、この範囲は[401.25; 2834.99]。

さらに、10個の䞉角フィルタヌを䜜成するには、12個の参照ポむントが必芁です。
m [i] = [401.25、622.50、843.75、1065.00、1286.25、1507.50、1728.74、1949.99、2171.24、2392.49、2613.74、2834.99]


チョヌクスケヌルでは、ポむントは等間隔になっおいるこずに泚意しおください。 匏2を䜿甚しおスケヌルをヘルツに倉換したす。

h [i] = [300、517.33、781.90、1103.97、1496.04、1973.32、2554.33、3261.62、4122.63、5170.76、6446.70、8000]


ご芧のずおり、スケヌルは埐々に拡倧し始め、それにより䜎および高呚波数での「重芁性」の成長のダむナミクスが平準化されたした。

次に、結果のスケヌルをフレヌムのスペクトルに重ね合わせる必芁がありたす。 芚えおいるように、X軞に沿っお呚波数がありたす。 スペクトルの長さは256芁玠ですが、16000hzに収たりたす。 単玔な割合を解くず、次の匏を取埗できたす。

fi= floorframeSize + 1* hi/ sampleRate


私たちの堎合、これは同等です

fi= 4、8、12、17、23、31、40、52、66、82、103、128


以䞊です スペクトルのX軞䞊の基準点がわかっおいるので、次の匏を䜿甚しお必芁なフィルタヌを簡単に構築できたす。





フィルタヌの適甚、スペクトル゚ネルギヌの察数



フィルタヌの䜿甚は、その倀ずスペクトルの倀のペアワむズ乗算です。 この操䜜の結果がメル係数です。 M個のフィルタヌがあるため、係数の数は倚くなりたす。



ただし、メルフィルタヌはスペクトル倀ではなく゚ネルギヌに適甚する必芁がありたす。 次に、結果を前眮したす。 このようにしお、ノむズに察する係数の感床が䜎䞋するず考えられおいたす。



コサむン倉換



離散コサむン倉換DCTは、同じ「ケプストラム」係数を取埗するために䜿甚されたす。 その意味は、埗られた結果を「絞る」こずで、最初の係数の重芁性を高め、埌者の重芁性を枛らしたす。

この堎合、DCTIIは次の乗算なしで䜿甚されたす。 スケヌル係数。



これで、各フレヌムに぀いお、さらに分析するために䜿甚できるM mfcc係数のセットができたした。

アップストリヌムメ゜ッドのサンプルコヌドはこちらにありたす 。



認識アルゎリズム



ここで、芪愛なる読者、䞻な倱望があなたを埅っおいたす。 むンタヌネット䞊で、どの認識方法が優れおいるかに぀いお、非垞に知的なそしおそうではない玛争が倚く発生したした。 隠れマルコフモデルを支持する人、ニュヌラルネットワヌクを支持する人、誰かの考えは原則ずしお理解できない:)

いずれにせよ、倚くの蚭定がSMMに正確に䞎えられおおり、将来的にはコヌドに远加する぀もりです... :)

珟時点では、はるかに効果的ではないが、時にはより簡単な方法で停止するこずを提案しおいたす。

そしお、私たちの仕事は蟞曞から単語を認識するこずであるこずを忘れないでください。 簡単にするために、最初の10桁の名前を認識したす「one」、「two」、「three」、「four」、「five」、「six」、「seven」、「eight」、「nine」、「ten」。

それでは、iPhone / Androidを手に取り、Lの同僚を調べお、これらの単語を蚘録のために口述するように䟝頌しおみたしょう。 次に、いく぀かのロヌカルデヌタベヌスたたは単玔なファむルで各単語Lを察応するレコヌドのmfcc係数のセットに関連付けたす。

この通信を「モデル」ず呌び、プロセス自䜓を機械孊習ず呌びたす。 実際、デヌタベヌスぞの新しいサンプルの単玔な远加は、機械孊習ずの非垞に匱い぀ながりを持っおいたす...しかし、ファッショナブルずいう甚語はずおも痛いです:)

これで、特定のmfcc係数のセット認識可胜な単語に察しお「最も近い」モデルを遞択するこずになりたした。 䞀芋するず、問題は非垞に簡単に解決できたす。



ただし、Andrei Malakhovず圌の゚ストニア語の䞀郚の䞡方で同じ単語を発音できたす。 蚀い換えれば、同じ単語のmfccベクトルのサむズは異なる堎合がありたす。

幞いなこずに、異なる長さのシヌケンスを比范するタスクは、動的タむムワヌピングアルゎリズムの圢ですでに解決されおいたす。 この動的プログラミングアルゎリズムは、ブルゞョアWikiず正統掟ハブレの䞡方で矎しく描かれおいたす。

行う䟡倀のある唯䞀の倉曎は、距離を芋぀ける方法です。 モデルのmfccベクトルは、実際にはフレヌムから取埗した次元Mのmfcc「サブベクトル」のシヌケンスであるこずを芚えおおく必芁がありたす。 したがっお、DTWアルゎリズムは、次元Mのこれらの同じ「サブベクトル」のシヌケンス間の距離を芋぀ける必芁がありたす。぀たり、フレヌムのmfcc「サブベクトル」間の距離ナヌクリッドが距離行列の倀ずしお䜿甚されたす。

䟋 。



実隓



倧芏暡な「トレヌニング」サンプルでこのアプロヌチの䜜業をテストする機䌚がありたせんでした。 非合成条件䞋で各単語の3぀のコピヌのサンプルのテスト結果は、穏やかに蚀えば、最良の結果-正しい認識の65を瀺したした。

それにもかかわらず、私のタスクは、音声認識のための最倧のシンプルなアプリケヌションを䜜成するこずでした。 「抂念実蚌」ず蚀うには:)



実装



気配りのある読者は、蚘事にGitHubプロゞェクトぞの倚くのリンクが含たれおいるこずに気付きたした。 これは倧孊以来の私の最初のC ++プロゞェクトであるこずは泚目に倀したす。 これは、同じ倧孊以来、算術平均よりも耇雑なものを蚈算するための私の最初の詊みでもありたす...蚀い換えれば、それは絶察に保蚌なしで来たすc:)


Source: https://habr.com/ru/post/J226143/


All Articles