iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0
Mobile Development

ios前端開發學習系列 第 26

【Day26】認識如何加入麥克風(二)

  • 分享至 

  • xImage
  •  

那我們要在檔案怎麼操作才能實現麥克風呢?

加入外部函式

import Speech
import AVFoundation
  • Speech:用於語音識別
  • AVFoundation:用於音頻處理

初始化變量

在 MainUIViewController 類中,我們首先初始化了一些必要的變量。

private let speechRecognizer = SFSpeechRecognizer(locale: Locale.init(identifier: "zh-TW"))  // 使用中文
private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest?
private var recognitionTask: SFSpeechRecognitionTask?
private let audioEngine = AVAudioEngine()

錄音按鈕操作

當用戶點擊麥克風按鈕時,會觸發 microphoneButtonTapped 方法。

@IBAction func microphoneButtonTapped(_ sender: UIButton) {
    if audioEngine.isRunning {
        audioEngine.stop()
        recognitionRequest?.endAudio()
        microphoneButton.isEnabled = false
        microphoneButton.tintColor = .systemBlue
    } else {
        startRecording()
        microphoneButton.isEnabled = true
        microphoneButton.tintColor = .systemGray
    }
}

開始錄音和語音識別

startRecording 函數負責開始錄音並進行語音識別。

func startRecording() {
    
    recognitionTask = speechRecognizer?.recognitionTask(with: recognitionRequest, resultHandler: { (result, error) in
        var isFinal = false

        if result != nil {
            self.messageText.text = result?.bestTranscription.formattedString
            isFinal = (result?.isFinal)!
        }

        if error != nil || isFinal {
            // ...(加入安全機制)
        }
    })
}

這裡使用的是 SFSpeechRecognizer 類,它會將錄到的聲音轉換為文字,並將其顯示在 messageText 文本框中。

語音識別狀態

speechRecognizer(_:availabilityDidChange:) 方法用於更新麥克風按鈕的可用狀態。

func speechRecognizer(_ speechRecognizer: SFSpeechRecognizer, availabilityDidChange available: Bool) {
    if available {
        microphoneButton.isEnabled = true
    } else {
        microphoneButton.isEnabled = false
    }
}

這樣,每當語音識別功能可用或不可用時,麥克風按鈕的狀態都會相應地更新。

總結

這就是在iOS應用中添加麥克風訪問和語音識別的基本步驟。你可以在這基礎上進一步擴展,例如添加更多的用戶交互和視覺效果。


上一篇
【Day25】認識如何加入麥克風(一)
下一篇
【Day27】認識如何把自己的專案推上github
系列文
ios前端開發學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言