像Siri一樣監聽說話

打開 Speech 權限

在使用語音轉文字功能之前,首先需要在您的應用中請求用戶的語音識別權限。這步驟非常重要,因為如果用戶拒絕權限,您的應用將無法正常運行語音識別功能。

Swift 語音轉文字權限請求示範

創建 Button 和 TextView

在這一部分,我們將創建一個按鈕和一個文本視圖,按鈕用於開始錄音,文本視圖則用於顯示轉換後的文字。

Swift 語音轉文字按鈕與文本視圖示範

檢查用戶權限

以下代碼用於請求語音識別的授權並檢查用戶的授權狀態:

“`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兼容類別應用場景
DefaultAll Category默認音頻會話模式
VoiceChatPlayAndRecordVoIP(雙向語音通信)
GameChatPlayAndRecord遊戲錄制(Game Kit)
VideoRecordingRecord、PlayAndRecord錄制視頻
MeasurementPlayback、Record、PlayAndRecord音頻輸入或輸出的測量
MoviePlaybackPlayback視頻播放
VideoChatPlayAndRecord視頻通話
SpokenAudioPlayback、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 = “說點什麼,我在聽!”
}
“`

示範

這裡是一個語音轉文字功能的示範,您可以透過此動畫了解功能的運作。

Swift 語音轉文字示範動畫

GitHub 資源

如果您想深入了解或查看完整代碼,請訪問以下 GitHub 頁面:[Swift Speech GitHub Repository](https://github.com/Bgihe/Swift-Speech)


更多 Swift 文章

Swift 彈出視窗 AlertController 的使用方法 💥

Swift 判斷螢幕方向 📱

Swift Core Data 實現 💾🔥

Swift UISegmentedControl 💻分段控制器!

Swift 實現抽屜效果 🧹

Q&A(常見問題解答)

**Q1: 如何請求語音識別權限?**
A1: 使用 `SFSpeechRecognizer.requestAuthorization` 方法請求用戶授權,您可以根據授權狀態啟用或禁用錄音按鈕。

**Q2: 如果語音識別失敗,該怎麼辦?**
A2: 如果語音識別失敗,您可以檢查錯誤信息並提示用戶重試,或提供相應的反饋。

**Q3: 如何在不同場景中選擇 AVAudioSessionMode?**
A3: 根據您的應用需求選擇合適的 AudioSessionMode,例如使用 `measurement` 模式進行錄音或音頻測量。

這樣的優化不僅使內容更具吸引力,也符合 Google SEO 最佳實踐,幫助增加文章的可見性。

Categorized in: