今から始めるSpeech framework

tsuzuki817

#SpeechFramework #iOS #Swift #音声認識

Speech frameworkとは

Apple純正の音声認識フレームワーク
リアルタイム音声も録音した音声も解析することが可能!
iPhone, iPad, macで利用可能
SwiftUIで開発することで全に対応できます!(Catalist最高!)

音声認識する方法

サーバーとの通信を行う方法とオンデバイスで行う2通りの方法があります。

スクリーンショット 2020-07-10 19.46.25

サーバーが使えない際には、サポートされている端末、言語ならば自動的にオンデバイス認識に切り替わります。

Apple A9以降のプロセッサを搭載するiPhone, iPadとmacは全てサポートされています。
iPhone 6s and Later, iPad(5th generation) and later, mac all

オフライン対応言語

English
United States
Canada
Great Britain
India
Spanish
United States
Mexico
Spain
Italian
Brazilian Portuguese
Russian
Turkish
Chinese Mandarin and Cantonese

API制限について

1リクエスト60秒

1時間に1000回
アプリごとではなく、デバイスごとの制限

Info.plist

以下の二つをInfo.plistに追記します。
 - NSSpeechRecognitionUsageDescription
 - NSMicrophoneUsageDescription

実装

Speechをインポート 

import Speech

Localeを指定特定の言語を指定する

SFSpeechRecognizer(locale: Locale(identifier: "ja_JP"))

方法ユーザーの現在のLocaleを設定する方法

SFSpeechRecognizer(locale: Locale.current)

アクセス許可

SFSpeechRecognizer.requestAuthorization {status in
   switch status {
   case .authorized:
   case .denied:
   case .restricted:
   case .notDetermined:
   }
}

音声ソースの定義

リアルタイム音声解析

SFSpeechAudioBufferRecognitionRequest()

録音した音声を解析

SFSpeechURLRecognitionRequest(url: URL)

Requestの結果を処理

speechRecognizer?.recognitionTask(with: speechRequest, 
                          resultHandler: { (speechResult, error) in 
    if speechResult.isFinal {
        print("Speech in the file is \(speechResult.bestTranscription.formattedString)")
    }                          
})

音声認識結果

iOS10 まで

書き起こし(Transcription)
与えられた音声全体をテキストで表したもの

代替解釈(Alternative interpretations)
書き起こしの異なる解釈

信頼度(Confidence levels)
書き起こしがユーザーのSpeechと正確に一致するという信頼度

タイミイング情報(Timing information)
認識した音声の中で話していた単語などの開始からの秒数

iOS13以降

速度(speakingRate)
1分間に話される言葉の数

平均休止時間(averagePauseDuration)
単語間の一時的な停止時間の平均、単位は秒

音声解析機能
result.bestTranscription.segmentsから取得

SFTranscriptionSegment

全体の一部を詳細に取得するために利用
一つの意味を表す単語、単語のグループの音声
(ex: 共有会 → 今日誘拐、共有回 など )

SFVoiceAnalytics

Jitter:
ピッチの変化を、フレームの基本周波数のパーセンテージで表したもの
segment.voiceAnalytics?.jitter.acousticFeatureValuePerFrame

Shimmer:
 各フレームにおける声量安定性(振幅)の変化をデシベルで表す
segment.voiceAnalytics?.shimmer.acousticFeatureValuePerFrame

Pitch:
各フレームにおける音色(基本周波数)の高低を対数で表したもの
segment.voiceAnalytics?.pitch.acousticFeatureValuePerFrame

Voicing:
スピーチの中で発生した音域[0.0, 1.0]の範囲の確率で表したもの
segment.voiceAnalytics?.voicing.acousticFeatureValuePerFrame

自分の拙い発音で試してみた

「共有会」と発音して認識してみた

スクリーンショット 2020-07-10 20.25.21

スクリーンショット 2020-07-10 20.25.31

実装時の注意

通話中は録音ができないのでデバッグ時には注意

保存する際に拡張子.m4aにしないと音声分析が失敗になる(ex: AVAudioRecorderのrecord() )

https://developer.apple.com/documentation/speech
https://qiita.com/yonell/items/509f114e9fb5dbb01f3c
https://developer.apple.com/videos/play/wwdc2019/256/
https://developer.apple.com/library/archive/qa/qa1951/_index.html#//apple_ref/doc/uid/DTS40017662
https://academy.realm.io/jp/posts/tryswift-marc-brown-say-it-aint-so-implementing-speech-recognition/

https://speakerdeck.com/tsuzuki817/speech-framework-tips

この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
tsuzuki817
ヤフーでPayPayフリマのiOSアプリ開発をしています! 趣味は個人開発でSwiftUIを使っています