Mac OS X用の音声翻訳

最近では、SF映画でのみ、あなたが話す「箱の奇跡」を見ることができ、その結果、あなたは別の言語で言われたことの翻訳を聞くことができます。 しかし、進行中です...



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クラスに挿入することを忘れないでください。



実験!



All Articles