Raspberry Piでの音声処理


43

Raspberry Piで音声処理を実行して、特定の人(一意の識別情報など)を検出します。

オンボードプロセッサのみを使用することをお勧めします。インターネットにアクセスできないと想定できます。

また、音声処理を実行するRaspberry Piの制限は何ですか?これを自動出席マシンとして使用したい場合、どうすればよいですか?


4
どのような「音声処理」について話しているのか:事前に録音された音声サンプルの認識(元の音声ファイル、つまり事前に録音された音声ファイルとテスト音声ファイルの間で何らかの類似性インデックスを使用できます)または「実際の」音声認識特に一部の言語および認識率が高い場合、CPUをリアルタイムで集中的に使用しますか?
トミール

回答:


61

これは、私のRaspberry Piが現在専念しているメインプロジェクトなので、2セントを追加できると考えています。このプロジェクトはまだ進行中の作業であることを忘れないでください。

Raspbian OSのみでこのプロジェクトにCプログラミング言語を使用することを選択しましたが、これが私の決定と指示の一部に影響を与えた可能性があります。私が使用しているのはそれだけので、無料のオープンソースソフトウェアのみをリストします。

インストール手順については、完全に最新のシステムを使用していると仮定します。


音声認識

音声認識エンジンのオプションは次のとおりです。

  1. Pocketsphinx-組み込みシステムで使用できるSphinxのバージョン(たとえば、ARMプロセッサに基づく)。

    • 長所:活発に開発されており、固定小数点演算やGMM計算用の効率的なアルゴリズムなどの機能が組み込まれています。すべての処理はRaspberry Piで行われるため、オフラインで使用できます。リアルタイムの音声認識をサポートします

    • 短所:初心者向けに設定して理解するのは複雑です。私にとっては、アプリケーションにとっては不正確すぎました。すべての処理はRaspberry Piで行われるため、少し遅くなります。

    • インストール手順

      1. SphinxbaseおよびPocketsphinxの最新の安定バージョンをダウンロードします。

        $ wget http://sourceforge.net/projects/cmusphinx/files/sphinxbase/0.8/sphinxbase-0.8.tar.gz
        $ wget http://sourceforge.net/projects/cmusphinx/files/pocketsphinx/0.8/pocketsphinx-0.8.tar.gz
        
      2. ダウンロードしたファイルを解凍します。

        $ tar -zxvf pocketsphinx-0.8.tar.gz; rm -rf pocketsphinx-0.8.tar.gz
        $ tar -zxvf sphinxbase-0.8.tar.gz; rm -rf sphinxbase-0.8.tar.gz
        
      3. これらのパッケージをコンパイルするには、bisonとALSA開発ヘッダーをインストールする必要があります。

        :Sphinxbaseをビルドする前に、ALSAヘッダーをインストールすることが重要です。それ以外の場合、SphinxbaseはALSAを使用しません。また、PulseAudioがインストールされている場合、ALSAは使用されないようです(私のような開発者にとっては悪いことです)。

        $ sudo apt-get install bison libasound2-dev
        
      4. cd Sphinxbaseディレクトリに移動し、次のコマンドを入力します。

        $ ./configure --enable-fixed
        $ sudo make
        $ sudo make install
        
      5. cd Pocketsphinxディレクトリに移動し、次のコマンドを入力します。

        $ ./configure
        $ sudo make
        $ sudo make install
        
      6. 以下を実行して、Pocketsphinxをテストします。

        $ src/programs/pocketsphinx_continuous -samprate 48000 
        

        微調整したい場合は、CMUSphinx Wikiで情報を読むことをお勧めします。

  2. libsprec -によって開発された音声認識ライブラリ H2CO3(自分でいくつかの貢献、主にバグ修正と)。

    • 長所Google Speech APIを使用して、より正確にしています。コードは理解しやすい(私の意見では)。

    • 短所:H2CO3が開発した他のライブラリ(libjsonzなど)に依存しています。開発はむらがあります。Google Speech APIを使用します。つまり、処理はRaspberry Pi自体では行われず、インターネット接続が必要です。Raspberry Piで正常に動作するには、コンパイル前にソースコードを少し変更する必要があります。

    • インストール手順

      1. libflaclibogg、およびlibcurlをインストールします。

        $ sudo apt-get install libcurl4-openssl-dev libogg-dev libflac-dev
        
      2. libsprecの最新バージョンをダウンロードする

        $ wget https://github.com/H2CO3/libsprec/archive/master.zip
        
      3. ダウンロードしたパッケージを解凍します。

        $ unzip master.zip; rm -rf master.zip
        

        これlibsprec-masterで、現在のディレクトリに名前の付いたフォルダーができました。

      4. libjsonzの最新バージョンをダウンロードします

        $ wget https://github.com/H2CO3/libjsonz/archive/master.zip
        
      5. ダウンロードしたパッケージを解凍します。

        $ unzip master.zip; rm -rf master.zip
        

        これlibjsonz-masterで、現在のディレクトリに名前の付いたフォルダーができました。

      6. cdlibjsonz-masterディレクトリ、コンパイル、およびインストールします。

        $ cd libjsonz-master
        $ mv Makefile.linux Makefile
        $ make
        $ sudo make install
        
      7. cdうちlibjsonz-masterディレクトリとにlibsprec-master/srcディレクトリ。行227を編集します。

        $ err = snd_pcm_open(&handle, "pulse", SND_PCM_STREAM_CAPTURE, 0);
        

        次のことを言う必要があります。

        $ err = snd_pcm_open(&handle, "plughw:1,0", SND_PCM_STREAM_CAPTURE, 0);
        

        これは、プログラムがUSBマイクを指すためにALSAを使用するためです。

      8. コンパイルしてインストールします。

        $ mv Makefile.linux Makefile
        $ make
        $ sudo make install
        
      9. これで、独自のアプリケーションでライブラリを使用できます。libsprec-master例については、サンプルフォルダをご覧ください。

  3. ジュリアス -高性能、2-パス大語彙連続音声認識( LVCSR)音声関連の研究者や開発者のためのデコーダソフトウェア。

    • 長所:Raspberry Pi自体でほぼリアルタイムの音声認識を実行できます。標準の音声モデル形式は、他の無料のモデリングツールキットに対応するために採用されています。

    • 短所:Spotty開発。1年以上前の最終更新です。また、認識はあまりにも不正確で、使用するには遅すぎます。長いインストール時間

    • インストール手順

      1. システムを正常に動作させるためにインストールする必要があるパッケージがいくつかあります。

        $ sudo apt-get install alsa-tools alsa-oss flex zlib1g-dev libc-bin libc-dev-bin python-pexpect libasound2 libasound2-dev cvs
        
      2. CVSソースからJuliusをダウンロードします。

        $ cvs -z3 -d:pserver:anonymous@cvs.sourceforge.jp:/cvsroot/julius co julius4
        
      3. 環境変数によってコンパイラフラグを設定します。

        $ export CFLAGS="-O2 -mcpu=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -pipe -fomit-frame-pointer"
        
      4. cdフォルダーに入れてjulius4、次のコマンドを入力します

        $ ./configure --with-mictype=alsa
        $ sudo make
        $ sudo make install
        
      5. Juliusには、ALSADEVマイクに使用するデバイスを指定するために呼び出される環境変数が必要です。

        $ export ALSADEV="plughw:1,0"
        
      6. Juliusが使用する無料の音響モデルをダウンロードします。ダウンロードしたらcd、ディレクトリに移動して実行します:

        $ julius -input mic -C julius.jconf
        

        その後、音声入力を開始できるはずです。

  4. 独自のライブラリを作成する -私の特定のプロジェクトでは、PortAudioを介してALSAを使用してUSBマイクからオーディオを録音し、libsndfileを介してFLACファイルに保存し、処理するためにGoogleに送信する独自の音声認識ライブラリを構築することを選択しますそれ。その後、きれいに圧縮されたJSONファイルを送信して、Raspberry Piに言ったことを取得するために処理します。

    • 長所:私はすべてを制御します(好きです)。私は多くを学びます(私は好きです)。

    • 短所:大変な作業です。また、一部の人々は、この音声認識ライブラリを使用してRaspberry Piで実際に処理を行っているわけではないと主張するかもしれません。 私はそれを知っています。Googleは、今よりもはるかに正確にデータを処理できます。正確なオフライン音声認識オプションの構築に取り組んでいます。


音声合成

音声合成エンジンのオプションは次のとおりです。

  1. tritium-完全にCで書かれた(そしてあなたの開発した)プレミアムで高品質な無料の音声合成エンジン。

    • 長所:非常に移植性が高く(CMake以外にビルドするための依存関係がない)、非常に小さく(見つけることができる最小のもの)、ビルドが簡単です。

    • 短所:音声出力自体が不正確になることがあります。私は現在、自由な時間をほとんど持たない唯一の開発者であるため、多種多様な言語のサポートが不足していますが、これはプロジェクトの将来の目標の1つです。また、現時点では、コンパイル時にライブラリのみが出力され、使用可能/テスト可能な実行可能ファイルはありません。

  2. eSpeak -Linux、Windows、およびその他のプラットフォーム向けのコンパクトなオープンソースソフトウェア音声合成装置。

    • 長所フォルマント合成法を使用して、多くの音声言語を小さなサイズで提供します。また、非常に正確で理解しやすいです。私はもともとこれをプロジェクトで使用していましたが、短所のために別の音声合成エンジンに切り替える必要がありました。

    • 短所X11に奇妙な依存関係があるため、時々途切れる場合があります。また、ライブラリは他のライブラリと比較してかなり大きくなっています。

    • インストール手順

      1. eSpeakソフトウェアをインストールします。

        $ sudo apt-get install espaek
        
      2. eSpeakで必要なことを言うには:

        $ espeak "Hello world"
        

        eSpeakのファイルから読み取るには:

        $ espeak -f <file>
        
  3. フェスティバル -一般的な多言語音声合成システム。

    • 長所:複数の音声言語をサポートするように設計されています。Festvoxプロジェクトを使用して、新しい合成音声の構築をより体系的で文書化し、誰でも新しい音声を構築できるようにすることができます。

    • 短所:それはC ++で書かれています(特に私にとってはもっと長所です)。また、コードベースが大きくなっているため、コードを理解して移植することは困難です。

    • インストール手順

      1. Festivalソフトウェアをインストールします。

        $ sudo apt-get install festival festival-freebsoft-utils
        
      2. Festivalを実行するには、読みたいテキストまたはファイルをパイプします:

        $ echo  "Hello world" | festival --tts
        
  4. Flite -FestivalおよびFestvoxプロジェクトから派生した小さなランタイム音声合成エンジン。

    • 長所:カーネギーメロン大学で絶えず開発中。他と比較して非常に小さいエンジン。また、コードベースが小さいため、簡単に確認できます。依存関係はほとんどありません(私にとって大きな利点であり、プロジェクトでこのエンジンを使用することにしたもう1つの理由)。

    • 短所:音声出力自体は必ずしも正確ではありません。スピーチは非常にメタリックで人間以外の音です(他のエンジンよりも多い)。非常に多くの言語をサポートしていません。

    • インストール手順

      1. Fliteソフトウェアをインストールします。

        $ sudo apt-get install flite
        
      2. Fliteを実行するには:

        $ flite -t "text that you want flite to say"
        

特定の質問への回答

音声処理を実行するPiの制限は何ですか?

プログラマーには制限がありません。 :P

さらに深刻なことに、Raspberry Piには音声処理を処理するための十分なリソースがあります。音声処理を実行する人が何をしているかを知っている限り、Raspberry Piはそれをうまく処理できるはずです。

これを自動出席マシンに使用したいのですが、どうすればいいですか?

これらのオプションのどれも特定の人々の違いを言うほど正確ではありません。それは私が私のプロジェクトで取り組んでいるものです(そしておそらくしばらくの間)。あなたが自動出席のためのより良いオプションを探しているなら、私は顔認識を調べます。Raspberry Piの顔認識にはさらに制限がありますので、注意してください。


6
これは素晴らしい答えです!あなたは本当にすべてのトリックを引き出しました:)
ピョートルクラ14

前に+ 1'daしましたが、H2CO3がSEにはもう存在しないことに気付きました。彼のプロフィール404へのリンク。
帽子の男14

誰かが事前に録音された単語をトリガーワードとして最初に言った場合にのみ、Googleにサウンドを送信する方法はありますか?(私はあなたの投稿の「あなた自身のライブラリをロールする」部分について話している)
ロバート

@Robertありますが、非常に複雑で、PocketSphinxを統合する必要があったため、オフライン音声認識のトレーニングができました。必要に応じて、後ほどこの情報を追加して投稿を更新できます。
syb0rg 14

@ syb0rg、トリガーワードのオフライントラックに関する投稿も楽しみにしています。後でGoogleで次の完全な文を処理するかもしれません。
アシッシュK

5

pocketsphinx_continuousと4ドルのサウンドカードを使用しました

スピーチシンセを使用するときにリスニングを停止する必要があるという事実を管理するために、ミキサーへの入力ボリュームの処理にミキサーを使用しました(エンジンを停止すると認識が低下するため、CMUによって推奨されるベストプラクティスです)

echo "SETTING MIC IN TO 15 (94%)" >> ./audio.log
amixer -c 1 set Mic 15 unmute 2>&1 >/dev/null 

スピーチシンセの再生時にリスニングをミュートする一致コマンドを使用

FILE: mute.sh
#!/bin/sh

sleep $1;
amixer -c 1 set Mic 0 unmute >/dev/null 2>&1 ; 
echo  "** MIC OFF **" >> /home/pi/PIXIE/audio.log

ミュートする適切な時間を計算するには、luaを介してsoxiを実行し、unmute.sh(mute.shの反対側)を起動から「x」秒で実行するように設定します。これを処理する多くの方法は間違いありません。この方法の結果に満足しています。

ルアスニペット:

-- Begin parallel timing  
-- MUTE UNTIL THE SOUNDCARD FREES UP 
-- "filename" is a fully qualified path to a wav file 
-- outputted by voice synth in previous operation

-- GET THE LENGTH
local sample_length = io.popen('soxi -D '..filename);
local total_length  = sample_length:read("*a"); 
clean_length = string.gsub(total_length, "\n", "") +1;  
sample_length:close();

-- EXAMPLE LOGGING OUTPUT...
--os.execute( 'echo LENGTH WAS "'.. clean_length .. '" Seconds  >> ./audio.log');   



-- we are about to play something... 
-- MUTE, then schedule UNMUTE.sh in x seconds, then play synth output
-- (have unrolled mute.sh here for clarity)

os.execute( 'amixer -c 1 set Mic '..mic_level..' unmute 2>&1 >/dev/null ');
os.execute( 'echo "** MIC OFF **"  >> ./audio.log ');

-- EXAMPLE LOGGING OUTPUT...    
-- os.execute( 'echo PLAYING: "'.. filename..'" circa ' .. clean_length .. ' Seconds  >> ./audio.log ');

os.execute( './unmute.sh "'.. clean_length ..'" &');


-- THEN PLAY THE THING WHILE THE OTHER PROCESS IS SLEEPING  

os.execute( './sounds-uncached.sh '..filename..' 21000')

実際に私が使用する円周率の声をつかむには:

pocketsphinx_continuous -bestpath 0 -adcdev plughw:1  -samprate 20000  \
-nfft 512 -ds2 -topn2 -maxwpf 5 -kdtreefn 3000 -kdmaxdepth 7 -kdmaxbbi 15 \
-pl_window 10 -lm ./LANGUAGE/0892-min.lm -dict ./LANGUAGE/0892-min.dic 2>&1 \
| tee -i 2>/dev/null >( sed -u -n -e 's/^.\{9\}: //p' ) \
>( sed -u -n -e 's/^READY//p' \
-e 's/^Listening//p' -e 's/^FATAL_ERROR: \"continuous\.c\"\, //p') \
> /dev/null

繰り返しますが、他の方法もありますが、この方法で私の出力が好きです。

シンセサイザーにはCepstrals fledgling piソリューションを使用しましたが、オンラインで入手することはできません。直接購入して購入を手配する必要があり、購入するには約30ドルです。結果は受け入れられますが、スピーチによって不快なクリックやポップが発生するため、RaspPiがなくなり、製品を改善したくないと同社は答えています。YMMV

音声認識は、「アイドル」時のCPUの約12%に留まり、認識のチャンクを行うと短時間スパイクします。

レンダリング時に音声の作成が約50〜80%に急増します。

プレイ/ソックスの重さはかなり重いですが、演奏するときにレンダリングされたボイスにリアルタイムのエフェクトを適用します;)

piは、不要なサービスを停止するために見つけることができるすべてのガイドを使用して大幅に削減され、完全なCLIモードで実行されます。800MHzのオーバークロック(最小)。

scaling_governorに設定:パフォーマンス

完全に動作しているとき:直射日光下で約50ºC、日陰で38ºCで動作します。ヒートシンクを取り付けています。

最後のポイント:私は実際に、このすべてのギアを「インターネット駆動型」のAIに追加して実行します。

piはこのすべてをシームレスに処理し、ネットワークオーディオをリアルタイムで再生し、オーディオを他のUnixボックスに完全にループします。等

大きなスピーチCPUオーバーヘッドの負荷を処理するために、同じ発言が2回レンダリングされないように、md5sumベースのキャッシュシステムを実装しました。(合計220 mbで約1000ファイルは、私がAIから一般的に返す発話の70%をカバーします)これは、全体のCPU負荷を下げるのに本当に役立ちます。

プレシスではこれはすべて完全に実行可能です。ただし、音声認識は、マイクの品質、言語モデル、対象の音声が元の対象視聴者にどれだけ近いか(私はen_UKの子供にen_USモデルを使用しますが、完璧ではありません)およびその他の細部の詳細のみになります努力すれば、きちんとした結果を得ることができます。

そして、記録のために、私はこれまでに一度キンドルでこれをすべて一度しました(そしてそれはcmuスフィンクスとフリットでもうまくいきました)。お役に立てれば。


OPが「処理のためにGoogleに送信します」と答える答えは、あなたが正確にどこに送信したかを知りたいです。
twobob 14年

1
私はそのOPです。このチャットルームで私にpingを送信することができます。すぐにあなたを把握できるはずです。そこでさらに議論することができますし、その答えにもアイテムを追加できます。
syb0rg 14年

3

はい。音声認識にはPocketSphinxを使用し、音声入力(TTS)にはFestvoxを使用し、ライン入力のあるUSBオーディオ(またはライン入力のある古いサポートされているウェブカメラ)を使用します。

Googleはこれらのソフトウェアパッケージを検索し、「Raspberry Pi」はこれを設定するための多くの例とチュートリアルを提供します。


3
  • SiriProxy -Siriを使用するデバイスがある場合にのみこれを使用します- ジェイルブレイクする必要はありません。基本的に、インストールしたネットワーク上のSiriをインターセプトします。
  • Speech2Text -Googles APIを使用して音声をテキストにデコードできますが、この例には他のメソッドもいくつか含まれています。
  • Julius-音声認識デコーダー。

Lenikが指摘したように、何らかの方法でデコードするには、何らかの方法でオーディオを録音するか、オーディオファイルをRaspberry Piに送信する必要があります。


SiriProxyとSpeech2Textは、ラズベリーパイで音声処理を行いません。Apple/ Googleサーバーを使用します。
Dr.Avalanche

2
うん。私は言った。しかし、それでもなお音声認識の興味深い解決策です。OPには制限がありませんでした。downvoteをありがとう。不平を言う
ピョートルクラ

"... ** on ** a raspberry pi"、アップロードして他のサーバーで処理を行うと、これらは質問で指定された基準に一致しません。また、あなたが質の低いと思うか、質問に対処しないと主張するダウン投票の履歴を考えると、ダウン投票について不満を言うのも興味深いことです。
Dr.Avalanche

2
Piでは、Piを使用する以上の意味はありません。Piはインターネットに接続できるため、オプションを指定しました。「インターネットを使用したくない」とは特に言われていませんでした。または、インターネットを使用する方法がありません。おそらく、彼は質問の答えを更新し、私のものは無関係になるかもしれません。私はそれを必要とする投稿のダウンボーティングの歴史しかありません。改善の余地が見えない限り、私は決して投票しません。私たちは前にそれを扱ったと確信しています。
ピョートルクラ

1
最後のコメントは「この答えを改善してください」のようなことを言ったと思います。それから私はあなたに賛成します。ネットワーク全体の実際のFAQは、外部のガイドにリンクする際に眉をひそめます。私は、はんだ除去編組について私の意見を表明しました、あなたは弾道を行って、まだgrみを持っていました。しかし、それでも答えを改善しようとはしませんでした。フラグを付けました。誰かがそれを削除したり、コメントに変換したりすると、ダウン票が削除されます。私を証明しようとするストーカーとダウン投票は何ですか?
ピョートルクラ

2

Raspberry Piには、ADCもマイク入力も組み込まれていません。外部USBマイクを使用する予定がない限り、基本的にデバイスにオーディオストリームを取得する方法はありません。それに加えて、重大な制限はありません。CPUは、実装しようとするあらゆるサウンド処理に十分強力です。


1

まず、分類プロセスの単語セットを選択する必要があります。その後、ユーザー/サブジェクトからデータを収集する必要があります。非定常信号になります。計算コストを削減するため、または特徴抽出方法で成功率を向上させるためにデータを削減する必要があるため、アプリケーションに適した特徴抽出方法を探す必要があります。これらの方法の結果として特徴ベクトルを取得できます(平均絶対値、RMS、波形長、ゼロ交差、積分絶対値、AR係数、中央周波数、平均周波数など)。次に、knnやニューラルネットワークなどの分類方法を使用して、データを分類する必要があります。最後に、その精度を確認する必要があります。総括する:

  1. 単語/文のセットを選択します。
  2. 人間の被験者からデータを取得します。
  3. 前処理(信号のフィルタリングが必要な場合があります)
  4. 特徴抽出/処理。
  5. 分類。
  6. テスト。

インターネットでRPiを使用したビデオ処理プロジェクトを見たので、この分類を管理できます。

あなたは使用することができNI 6009 USB DAQ任意のアナログデータを収集するために(RPIをサポートしています)が、彼らは少し高価です。


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