SiriKit 從6月份的 WWDC2016 推出已經(jīng)有一段時(shí)間了,不少應(yīng)用也慢慢的適配了Siri枕稀,但是可能很多童鞋還沒有來得及去試試杀赢,下面我們先試一下:
我們可以在在設(shè)置里查看已經(jīng)適配Siri 的應(yīng)用,可以在這里將應(yīng)用打開權(quán)限棋恼,也可以在Siri 觸發(fā)的時(shí)候通過提示來打開返弹。
SiriKit 是以 Extension 的方式來給已有App 來提供支持,就目前Siri 支持的intent來說爪飘,還是有很多使用的限制义起,只能針對(duì)特定的詞匯通過命令來進(jìn)行識(shí)別處理。這里不介紹如何使用SiriKit 师崎,下面我想利用iOS中 目前已經(jīng)公開的其他 API 實(shí)現(xiàn)一個(gè)應(yīng)用內(nèi)的語(yǔ)音助手默终,來理解Siri 的實(shí)現(xiàn)。
其實(shí)想要實(shí)現(xiàn)Siri犁罩,我們只需要先將語(yǔ)音進(jìn)行識(shí)別齐蔽,然后再將語(yǔ)音內(nèi)容進(jìn)行分析,然后再將分析出來的結(jié)果進(jìn)行輸出床估,當(dāng)然這輸出不只是語(yǔ)音含滴,也可能是一些反饋信息和一些事件處理。
下面我們先來實(shí)現(xiàn)語(yǔ)音識(shí)別顷窒。
語(yǔ)音識(shí)別
Speech framework 也是在WWDC 2016 推出的一個(gè)語(yǔ)音識(shí)別框架蛙吏,并且支持多種語(yǔ)言,Siri 也是基于此框架來進(jìn)行語(yǔ)音識(shí)別鞋吉。還在iOS 3 鸦做、4 時(shí)代的時(shí)候就已經(jīng)開始有一些第三方的語(yǔ)音識(shí)別框架,但那時(shí)候不是價(jià)格高就是識(shí)別不精準(zhǔn)谓着,導(dǎo)致很多應(yīng)用軟件對(duì)語(yǔ)音識(shí)別都望而卻步泼诱。但目前的語(yǔ)音識(shí)別技術(shù)都已經(jīng)爐火純青,就中文來說赊锚,不僅僅是已經(jīng)能夠識(shí)別出普通話治筒,還能識(shí)別出粵語(yǔ)∠掀眩科大訊飛在國(guó)內(nèi)應(yīng)該是語(yǔ)音識(shí)別技術(shù)做的最好的了耸袜,在幾年前就已經(jīng)實(shí)現(xiàn)了離線語(yǔ)音識(shí)別的功能。
Speech 當(dāng)然也不甘落后牲平,也提供了離線的語(yǔ)音識(shí)別堤框,速度和精準(zhǔn)度也不必多說。
蘋果一直都是呈現(xiàn)出來最簡(jiǎn)單最易用的API 給開發(fā)者, 所以通過Speech 實(shí)現(xiàn)一個(gè)語(yǔ)音識(shí)別功能就是分分鐘搞定蜈抓。
主要類有:
- SFSpeechRecognizer
-
SFSpeechRecognitionRequest
1). SFSpeechURLRecognitionRequest
2). SFSpeechAudioBufferRecognitionRequest - SFSpeechRecognitionTask
- SFSpeechRecognitionResult
簡(jiǎn)單四步實(shí)現(xiàn)語(yǔ)音識(shí)別
// 請(qǐng)求獲取語(yǔ)音識(shí)別權(quán)限
SFSpeechRecognizer.requestAuthorization { (status) in . . . }
// 初始化中文語(yǔ)音識(shí)別
let speechRecongnizer = SFSpeechRecognizer(locale: Locale(identifier: “zh_CN”))
// 初始化識(shí)別請(qǐng)求
let recognitionRequest = SFSpeechURLRecognitionRequest(url: NSURL(string: "...")!)
// 請(qǐng)求獲取語(yǔ)音識(shí)別
let recognitionTask = speechRecongnizer?.recognitionTask(with: recognitionRequest, resultHandler:{ (result, error) in
if let result = result {
print(result.bestTranscription.formattedString)
let isFinal = result.isFinal
}
})
這里我們需要實(shí)現(xiàn)實(shí)時(shí)語(yǔ)音識(shí)別并轉(zhuǎn)化有效信息启绰,就需要使用SFSpeechAudioBufferRecognitionRequest
來通過緩沖流實(shí)時(shí)將語(yǔ)音轉(zhuǎn)化為有效文字信息。
let audioEngine = AVAudioEngine()
let recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
guard let inputNode = audioEngine.inputNode else {
fatalError("audioEngine error")
}
let recordingFormat = inputNode.outputFormat(forBus: 0)
inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer, when) in
recognitionRequest?.append(buffer)
}
let recognitionTask = speechRecongnizer?.recognitionTask(with: recognitionRequest, resultHandler: { (result, error) in
var isFinal = false
if let result = result {
print(result.bestTranscription.formattedString)
}
})
audioEngine.prepare()
do {
try audioEngine.start()
} catch {
print("couldn't start")
}
這樣我們就可以實(shí)時(shí)監(jiān)聽語(yǔ)音輸入流自動(dòng)轉(zhuǎn)化為文字了沟使,下面我們需要對(duì)文字進(jìn)行解析委可,然后將反饋信息讀出來。
語(yǔ)音朗讀
AVSpeechSynthesizer 是隨著iOS 7.0 而推出的一個(gè)文字轉(zhuǎn)語(yǔ)音的特性腊嗡,幾行代碼就能實(shí)現(xiàn)文字轉(zhuǎn)成語(yǔ)音播放出來着倾,
- AVSpeechSynthesizer
- AVSpeechUtterance
- AVSpeechSynthesisVoice
// 通過文字初始化話語(yǔ)
let utterance = AVSpeechUtterance(string: "語(yǔ)音轉(zhuǎn)文字")
// 設(shè)置語(yǔ)言
utterance.voice = AVSpeechSynthesisVoice(language: "zh-CN")
// 讀出來
let synthesizer = AVSpeechSynthesizer()
synthesizer.speak(utterance)
通過分詞解析并反饋
下面我們就可以解析出一些詞匯或命令來做出相應(yīng)的反饋。就比如
var string = ""
if action.contains("叫爸爸") || action.contains("喊爸爸") {
string = "爸爸"
} else if action.contains("笑話") {
string = "我有個(gè)直覺叽唱,圣誕節(jié)那天屈呕,可能會(huì)有個(gè)人捧著鮮花和禮物對(duì)我說, 讓一讓兄弟,擋路了。"
} else if action.contains("繞口令") {
string = "黑化黑灰化肥灰會(huì)揮發(fā)發(fā)灰黑諱為黑灰花會(huì)回飛棺亭;灰化灰黑化肥會(huì)會(huì)揮發(fā)發(fā)黑灰為諱飛花回化為灰"
}
當(dāng)然虎眨,這只是一些很簡(jiǎn)單的語(yǔ)音命令,如果要更精確的語(yǔ)音識(shí)別镶摘,肯定需要非常精準(zhǔn)的分詞算法來支持嗽桩。
那么這樣一個(gè)山寨的應(yīng)用內(nèi)Siri 就算完成了。