[iOS 10] SFSpeechRecognizerで翻訳アプリを作ってみた
1 はじめに
今回は、iOS 10の新機能として追加されたSFSpeechRecognizerを使用して、翻訳アプリを作成してみました。
利用させて頂いたフレームワーク等は、次のとおりです。
- 音声入力 SFSpeechRecognizer
- 翻訳 Microsoft Translator
- 読み上げ AVFoundation
2 実行画面
最初に本アプリを実行している様子です。
下の、赤い「開始」ボタンを押すと、音声入力待ちの状態になります。 「おはようございます」と話すと、画面上部に受け付けた入力が表示されます。 入力後、「翻訳」ボタンを押すと、翻訳された内容が下部に表示されると当時に、それを読み上げます。
「今日も一日宜しくお願いします」と入力した時の状況です。
3 音声入力(SFSpeechRecognizer)
音声入力には、iOS 10で新たに追加された、SFSpeechRecognizerを使用しました。
SFSpeechRecognizerは、リアルタイム音声及び、録音済み音声に対応していますが、今回利用したのは、リアルタイム音声による入力です。
リアルタイム音声の場合の作業は、概ね次のとおりです。
- ユーザの許可(info.plist)
- マイク利用(AVAudioEngine)
- SFSpeechRecognizerの生成
- リクエストの作成
- リクエストの開始とデータ取得
(1) ユーザの許可(info.plist)
info.plistに下記の2つの設定を追加し、ユーザからの許可を得ます。
- NSMicrophoneUsageDescription(マイクの用途について)
- NSSpeechRecognitionUsageDescription(音声認識の用途について)
(2) マイクの利用(AVAudioEngine)
マイクの利用には、AVAudioEngineを使用します。 利用の方法は、概ね次のとおりです。
// 生成 let audioEngine = AVAudioEngine() // 停止 audioEngine.stop() // 開始 audioEngine.prepare() try audioEngine.start() // 入力をSFSpeechRecognizerに送る let inputNode = audioEngine.inputNode let recordingFormat = inputNode.outputFormat(forBus: 0) inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in self.recognitionRequest?.append(buffer) }
(3) SFSpeechRecognizerの作成
ロケールを指定してSFSpeechRecognizerを作成します。
let speechRecognizer = SFSpeechRecognizer(locale: Locale(localeIdentifier: "en_US"))!
(4) リクエストの作成
マイク等のオーディオバッファを利用する場合は、SFSpeechAudioBufferRecognitionRequestを使用します。
var recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
(5) リクエストの開始とデータ取得
recognitionTaskでリクエストを開始してクロージャーで入力を取得します。 入力に変化があるたびに、開始後の全部の文字列が返されます。
var recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest) { result, error in if let result = result { if (self.mode == .recording) { self.inputTextView.text = result.bestTranscription.formattedString // 入力内容 } } }
以上、簡単に列挙しましたが、詳しくは、本記事のコードや、下記のブログをご参照下さい。
【iOS 10】SFSpeechRecognizerで音声認識を試してみた
4 翻訳
翻訳については、Microsoft Translatorを利用させて頂きました。(とりあえず無料枠がある翻訳サービスは、今、これしかないと思います)
同サービスは、1ヶ月あたり200万文字まで無料で利用可能です。
翻訳ボタンを押した時点で、SFSpeechRecognizerの出力したテキストを同サービスで翻訳して下の段に表示しています。
本サービスについては、下記で紹介させて頂いております。詳しい使い方については、こちらをご参照下さい。
[iOS] 翻訳機能付Twitterクライアント
5 読み上げ
読み上げには、AVFoundationを使用しました。
使い方は、非常に簡単です。
var talker = AVSpeechSynthesizer() let utterance = AVSpeechUtterance(speechText) utterance.voice = AVSpeechSynthesisVoice(language: "en") self.talker.speakUtterance(utterance)
本アプリでは、翻訳が完了した時点で、直ちに読み上げを行っています。
AVFoundationについての詳しい情報は、下記をご参照下さい。
[Swift] AVSpeechSynthesizerで読み上げ機能を使ってみる
6 最後に
今回は、iOS 10で新しく追加されたSFSpeechRecognizerを使用してみました。 音声の入力に関しては、既に色々な方法が有りましたが、やはり純正ということで少し魅力を感じます。
また、思ったより日本語の認識が良く、ビックリしました。
コードは下記に置きました。気になるところが有りましたら、ぜひ教えてやってください。
[GitHub] https://github.com/furuya02/SpeechRecognizerSample
※本サンプルを動作させるためには、翻訳サービスのキーが必要です。各自で別途ご用意下さい。
7 参考リンク
SpeakToMe: Using Speech Recognition with AVAudioEngine
API Reference SFSpeechRecognizer
【iOS 10】SFSpeechRecognizerで音声認識を試してみた
[Swift] AVSpeechSynthesizerで読み上げ機能を使ってみる