Table of Contents
音声認識をiOSアプリに統合することで、ユーザーがどのようにやり取りしたり、ハンズフリーなコントロール、より高速なデータ入力、およびアクセス性の向上を促したりすることができます。AppleのSpeechフレームワークは、ユーザーのプライバシーを尊重し、信頼できるリアルタイムのトランスクリプションを提供します。この記事では、パフォーマンスの最適化、多言語サポート、エラー処理のベストプラクティスを含む、基礎的なセットアップから高度な実装パターンに至るまで、すべてをカバーしています。
スピーチフレームワークアーキテクチャの理解
スピーチフレームワーク(iOS 10 で導入)は、以下の 3 つのコアコンポーネントで動作します。
- []SFSpeechRecognizer[ - 特定の言語と局部の認識を調整するプライマリインターフェイス。 オンデバイスまたはサーバーベースの認識を使用するように設定できます。
- []SFSpeechRecognitionRequest - オーディオ入力を表します。 ライブオーディオストリームの録音オーディオファイルとの2つの主要なサブクラス:]]]。
- []SFSpeechRecognitionTask - 認識プロセスを管理し、進捗状況の更新と最終結果を提供します。 キャンセルとパワセをサポートします。
フレームワークは、自動音声認識器(ASR)エンジンを介してオーディオを処理します。 デフォルトでは、iOS 15 +は、すべてのサポートされている言語に対してオンデバイス認識を使用し、遅延を減らし、データがデバイスを離れることを確実にします。 サーバーベースの認識は、古いデバイスや特定の言語でも利用でき、アクティブなインターネット接続とユーザー同意が必要です。
主な特長と能力
- []リアルタイムストリーミング[]] - ボイスは、定期的な部分的な結果で、ユーザーが話すように翻訳されます。
- []代替転写] - 各結果には、]と[を介して、自信のあるスコアリングで複数の解釈が含まれています。
- [] コンテキストフレーズ - 開発者は、ドメイン固有の用語の精度を向上させるために[]を介してカスタムフレーズを提供できます。
- ]サポート言語 - 60以上の言語と地域のアクセント。 ]を使用して、現在のリストを取得します。
パーミッションとプロジェクト構成の設定
[常にリクエスト権限を明示的に要求します。[[]]適切な権限がなければ、システムは認識リクエストを拒否します。次の手順に従ってください。
Info.plist の要件
明確でユーザーフェースな説明でキー[(プライバシー - 音声認識使用説明)を追加します。例:
<key>NSSpeechRecognitionUsageDescription</key>
<string>This app uses speech recognition to transcribe your voice commands for hands-free navigation.</string>
アプリが音声(ライブ認識に共通)を記録する場合、 [ も追加します。
許可申請の承認
コール は、通常、ビューコントローラの で、アプリのライフサイクルで初期に、呼び出します。コールバックは、4つのステータスの1つを返します。
import Speech
SFSpeechRecognizer.requestAuthorization { authStatus in
DispatchQueue.main.async {
switch authStatus {
case .authorized:
// Enable microphone and recognition UI
case .denied, .restricted:
// Show error and disable features
print("Speech recognition not available")
case .notDetermined:
// Handle if the user hasn't seen the dialog (rare)
@unknown default:
break
}
}
}
注意: デバイスがペアレンタルコントロールプロファイルで管理されている場合、または画面時間で音声認識が無効になっている場合、フレームワークは[[[を返すことがあります。
ライブスピーチ認識の実装
リアルタイムの音声キャプチャでは、音声バッファを認証リクエストにストリームするためにが必要です。次のコードは、適切なクリーンアップで生産準備の実装を示しています。
ステップ1: オーディオセッションの設定
let audioEngine = AVAudioEngine()
let request = SFSpeechAudioBufferRecognitionRequest()
var recognitionTask: SFSpeechRecognitionTask?
func configureAudioSession() {
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(.record, mode: .measurement, options: .duckOthers)
try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
} catch {
print("Audio session config failed: \(error.localizedDescription)")
}
}
オプションは、ノイズ環境での転写精度を向上させるバックグラウンドミュージックボリュームを低下させます。 音声専用のアプリでは、イヤホンの代わりにデバイススピーカーを介してオーディオをルーティングするためにを検討してください。
ステップ2: 認識装置および要求を作成する
func startRecognition() {
guard let recognizer = SFSpeechRecognizer(locale: Locale(identifier: "en-US")),
recognizer.isAvailable else {
handleError("Recognizer unavailable or not supported")
return
}
configureAudioSession()
request.shouldReportPartialResults = true
let inputNode = audioEngine.inputNode
let recordingFormat = inputNode.outputFormat(forBus: 0)
recognitionTask = recognizer.recognitionTask(with: request) { result, error in
if let result = result {
let transcribedText = result.bestTranscription.formattedString
// Update UI or process command
print("Partial: \(transcribedText)")
if result.isFinal {
self.stopRecognition()
// Handle final transcription
}
}
if let error = error {
self.stopRecognition()
self.handleError(error.localizedDescription)
}
}
inputNode.installTap(onBus: 0, bufferSize: 1024,
format: recordingFormat) { buffer, _ in
self.request.append(buffer)
}
audioEngine.prepare()
do {
try audioEngine.start()
} catch {
handleError("Audio engine start failed: \(error.localizedDescription)")
}
}
ステップ3: うまくきれいにきれいにして下さい
func stopRecognition() {
recognitionTask?.cancel()
audioEngine.stop()
audioEngine.inputNode.removeTap(onBus: 0)
request.endAudio()
// Optionally deactivate audio session
try? AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
}
オーディオエンジンを停止する前に、常に認識タスクをキャンセルします。入力ノードのタップを外すために、サイクルを保持し、マイクロフォンが解放されるのを防ぐことができます。
多言語・カスタムローカルの処理
Speechフレームワークは、動的ロケール検出をサポートしています。ユーザーは、複数の言語を切り替えたり、複数の言語を単一のセッションで認識したりすることができます。] インスタンスを別々に作成することで、複数の言語を切り替えたり、複数の言語を単一のセッションで認識したりすることができます。
let locales = ["en-US", "fr-FR", "zh-CN"]
let recognizers = locales.compactMap { SFSpeechRecognizer(locale: Locale(identifier: $0)) }
// Use recognizers[0] for English, etc.
オンデバイス認識では、各認識者は、その言語モデルにメモリ比例を消費します。複数の言語をサポートするときに、古いデバイスでパフォーマンスをテストします。
カスタム語彙とドメインの用語
[]のプロパティを使用して、業界固有の用語の精度を向上させる:
request.contextualStrings = ["Directus", "CMS", "headless", "REST API"]
これらフレーズを支持する認識者をヒントにし、珍しい用語の誤認識を削減します。
エラー処理とフォールバック戦略
音声認識は、ネットワークの問題(サーバーベースの場合)、オーディオの中断、マイクの無効化、またはメモリの圧力など、多くの理由で失敗することができます。 堅牢なハンドラを実行します。
enum RecognitionError: LocalizedError {
case noPermission
case unavailable
case audioSessionFailure
case internalError(Error)
var errorDescription: String? {
switch self {
case .noPermission:
return "Speech recognition permission denied"
case .unavailable:
return "Recognizer is busy or not available"
case .audioSessionFailure:
return "Could not start audio capture"
case .internalError(let error):
return error.localizedDescription
}
}
}
func handleError(_ message: String) {
// Show alert, retry button, or fallback to text input
DispatchQueue.main.async {
// Show toast or log
}
}
[]]のプロパティで認識タスクの状態が変更されるのを監視して、キャンセルやタイムアウトを検出します。
パフォーマンスの最適化とベストプラクティス
- [] オンデザイズ認識を準備します。iOS 15以降、オンデザイズ認識はデフォルトで、レイテンシが低下します。言語がまだオフラインでサポートされていない限り、サーバーベースの強制を回避します。 ] で空室状況を検証します。
- [ 部分的な結果[]を制限します。 []を設定すると、最終的な転写のみが必要な場合は、オーバーヘッドが減少します。
- [] 認識寿命の管理 – ユーザーが話を停止したときに長時間実行タスクをキャンセルします。セッションを自動終了させるために、タイムアウト(例、2秒の沈黙)を使用します。
- []バッテリーとメモリ[]] - オーディオエンジンと認識タスクは重要なリソースを消費します。アプリがバックグラウンドに行くときに認識を悪用または停止します。
- ] マイク依存症を回避するために、開発中のプレ録画オーディオファイル()を使用する] - モックデータでテストします。
インタールプションの取り扱い
電話の呼び出し、警報、またはSiriは、アクティブな認識セッションを中断することができます。 [を購読して、順調に再開します。
NotificationCenter.default.addObserver(
self,
selector: #selector(handleInterruption),
name: AVAudioSession.interruptionNotification,
object: nil
)
@objc func handleInterruption(_ notification: Notification) {
guard let userInfo = notification.userInfo,
let type = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt else { return }
if type == AVAudioSession.InterruptionType.began.rawValue {
stopRecognition()
} else if type == AVAudioSession.InterruptionType.ended.rawValue {
// Optionally restart recognition
}
}
アクセシビリティの検討
音声認識は、モーターや視覚障害のあるユーザーに対するアクセシビリティを高めます。 実装を確実にします。
- スタート/ストップを聴いたときにクリアなオーディオフィードバックを提供します。
- 認証ボタンのアクセシビリティラベルを使用してボイスオーバーをサポートします。
- ケース認識で代替テキストベースの入力メソッドが失敗した場合に提供します。
- 明示的な同意なしに、オーディオデータを保存しないで、ユーザーのプライバシーを尊重します。
試験・デバッグ
シミュレータにはマイクが含まれていません。物理デバイスのテスト。 []]] の の下の Xcode の音声認識診断ログ を値 ]] で追加して、動詞ロギングを有効にします。 QA の間に異なるノイズ環境をシミュレートし、異なるノイズを強調します。
リアル・ワールドユースケース
- CMSアプリ[の音声コマンド – エディタがコンテンツを予測したり、メニューを手ぶらで操作できるようにします。例えば、「新しい記事を作成する」は、特定のワークフローをトリガーします。
- []注記アプリ[のディクテーション – 句読認識によるリアルタイムの転写。
- []アクセシビリティ重視のナビゲーション[ – 画面に触れることなく「戻る」または「設定を開く」と表示できます。
- []医療または法律の転写 - ドメイン固有の用語のコンテキスト文字列を使用して、オンデザック認証とプライバシーを組み合わせます。
コンテンツ
AppleのSpeechフレームワークは、iOSアプリに音声認識を追加するための確かな基盤を提供します。アーキテクチャを理解し、権限を適切に処理し、オーディオセッションの管理、パフォーマンスの最適化を行うことで、ユーザーのプライバシーを尊重したシームレスな音声制御体験を作成できます。常に実際のデバイスをテストし、フォールバックメカニズムを検討し、ユーザーのコンテキストを念頭に置いて、ユーザの利便性を本当に高める機能を提供します。
更に読みたい場合は、Appleの]を参照してください。Speechフレームワークのドキュメンテーション、]]AVAudioSessionガイド、および[[]]]SFSpeechRecognizerのクラスリファレンス]を参照してください。 []でアクセシビリティのための追加ベストプラクティスが発見できます[FLT:]。