[iOS 10] SFSpeechRecognizerで翻訳アプリを作ってみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

今回は、iOS 10の新機能として追加されたSFSpeechRecognizerを使用して、翻訳アプリを作成してみました。

利用させて頂いたフレームワーク等は、次のとおりです。

  • 音声入力 SFSpeechRecognizer
  • 翻訳 Microsoft Translator
  • 読み上げ AVFoundation

2 実行画面

最初に本アプリを実行している様子です。

下の、赤い「開始」ボタンを押すと、音声入力待ちの状態になります。 「おはようございます」と話すと、画面上部に受け付けた入力が表示されます。 入力後、「翻訳」ボタンを押すと、翻訳された内容が下部に表示されると当時に、それを読み上げます。 200 201 202

「今日も一日宜しくお願いします」と入力した時の状況です。

200 203 204

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万文字まで無料で利用可能です。

003

翻訳ボタンを押した時点で、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 [GitHub] https://github.com/furuya02/SpeechRecognizerSample
※本サンプルを動作させるためには、翻訳サービスのキーが必要です。各自で別途ご用意下さい。

7 参考リンク


SpeakToMe: Using Speech Recognition with AVAudioEngine
API Reference SFSpeechRecognizer
【iOS 10】SFSpeechRecognizerで音声認識を試してみた
[Swift] AVSpeechSynthesizerで読み上げ機能を使ってみる