🗣️

【Swift】iOSの音声認識でリアルタイム音声文字起こしを行う方法

に公開

この記事では、iOSの標準フレームワークであるSFSpeechRecognizerを使用して、リアルタイムの音声文字起こしを実装する方法を解説します。

1. 準備すること

音声認識を使用する前に、以下の準備が必要です。

Info.plistの設定

まず、マイクと音声認識を利用するための許可をユーザーに求めるために、Info.plistに以下を追加します。

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

<key>NSMicrophoneUsageDescription</key>
<string>マイクを使用します。</string>

これにより、アプリ起動時に許可を求めるダイアログが表示されます。

2. 音声認識の許可を求める

次に、アプリ内で音声認識を使用する前にユーザーに許可を求めるコードを記述します。

import Speech

func requestSpeechAuthorization() {
    SFSpeechRecognizer.requestAuthorization { authStatus in
        DispatchQueue.main.async {
            switch authStatus {
            case .authorized:
                print("✅ 音声認識が許可されました")
            case .denied, .restricted, .notDetermined:
                print("❌ 音声認識が許可されませんでした")
            @unknown default:
                break
            }
        }
    }
}

※ もし音声認識がデバイスで制限されている場合は、設定アプリで以下を確認してください。

設定アプリ → スクリーンタイム → コンテンツとプライバシーの制限 → プライバシー → 音声認識

ここで音声認識が許可されていることを確認します。

3. 音声認識の実装

以下のコードでリアルタイム音声文字起こしを行います。

import AVFoundation
import Speech

class VoiceRecognizer: NSObject {
    private let audioEngine = AVAudioEngine()
    private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest?
    private var recognitionTask: SFSpeechRecognitionTask?
    private let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "ja-JP"))

    func startRecognition() {
        recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
        guard let recognitionRequest = recognitionRequest else { return }

        recognitionRequest.shouldReportPartialResults = true

        recognitionTask = speechRecognizer?.recognitionTask(with: recognitionRequest) { result, error in
            if let result = result {
                print("🎤 認識結果: \(result.bestTranscription.formattedString)")
            }
            if let error = error {
                print("❌ 認識エラー: \(error.localizedDescription)")
            }
        }

        let audioSession = AVAudioSession.sharedInstance()
        do {
            try audioSession.setCategory(.record, mode: .measurement, options: .duckOthers)
            try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
        } catch {
            print("❌ AVAudioSessionエラー: \(error)")
            return
        }

        let inputNode = audioEngine.inputNode
        inputNode.installTap(onBus: 0, bufferSize: 1024, format: inputNode.outputFormat(forBus: 0)) { buffer, _ in
            recognitionRequest.append(buffer)
        }

        audioEngine.prepare()

        do {
            try audioEngine.start()
            print("🎙 音声認識を開始しました。話しかけてください。")
        } catch {
            print("❌ audioEngineエラー: \(error)")
        }
    }

    func stopRecognition() {
        audioEngine.stop()
        audioEngine.inputNode.removeTap(onBus: 0)
        recognitionRequest?.endAudio()
        recognitionTask?.cancel()
        recognitionTask = nil

        print("⏹ 音声認識を停止しました")
    }
}

おわりに

これでiOSアプリにリアルタイム音声文字起こしを実装することができました。動作に問題がある場合は、設定の確認や実機でのテストを再度行ってみてください。

Discussion