iOS 10中如何搭建一個語音轉文字框架——swift

weixin_34087301發表於2017-07-01

在2016WWDC大會上,Apple公司介紹了一個很好的語音識別的API,那就是Speech framework。事實上,這個Speech Kit就是Siri用來做語音識別的框架。如今已經有一些可用的語音識別框架,但是它們要麼太貴要麼不好。在今天的教程裡面,我會教你怎樣建立一個使用Speech Kit來進行語音轉文字的類似Siri的app。

設計App UI

前提:你需要Xcode 8 beta版本和一個執行iOS 10 beta系統版本的iOS 裝置。

先從建立一個新的命名為SpeechToTextDemo的單檢視工程開始。接下來,到 Main.storyboard 中新增一個 UILabel,一個 UITextView, 和一個 UIButton,你的storyboard應該看起來如下圖:

5458052-e5f6d2a1d0928ced.png

接下來在 ViewController.swift檔案中為UITextView 和UIButton 定義outlet變數。在這個demo當中,我設定UITextView 的名稱為“textView”,UIButton的名稱為“microphoneButton”。然後建立一個當microphone按鈕被點選時會觸發的空的按鈕執行方法。


5458052-71deda953c0e25a0.png

使用Speech Framework

為了能使用Speech framework, 你必須首先匯入它然後遵循 SFSpeechRecognizerDelegate 協議。因此讓我們匯入這個框架,然後在 ViewController 檔案中加上它的協議。現在你的 ViewController.swift 檔案應該如下圖所示:


5458052-656273b326c7f211.png

使用者授權

在使用speech framework做語音識別之前,你必須首先得到使用者的允許,因為不僅僅只有本地的ios裝置會進行識別,蘋果的伺服器也會識別。所有的語音資料都會被傳遞到蘋果的後臺進行處理。因此,獲取使用者授權是強制必須的。

讓我們在 viewDidLoad 方法裡授權語音識別。使用者必須允許app使用話筒和語音識別。首先,宣告一個speechRecognizer變數:


5458052-93cd5daa5f835be0.png

然後如下圖更新 viewDidLoad 方法:


5458052-d8901b74a064d062.png

首先,我們建立一個帶有識別符號en-US 的 SFSpeechRecognizer例項,這樣語音識別API就能知道使用者說的是哪一種語言。這個例項就是處理語音識別的物件。

我們預設讓microphone按鈕失效直到語音識別功能被啟用。

接下來,把語音識別的代理設定為 self 也就是我們的ViewController.

之後,我們必須通過呼叫SFSpeechRecognizer.requestAuthorization方法來請求語音識別的授權。

最後,檢查驗證的狀態。如果被授權了,讓microphone按鈕有效。如果沒有,列印錯誤資訊然後讓microphone按鈕失效。

現在如果你認為app跑起來之後你會看到一個授權彈出視窗,那你就錯了。如果執行,app會崩潰。好吧,既然知道結果為什麼還要問呢?(別打我),看看下面解決方法。

提供授權訊息

蘋果要求app裡所有的授權都要一個自定義的資訊。例如語音授權,我們必須請求2個授權:

麥克風使用權。

語音識別。

為了自定義資訊,你必須在info.plist 配置檔案裡提供這些自定義訊息。

讓我們開啟 info.plist配置檔案的原始碼。首先,右鍵點選 info.plist。然後選擇Open As > Source Code。最後,拷貝下面的XML程式碼然後在</dict>標記前插入這段程式碼。


5458052-9e03b16c25b39a72.png

現在你已經在info.plist檔案裡新增了兩個鍵值:

NSMicrophoneUsageDescription -為獲取麥克風語音輸入授權的自定義訊息。注意這個語音輸入授權僅僅只會在使用者點選microphone按鈕時發生。

NSSpeechRecognitionUsageDescription – 語音識別授權的自定義資訊

可以自行更改這些訊息的內容。現在點選Run按鈕,你應該可以編譯和成功執行app了,不會報任何錯誤。


5458052-9361cab80a9845c2.png

注意:如果稍後在工程執行完成時還沒有看到語音輸入授權框,那是因為你是在模擬器上執行的程式。iOS模擬器沒有許可權進入你Mac電腦的麥克風。

處理語音識別

現在我們已經實現了使用者授權,我們現在去實現語音識別功能。先從在 ViewController裡定義下面的物件開始:


5458052-4205f991d9327c6b.png

recognitionRequest物件處理了語音識別請求。它給語音識別提供了語音輸入。

reconition task物件告訴你語音識別物件的結果。擁有這個物件很方便因為你可以用它刪除或者中斷任務。

audioEngine是你的語音引擎。它負責提供你的語音輸入。

接下來,建立一個新的方法名叫 startRecording()。


5458052-b881db46bb35c184.png


5458052-0261ac1a069b7cd1.png

這個方法會在Start Recording按鈕被點選時呼叫。它主要功能是開啟語音識別然後聆聽你的麥克風。我們一行行分析上面的程式碼:

3-6行 – 檢查 recognitionTask 是否在執行。如果在就取消任務和識別。

8-15行 – 建立一個 AVAudioSession來為記錄語音做準備。在這裡我們設定session的類別為recording,模式為measurement,然後啟用它。注意設定這些屬性有可能會丟擲異常,因此你必須把他們放入try catch語句裡面。

17行 – 例項化recognitionRequest。在這裡我們建立了SFSpeechAudioBufferRecognitionRequest物件。稍後我們利用它把語音資料傳到蘋果後臺。

19-21行 – 檢查 audioEngine(你的裝置)是否有做錄音功能作為語音輸入。如果沒有,我們就報告一個錯誤。

23-25行 – 檢查recognitionRequest物件是否被例項化和不是nil。

27行– 當使用者說話的時候讓recognitionRequest報告語音識別的部分結果 。

29行 – 呼叫 speechRecognizer的recognitionTask 方法來開啟語音識別。這個方法有一個completion handler回撥。這個回撥每次都會在識別引擎收到輸入的時候,完善了當前識別的資訊時候,或者被刪除或者停止的時候被呼叫,最後會返回一個最終的文字。

31行 – 定義一個布林值決定識別是否已經結束。

35行 – 如果結果 result 不是nil, 把 textView.text 的值設定為我們的最優文字。如果結果是最終結果,設定 isFinal為true。

39-47行 – 如果沒有錯誤或者結果是最終結果,停止 audioEngine(語音輸入)並且停止 recognitionRequest 和 recognitionTask.同時,使Start Recording按鈕有效。

50-53行 – 向 recognitionRequest增加一個語音輸入。注意在開始了recognitionTask之後增加語音輸入是OK的。Speech Framework 會在語音輸入被加入的同時就開始進行解析識別。

55行 – 準備並且開始audioEngine。

觸發語音識別

我們需要保證當建立一個語音識別任務的時候語音識別功能是可用的,因此我們必須給ViewController新增一個代理方法。如果語音輸入不可用或者改變了它的狀態,那麼 microphoneButton.enable屬性就要被設定。針對這種情況,我們實現了SFSpeechRecognizerDelegate 協議的 availabilityDidChange 方法。實現內容看下面:


5458052-06a29bca00df2479.png

這個方法會在可用性狀態改變時被呼叫。如果語音識別可用,那麼記錄按鈕record會被設為可用狀態。

最後一件事就是我們必須更新響應方法microphoneTapped(sender:):


5458052-5ce2c759ef4384f2.png

在這個方法中,我們必須檢查 audioEngine是否正在工作。如果是,app應該停止 audioEngine, 中止向recognitionRequest輸入音訊,讓microphoneButton按鈕不可用,並且設定按鈕的標題為 “Start Recording”

如果 audioEngine 正在工作,app應該呼叫 startRecording() 並且設定按鈕的標題為 “Stop Recording”。

非常好!現在可以準備測試app了。把app部署到一個iOS10的裝置,然後點選“Start Recording”按鈕。去說些什麼吧!


5458052-4e0a2fc2eab5014e.png

注意:

蘋果公司對每個裝置的識別功能都有限制。具體的限制並不知道,但是你可以聯絡蘋果公司瞭解更多資訊。

蘋果公司對每個app也有識別功能限制。

如果你經常遇到限制,請一定聯絡蘋果公司,他們應該可以解決問題。

語音識別會很耗電以及會使用很多資料。

語音識別一次只持續大概一分鐘時間。

總結

在這個教程中,你學習到了怎樣好好的利用蘋果公司開放給開發者的驚人的新語言API,用於語音識別並且轉換到文字。Speech framework 使用了跟Siri相同的語音識別框架。這是一個相對小的API。但是,它非常強大可以讓開發者們開發非凡的應用比如轉換一個語音檔案到文字文字

5458052-0b43a61eda5e0e04.png

上圖為2017年最新的視訊教程資料,搜尋2352149755加我好友私聊我上傳視訊教程,有什麼不懂的也可以來私聊問我。

不定時更新中。

如果你能明白這些視訊資料的好差,那麼你也算是入行了,底層和中高層就是這一步之差。

相關文章