Googleが音声認識サービスのAPIを開くのを長い間待っていました(会社はそれを製品で使用しています)。 数か月前、私は「これはあなたのインターネットです」と言いましたが、役に立ちませんでした。 そして最近、Habrについてのトピックがあります。.NET アプリケーションでGoogle Voice Searchを使用しています 。 とても幸せでした。 トピックは元の記事Accessing Google speech API / Chrome 11を指します 。 私は慎重にChromeソースを調べて「ピックアップ」しました。
Google Speech Recognition APIはまだ非公式であり、Chromeブラウザーを介して一般に公開されています。
その使用のためのオプションは本当に無限です。 そして、これを形態学的モジュールと組み合わせると、音声制御の分野でおかしなことができます。
ワイヤーフレームエンジンをデモンストレーションして作成するために(今後のニーズに合わせて)、数日でMac OS X用の音声翻訳を作成しました。 これは、Googleテクノロジー、Microsoft(発音)、およびオープンソースプロジェクトffmpeg(flacへの変換)の共生です。 これは音声翻訳機です-入力なし。 フレーズを言って、その翻訳を聞いてください。 はい、認識品質は理想的ではないかもしれませんが、短く明確なフレーズではそれはまったく受け入れられます。
プログラムのビデオは次のとおりです。
いつものように、このトピックを2つの部分に分けます。 このプログラムに「ふける」ことを望んでいる一般ユーザー向けです。 開発者向けのもう1つ(基本プロジェクトのソースコードを提供します)。
ユーザー向け
リンク (Mac OS X 10.6+)からプログラムをダウンロードできます。
プログラムのインターフェイスは非常にシンプルです。 希望する言語の方向を選択します(このデモプロジェクトでは2つの方向のみを作成しましたが、サービスははるかに多くの言語をサポートしています)。 「録音」ボタンを押してフレーズを言います。 録音は5秒後に自動的に停止しますが、自分で停止することもできます。 それだけです-翻訳を聞いてください:)。



開発者向け
Githubソースコード。
このプロジェクトでは、既に組み立てられたffmpegバイナリコンバーターを使用して、録音されたサウンドをflacに変換します。 プロジェクトをiOSに転送する場合は、 libFlacプロジェクトの静的ライブラリを使用できます。
HUDインターフェースの場合、プロジェクトは既にアセンブルされたBGHUDAppKitフレームワークを使用します。
JSONフレームワークはJSONの処理に使用されます。
さらに(簡略化のため)、 Google Data APIのいくつかのクラスが使用されます。
録音
サウンドは、標準のQTKitライブラリ(QuickTime Kit)を使用して記録されます。
オーディオキャプチャセッションの初期化コードは次のとおりです。
BOOL success = NO ;<br/>
<br/>
mCaptureSession = [ [ QTCaptureSession alloc ] init ] ;<br/>
<br/>
QTCaptureDevice * audioDevice = [ QTCaptureDevice defaultInputDeviceWithMediaType : QTMediaTypeSound ] ;<br/>
<br/>
if ( ! audioDevice ) <br/>
{ <br/>
[ mCaptureSession release ] , mCaptureSession = nil ;<br/>
<br/>
[ textLabel setStringValue : NSLocalizedString ( @ "AudioError" , @ "" ) ] ;<br/>
[ button setHidden : YES ] ;<br/>
[ popUp setHidden : YES ] ;<br/>
[ textLabel setHidden : NO ] ;<br/>
} <br/>
<br/>
success = [ audioDevice open : NULL ] ;<br/>
<br/>
if ( ! success ) <br/>
{ <br/>
[ mCaptureSession release ] , mCaptureSession = nil ;<br/>
<br/>
[ textLabel setStringValue : NSLocalizedString ( @ "AudioError" , @ "" ) ] ;<br/>
[ button setHidden : YES ] ;<br/>
[ popUp setHidden : YES ] ;<br/>
[ textLabel setHidden : NO ] ;<br/>
} <br/>
<br/>
mCaptureAudioDeviceInput = [ [ QTCaptureDeviceInput alloc ] initWithDevice : audioDevice ] ;<br/>
success = [ mCaptureSession addInput : mCaptureAudioDeviceInput error : NULL ] ;<br/>
<br/>
if ( ! success ) <br/>
{ <br/>
[ mCaptureSession release ] , mCaptureSession = nil ;<br/>
[ mCaptureAudioDeviceInput release ] , mCaptureAudioDeviceInput = nil ;<br/>
<br/>
[ textLabel setStringValue : NSLocalizedString ( @ "AudioError" , @ "" ) ] ;<br/>
[ button setHidden : YES ] ;<br/>
[ popUp setHidden : YES ] ;<br/>
[ textLabel setHidden : NO ] ;<br/>
} <br/>
<br/>
mCaptureMovieFileOutput = [ [ QTCaptureMovieFileOutput alloc ] init ] ;<br/>
success = [ mCaptureSession addOutput : mCaptureMovieFileOutput error : NULL ] ;<br/>
<br/>
if ( ! success ) <br/>
{ <br/>
[ mCaptureSession release ] , mCaptureSession = nil ;<br/>
[ mCaptureAudioDeviceInput release ] , mCaptureAudioDeviceInput = nil ;<br/>
[ mCaptureMovieFileOutput release ] , mCaptureMovieFileOutput = nil ;<br/>
<br/>
//error handler <br/>
} <br/>
<br/>
[ mCaptureMovieFileOutput setDelegate : self ] ;<br/>
<br/>
[ mCaptureMovieFileOutput setCompressionOptions : [ QTCompressionOptions compressionOptionsWithIdentifier : @ "QTCompressionOptionsHighQualityAACAudio" ] forConnection : [ [ mCaptureMovieFileOutput connections ] objectAtIndex : 0 ] ] ;<br/>
<br/>
[ mCaptureSession startRunning ] ; <br/>
次に、ファイルへの書き込みを開始するために、次のことを行います。
[ mCaptureMovieFileOutput recordToOutputFileURL : path ] ;
記録を終了するには:
[ mCaptureMovieFileOutput recordToOutputFileURL : nil ] ;
変換
サウンドファイルを受け取ったら、ffmpegを使用してflac形式に変換します。
NSTask * aTask = [ [ NSTask alloc ] init ] ;<br/>
NSMutableArray * args = [ NSMutableArray array ] ;<br/>
<br/>
[ args addObject : @ "-i" ] ;<br/>
[ args addObject : @ "record.m4a" ] ;<br/>
[ args addObject : @ "-acodec" ] ;<br/>
[ args addObject : @ "flac" ] ;<br/>
[ args addObject : @ "-ac" ] ;<br/>
[ args addObject : @ "1" ] ;<br/>
[ args addObject : @ "-ar" ] ;<br/>
[ args addObject : @ "16000" ] ;<br/>
[ args addObject : @ "record.flac" ] ;<br/>
[ aTask setCurrentDirectoryPath : recordPath ] ;<br/>
[ aTask setLaunchPath : [ [ [ NSBundle mainBundle ] resourcePath ] stringByAppendingPathComponent : @ "ffmpeg" ] ] ;<br/>
[ aTask setArguments : args ] ;<br/>
[ aTask launch ] ;<br/>
[ aTask waitUntilExit ] ;<br/>
[ aTask release ] ;
ネットワークサービスとの通信
変換後、認識プロセスを開始します。 別のGoogleASRクラスに実装されます。 このクラスのオブジェクトは、リクエストを(非同期で) https://www.google.com/speech-api/v1/recognizeに送信し、結果を処理し、認識コンテンツについてデリゲートに通知するか、エラーを報告します。 サーバーからの応答を処理するプロセスは非常に正確です-Chromeブラウザーから完全に(アルゴリズム)コピーされます。 クラスにはメインメソッドが1つだけあります。
- ( void ) speechRecognition : ( NSString * ) flacPath language : ( NSString * ) language
次に、認識されたテキストをGoogleTranslateクラスのオブジェクトに渡します。 彼はテキストを翻訳し、翻訳の結果を代表者に通知するか、エラーを通知します。 主な方法:
- ( void ) translate : ( NSString * ) text from : ( NSString * ) inLanguage to : ( NSString * ) outLanguage
次に、MicrosoftTTSクラスオブジェクトが作用します。 オーディオデータを受信し、デリゲートに渡すか、エラーを報告します。 主な方法:
- ( void ) textToSpeech : ( NSString * ) text language : ( NSString * ) language
MicrosoftからBing AppIDを取得し(これは無料で行われます)、SpeechURLのMicrosoftTTSクラスに挿入することを忘れないでください。
実験!