像Siri一樣監聽說話
打開 Speech 權限
在使用語音轉文字功能之前,首先需要在您的應用中請求用戶的語音識別權限。這步驟非常重要,因為如果用戶拒絕權限,您的應用將無法正常運行語音識別功能。
創建 Button 和 TextView
在這一部分,我們將創建一個按鈕和一個文本視圖,按鈕用於開始錄音,文本視圖則用於顯示轉換後的文字。
檢查用戶權限
以下代碼用於請求語音識別的授權並檢查用戶的授權狀態:
“`swift
SFSpeechRecognizer.requestAuthorization { (authStatus) in
var isButtonEnabled = false
switch authStatus {
case .authorized:
isButtonEnabled = true
case .denied:
isButtonEnabled = false
print(“用戶拒絕接受語音識別”)
case .restricted:
isButtonEnabled = false
print(“語音識別功能沒有經過認可”)
case .notDetermined:
isButtonEnabled = false
print(“當前設備不能語音識別”)
@unknown default:
print(“錯誤”)
}
}
“`
AVAudioSessionMode
在設定音頻會話模式時,根據不同的應用場景選擇合適的模式。以下是一些常見的音頻會話模式及其應用場景:
AudioSessionMode | 兼容類別 | 應用場景 |
---|---|---|
Default | All Category | 默認音頻會話模式 |
VoiceChat | PlayAndRecord | VoIP(雙向語音通信) |
GameChat | PlayAndRecord | 遊戲錄制(Game Kit) |
VideoRecording | Record、PlayAndRecord | 錄制視頻 |
Measurement | Playback、Record、PlayAndRecord | 音頻輸入或輸出的測量 |
MoviePlayback | Playback | 視頻播放 |
VideoChat | PlayAndRecord | 視頻通話 |
SpokenAudio | Playback、SoloAmbient、PlayAndRecord、MultiRoute | 有聲讀物 |
VoicePrompt | – | – |
開始錄音
接下來,我們需要撰寫一個函數來開始錄音並進行語音識別。
“`swift
func startRecording() {
if recognitionTask != nil {
recognitionTask?.cancel()
recognitionTask = nil
}
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(AVAudioSession.Category.record)
try audioSession.setMode(AVAudioSession.Mode.measurement) // 音頻輸入或輸出的測量
try audioSession.setActive(true, options: .notifyOthersOnDeactivation) // 停止其他音樂
} catch {
print(“audioSession properties weren’t set because of an error.”)
}
recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
let inputNode = audioEngine.inputNode
guard let recognitionRequest = recognitionRequest else {
fatalError(“Unable to create an SFSpeechAudioBufferRecognitionRequest object”)
}
recognitionRequest.shouldReportPartialResults = true
recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest, resultHandler: { (result, error) in
var isFinal = false
if result != nil {
print(result?.bestTranscription.formattedString ?? “”)
self.textView.text = result?.bestTranscription.formattedString
isFinal = (result?.isFinal)!
}
if error != nil || isFinal {
self.audioEngine.stop()
inputNode.removeTap(onBus: 0)
self.recognitionRequest = nil
self.recognitionTask = nil
self.microphoneButton.isEnabled = true
}
})
let recordingFormat = inputNode.outputFormat(forBus: 0)
inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer, when) in
self.recognitionRequest?.append(buffer)
}
audioEngine.prepare()
do {
try audioEngine.start()
} catch {
print(“錯誤,audioEngine無法啟動。”)
}
textView.text = “說點什麼,我在聽!”
}
“`
示範
這裡是一個語音轉文字功能的示範,您可以透過此動畫了解功能的運作。
GitHub 資源
如果您想深入了解或查看完整代碼,請訪問以下 GitHub 頁面:[Swift Speech GitHub Repository](https://github.com/Bgihe/Swift-Speech)
更多 Swift 文章
Swift 彈出視窗 AlertController 的使用方法 💥
Swift UISegmentedControl 💻分段控制器!
Q&A(常見問題解答)
**Q1: 如何請求語音識別權限?**
A1: 使用 `SFSpeechRecognizer.requestAuthorization` 方法請求用戶授權,您可以根據授權狀態啟用或禁用錄音按鈕。
**Q2: 如果語音識別失敗,該怎麼辦?**
A2: 如果語音識別失敗,您可以檢查錯誤信息並提示用戶重試,或提供相應的反饋。
**Q3: 如何在不同場景中選擇 AVAudioSessionMode?**
A3: 根據您的應用需求選擇合適的 AudioSessionMode,例如使用 `measurement` 模式進行錄音或音頻測量。
—
這樣的優化不僅使內容更具吸引力,也符合 Google SEO 最佳實踐,幫助增加文章的可見性。