【iOS】Speechフレームワークでアナウンサーの声を認識させてみた

こんにちは。
iOSのSpeechフレームワークをSwiftで使ってみました。

なお、今回の検証は、以下のあたも技術ブログ様を参考に実装しております。

atamo-dev.hatenablog.com

Swiftによる実装方法

まずは実装方法の解説です。

許可を取得する

SFSpeechRecognizerを使用するためには、ユーザー許可を取得する必要があります。

// 音声認識の許可を取得する
SFSpeechRecognizer.requestAuthorization { authStatus in
    print(authStatus)
}

注意点としては、許可を得る際の許諾メッセージをInfo.plitに書く必要があります。

<key>NSSpeechRecognitionUsageDescription</key>
<string>音声認識を使用します。</string>

MP3ファイルを解析するサンプルプログラム

MP3ファイルを解析するための、Speechフレームワークの実装サンプルを掲載します。

驚くほど簡単に実装することができました。たったこれだけで音声ファイルが解析できるなんて、素晴らしいです。

import UIKit
// Speechフレームワークを使用する
import Speech

class ViewController: UIViewController, SFSpeechRecognizerDelegate {
    private let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "ja_JP"))
    private var recognitionTask: SFSpeechRecognitionTask?

    override func viewDidLoad() {
        super.viewDidLoad()
        self.speechRecognizer?.delegate = self

        // 音声認識の許可を取得する
        SFSpeechRecognizer.requestAuthorization { authStatus in
            print(authStatus)
        }
        
        // サンプル用のMP3ファイルのパスを取得する
        // MP3ファイルは、あらかじめプロジェクトに加えてください
        //let path = Bundle.main.path(forResource: "bi", ofType: "mp3")
        let path = Bundle.main.path(forResource: "nhk_s", ofType: "mp3")
        //let path = Bundle.main.path(forResource: "sekaishi", ofType: "mp3")
        
        self.doRecognize(url: URL(fileURLWithPath: path!))
    }
    
    /// 解析実行
    func doRecognize(url: URL) {
        let recognitionRequest = SFSpeechURLRecognitionRequest(url: url)
        // 時間計測用
        let start = Date()

        self.recognitionTask = self.speechRecognizer?.recognitionTask(with: recognitionRequest) { result, error in
            if let result = result {
                print("所要時間", Date().timeIntervalSince(start))
                // 解析結果の文字列を表示します
                print(result.bestTranscription.formattedString)
            }
            
            if let error = error {
                print(error)
            }
        }
    }
}

こんな感じでログに出力されます

f:id:konosumi:20171022171627p:plain

アナウンサーの声を認識してみた結果

それでは、解析してみた結果を共有します。

今回の解析には、フリーアナウンサーである向坂真弓氏のサイトにて公開されている、ボイスサンプルを使用しました。

フリーアナウンサー 向坂真弓オフィシャルサイト

アナウンサーの声にした理由は、アナウンサーほどの明瞭快活な声であれば、認識しやすいだろうと思ったからです。

検証に使用したのは、以下のボイスサンプルになります。

  • NHKラジオ「19時のニュース」より
  • DVD「ムービー世界史」より
  • 月刊CD「小山政彦のビジネスイノベーション」より

向坂真弓氏の声は聞きやすくハキハキしておりますので、サンプルとして不足はないかと思います。

DVD「ムービー世界史」よりの認識(解析)結果

  • 音声の長さ: 58秒
  • 解析に要した時間: 約42秒
  • 認識結果: 明けメネス朝ペルシャ帝国の強大な権力を象徴するペルセポリス古の都は帝国の新連載のためのもので帝国を構成する諸民族の代表が大に忠誠を誓いつのしるしとして諸国の特産品を玉座に捧げる儀式が繰り広げられました高い脊柱の上には動物の中東が乗せられ屋根は次罪です枯れていましたイケメンは日干しレンガで作られていましたそしてもんや宮殿の浮き彫りは色が施されていたといいます

良い感じに認識できている箇所もあれば、粗が目立つ部分もあります。イケメンは日干しレンガで作られているらしいです(苦笑)。

課題として感じるのは、やはり漢字の認識は難しいみたいです。「大に忠誠は」は「王に忠誠」が正しいですし、「次罪」は「杉材」が正解です。

但し、漢字の間違えが発生している根本の理由は、「お」と「う」や「す」と「つ」など、発音が似ているひらがなの認識間違えが原因ではないかと思われます。

全体的にはそれなりに認識してくれており、想像していたよりも良い結果でした。

  • アナウンサークラスの発音でも間違えることもある
  • 専門性のある文章(今回であれば歴史)だと、間違える確立は増えそう

このあたりが課題でしょうか。

月刊CD「小山政彦のビジネスイノベーション」よりの認識結果

  • 音声の長さ: 58秒
  • 解析に要した時間: 約37秒
  • 認識結果: こんにちは小坂舞美です高山雅彦のビジネスイノベーション2013年9月号を送りします夜風に秋を感じますねみなさまいかがお過ごしでしょうかこの高山雅彦のビジネスイノベーションでは次世代のビジネスセンスを身に付けるための知識や方法を株式会社フード高山雅彦会長に語っていただきますさらにいんたびをである見通しコンサルタント中島正治が最新の尻を下に鋭く切り込みます繰り返しお聞きいただき最前線のノウハウや知識を実際のビジネスにご活用いただければと思います

「向坂真弓」が「小坂舞美」に、「小山政彦」が「高山雅彦」になっています。人名の漢字を正しく推測するのは、やはり音声認識では限界があるようですね。

英語の場合は、どの漢字を使えば良いのかなんて悩みはないでしょうから、正直なところ英語が羨ましいです。

(注釈:そもそも人間だって、よほどの有名人の名前でもない限りは、人名を発音されても正しい漢字に確実に変換することはできません)

「最新の尻」は思わず爆笑してしまいましたが、正しくは「最新の時流」です。

NHKラジオ「19時のニュース」よりの認識結果

  • 音声の長さ: 55秒
  • 解析時間: 約10秒
  • 認識結果: 震災で出た大量の瓦礫の処理を進めようとコンクリートの瓦礫で作ったブロックを海に沈めてワカメや昆布を育てる実験が岩手県と青森県の被災地で行われることになりましたこれは水産庁が行うもので今日は岩手県大槌町でほど人を対象にした説明会が開かれました

途中まで進んだところで、進捗がパタッと進まなくなり、エラー終了してしまいました。他のサンプルに比べて、話のテンポが早いからかもしれません。

[Utility] +[AFAggregator logDictationFailedWithError:] Error Domain=kAFAssistantErrorDomain Code=203 "SessionId=com.siri.cortex.ace.speech.session.event.SpeechSessionId@1faa1e6d, Message=Timeout waiting for command after 30000 ms"

まとめ

Speechフレームワークを使用することにより、お手軽に音声認識を組み込むことができました。

しかしながら、現役アナウンサーの声をもってしても、漢字の誤認識や似通った発音のひらがなを間違えたりしてしまっています。やはり、日本語の音声認識にはまだまだ課題が多いようです。

また、今回はiPhone5Sのシミュレータを使用しましたが、実機で検証しても動作速度はあまり変わりませんでした。速度面の向上も改善が必要なポイントかなと思います。

ただ、こんなにも簡単に音声認識が実装できてしまうことにビックリしました。これは今後に期待できそうです。