import SwiftUI import Speech import AVFoundation @_cdecl("startRecordingFunc") public func startRecordingFunc() {     let voiceRecognitionManager = VoiceRecognitionManager.shared     voiceRecognitionManager.startRecording() } @_cdecl("stopRecordingFunc") public func stopRecordingFunc() {     let voiceRecognitionManager = VoiceRecognitionManager.shared     voiceRecognitionManager.stopRecording() } // UnityのC#側で定義されたコールバックをSwiftから呼び出す @_cdecl("OnRecognizedText") public func OnRecognizedText(_ recognizedText: UnsafePointer) {     // Unityに認識結果を送る     let unityCallback = VoiceRecognitionManager.unityCallback     unityCallback?(String(cString: recognizedText)) } class VoiceRecognitionManager {     static let shared = VoiceRecognitionManager()          private var audioEngine = AVAudioEngine()     private var speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "it-IT"))     private var request = SFSpeechAudioBufferRecognitionRequest()     private var task: SFSpeechRecognitionTask?          public var recognizedText: String = "話してください..."          // Unityのコールバックを保持するためのプロパティ     static var unityCallback: ((String) -> Void)?          public func startRecording() {         SFSpeechRecognizer.requestAuthorization { authStatus in             if authStatus == .authorized {                 DispatchQueue.main.async {                     self.startAudioEngine()                 }             } else {                 DispatchQueue.main.async {                     if #available(iOS 13.0, *) {                         self.recognizedText = "音声認識が許可されていません。"                     }                 }             }         }     }          private func startAudioEngine() {         let inputNode = audioEngine.inputNode         let recordingFormat = inputNode.outputFormat(forBus: 0)         inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { buffer, _ in             self.request.append(buffer)         }                  audioEngine.prepare()                  do {             try audioEngine.start()             if #available(iOS 13.0, *) {                 recognizedText = "聞き取っています..."             }         } catch {             if #available(iOS 13.0, *) {                 recognizedText = "オーディオエンジンの起動に失敗しました。"             }         }                  request.shouldReportPartialResults = true         if #available(iOS 13.0, *) {             request.requiresOnDeviceRecognition = true         }                  task = speechRecognizer?.recognitionTask(with: request, resultHandler: { result, error in             if let result = result {                 DispatchQueue.main.async {                     // 認識されたテキストを `recognizedText` に代入                     self.recognizedText = result.bestTranscription.formattedString                                          // UnityのC#側のコールバックを呼び出す                     if let unityCallback = VoiceRecognitionManager.unityCallback {                         unityCallback(self.recognizedText)                     }                 }             }                          if error != nil {                 self.audioEngine.stop()                 inputNode.removeTap(onBus: 0)             }         })     }          func stopRecording() {         audioEngine.stop()         request.endAudio()         task?.cancel()     } }