web-dev-qa-db-ja.com

Androidの音声認識は録音されたサウンドクリップで?

私はAndroid=で音声認識機能を使用しましたが、私はそれを愛しています。これは私の顧客の最も賞賛されている機能の1つです。ただし、形式は多少制限されています。認識機能のインテントを呼び出す必要があります。文字起こしの録音をgoogleに送信し、テキストが返されるのを待ちます。

私のアイデアのいくつかは、私のアプリ内でオーディオを録音し、それからトランスクリプションのためにクリップをグーグルに送ることを必要とするでしょう。

音声で処理するオーディオクリップをテキストに送信する方法はありますか?

31

私は音声認識と音声録音を行うためにうまく機能している解決策を得ました。これが link からシンプルなAndroidプロジェクトへのソリューションの動作を示すために作成したプロジェクトです。また、アプリを示すためにプロジェクト内に印刷画面をいくつか配置しました。

私が使ったアプローチを簡単に説明しようと思います。このプロジェクトでは、Google Speech APIとFlacレコーディングの2つの機能を組み合わせました。

Google Speech APIは、HTTP接続を介して呼び出されます。 Mike Pultz は、APIの詳細を提供します。

「(...)新しい[Google] APIは全二重ストリーミングAPIです。これは、2つのHTTP接続を実際に使用することを意味します。1つPOSTリクエストとしてコンテンツをアップロードします「ライブ」のチャンクストリーム、および結果にアクセスするための2番目のGETリクエスト。これは、長いオーディオサンプルやストリーミングオーディオの場合に非常に意味があります。」

ただし、このAPIが正しく機能するには、FLACサウンドファイルを受信する必要があります。それでは、次のパート、Flacレコーディングに進みます。

AudioBooと呼ばれるオープンソースアプリからコードとライブラリの一部を抽出して適応させることにより、そのプロジェクトにFlacレコーディングを実装しました。 AudioBooはネイティブコードを使用して、flac形式を記録および再生します。

したがって、flacサウンドを録音してGoogle Speech APIに送信し、テキストを取得して、録音したばかりのサウンドを再生することができます。

私が作成したプロジェクトには、それを機能させるための基本原則があり、特定の状況で改善することができます。別のシナリオで機能させるためには、Google Chromium-devグループの一部として取得されたGoogle Speech APIキーを取得する必要があります。機能することを示すために、そのプロジェクトにキーを1つ残しましたが、最終的には削除します。誰かがそれについてさらに情報が必要な場合は、この投稿に2つを超えるリンクを配置することができない原因を教えてください。

10
lsantsan

残念ながら現時点ではできません。現在Androidの音声認識サービスでサポートされている唯一のインターフェースはRecognizerIntentです。このインターフェースでは、独自のサウンドデータを提供できません。

これが見たいものである場合は、 http://b.Android.com で機能リクエストを提出してください。これは、既存の issue 4541 にも接線的に関連しています。

3
Trevor Johns

私の知る限り、音声クリップを直接Googleに送信して文字起こしする方法はまだありません。ただし、Froyo(APIレベル8)は、音声認識サービスへの直接アクセスを提供する SpeechRecognizer クラスを導入しました。したがって、たとえば、オーディオクリップの再生を開始し、アクティビティに音声認識機能をバックグラウンドで聞いて開始させることができます。これにより、完了後にユーザー定義のリスナーコールバックメソッドに結果が返されます。

SpeechRecognizerのメソッドはメインアプリケーションスレッドで実行する必要があるため、次のサンプルコードをアクティビティ内で定義する必要があります。また、AndroidManifest.xmlに RECORD_AUDIO 権限を追加する必要があります。



    boolean available = SpeechRecognizer.isRecognitionAvailable(this);
    if (available) {
        SpeechRecognizer sr = SpeechRecognizer.createSpeechRecognizer(this);
        sr.setRecognitionListener(new RecognitionListener() {
            @Override
            public void onResults(Bundle results) {
                // process results here
            }
            // define your other overloaded listener methods here
        });
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        // the following appears to be a requirement, but can be a "dummy" value
        intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, "com.dummy");
        // define any other intent extras you want

        // start playback of audio clip here

        // this will start the speech recognizer service in the background
        // without starting a separate activity
        sr.startListening(intent);
    }

RecognitionService を拡張して独自の音声認識サービスを定義することもできますが、これはこの回答の範囲を超えています:)

2
zen_of_kermit