iOS 10 SDKの新機能SiriKit、音声認識、iMessage拡張を自作アプリに生かすにはiOS 10アプリ開発入門(3/4 ページ)

» 2016年09月26日 05時00分 公開
[杉本裕樹マネーフォワード]

音声認識の概要

 次は音声認識を紹介します。

 音声認識は音声をテキストに起こしてくれる機能です。この機能を使えばマイクに話している内容の文字起こしや音声データのテキストデータ化が可能になります。

 しかしアップルのサーバとの通信が必要なので、「インターネットにつながっているところでしか使えない」という注意点もあります。処理内容も重く、バッテリーや通信量にも注意して利用する必要があります。

音声認識の実装

 それでは、実際に音声認識機能を使ったアプリを作ってみます。ここではマイクからの声を拾って画面上に表示するアプリを作ってみます。

「Single View Application」で新規プロジェクトを作成

 まずは新規プロジェクトを作成します。プロジェクトの種類はSimple View Applicationとします。

ソースコードの変更

 プロジェクトを作ったら、音声認識フレームワークのSpeechを追加します。

 Info.plistに「NSSpeechRecognitionUsageDescription」「NSMicrophoneUsageDescription」というキーを追加して、マイクと音声解析の使用目的を記述します。

 次はViewController.swiftを以下のように変更します。ボタン押下時、解析中なら解析終了、解析前なら音声解析を開始する処理を追加してあります。

class ViewController: UIViewController {
    private let recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
    private let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "ja-JP"))!
    private var recognitionTask: SFSpeechRecognitionTask?
    private let audioEngine = AVAudioEngine()
 
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var button: UIButton!
 
    public override func viewDidLoad() {
        super.viewDidLoad()
 
        SFSpeechRecognizer.requestAuthorization { _ in }
    }
 
    @IBAction func tapStartBtn(_ sender: AnyObject) {
        if audioEngine.isRunning {
            audioEngine.stop()
            recognitionRequest.endAudio()
            recognitionTask?.cancel()
            recognitionTask = nil
            button.setTitle("録音完了", for: .normal)
            button.isEnabled = false
        } else {
            // マイクからの音声を解析エンジンに渡す
            let recordingFormat = audioEngine.inputNode?.outputFormat(forBus: 0)
            audioEngine.inputNode?.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in
                self.recognitionRequest.append(buffer)
            }
            try! audioEngine.start()
 
            recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest) { [weak self] result, error in
                // 解析結果を反映
                if let result = result {
                    self?.label.text = result.bestTranscription.formattedString
                }
            }
 
            button.setTitle("録音終了", for: .normal)
        }
    }
}

 最後にMain.storyboardにラベルとボタンを配置します。それぞれをViewControllerのlabelとbuttonとひも付けます。次にbutton押下時のアクションをtapStartBtnとひも付ければ完成です。

動作確認と音声認識を使うサンプルのソースコード

 アプリを起動すると最初にアクセス許可を求められます。

 起動してボタンを押すと解析開始します。マイクに話し掛ければ、その内容を画面に表示してくれます。

 今回は「iOS 10で追加されたスピーチフレームワークのテスト中」と話し掛けたのですが、正確に拾ってくれました。

 今回作成したコードは、こちら「SpeechSample.zip」からダウンロードできます。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。