Cyber Monday Sale 40% off unlimited courses & creative assets! 40% off unlimited assets! Save Now
Advertisement
  1. Code
  2. Android SDK

使用Google雲語音和自然語言API創建智慧APP

by
Read Time:12 minsLanguages:

Chinese (Traditional) (中文(繁體)) translation by tianyiliang (you can also view the original English article)

幾十年來,不管是科學愛好者,程式師還是AI研究人員,一直夢寐以求實現一個真正理解自然語言的APP。今天,感謝機器學習技術的巨大進步,夢想終於照進現實。 而且,基於雲的服務(如Google雲機器學習)已經把這些技術免費提供給每個人使用了。

在本教程中,你將學習如何使用Google雲機器學習平臺提供的兩種功能強大的自然語言API:Cloud Speech APICloud Natural Language API。使用它們,你可以創建處理各種語言的語音APP。

準備工作

你需要的東西:

  • Android Studio 2.2或更高版本
  • 一個穀歌雲平臺帳戶
  • 運行Android 4.4或更高版本的設備

1.為什麼要使用這些API?

可以處理語音的APP必須具有以下功能:

  • 它必須能夠從原始音訊資料中提取單個單詞。
  • 它必須能夠對提取的單詞之間的語法關係作出有根據的猜測。

雲語音和雲自然語言API能夠讓你在幾分鐘內將上述功能添加到你的Android APP中。

雲語音API作為最先進的語音辨識器,可以準確地轉錄超過80種語言的語音。它可以強大到處理區域口音和嘈雜條件下的語音。

雲自然語言API是一種語言處理系統,以近人類的精確度來確定句子中詞語的角色。它目前支援十種語言,並提供實體和情感分析。

2.啟用API

在使用語音和自然語言API之前,你必須在Google Cloud 控制台中啟用它們。所以登錄到控制台,進入API Manager > Library

Cloud console libraryCloud console libraryCloud console library

要啟用Speech API,請點擊Google Cloud Machine Learning部分中的Speech API連結。在接下來打開的頁面中,按Enable按鈕。

Enabling Cloud Speech APIEnabling Cloud Speech APIEnabling Cloud Speech API

點擊流覽器的返回按鈕返回上一頁。

這一次,通過點擊自然語言API連結並點擊下一頁上的Enable按鈕啟用自然語言API。

Enabling Cloud Natural Language APIEnabling Cloud Natural Language APIEnabling Cloud Natural Language API

你還需要一個API金鑰來與API進行交互。如果你還沒有,請打開Credentials選項卡,點擊Create credentials按鈕,然後選擇“ API”鍵

現在,你會看到一個顯示API金鑰的快顯視窗。記下這個金鑰,以便以後使用。

API key generatedAPI key generatedAPI key generated

3.配置專案

這兩個API都是基於JSON的,具有REST端點,你可以直接使用任何網路庫進行交互。 然而,使用可用的Google API Client庫編寫更易讀的代碼,這樣你就可以節省大量時間。打開app module級的build.gradle檔,添加以下compile 依賴項:

此外,我們將在本教程中執行一些檔I/O操作。為了簡化,添加Commons IO庫的依賴關係

最後,不要忘記在AndroidManifest.xml文件中申請INTERNET許可權。否則APP將無法連接到Google伺服器。

4.使用Cloud Speech API

不用說,Cloud Speech API會將音訊資料作為其輸入之一。因此,我們現在要創建一個可以轉錄音訊檔的Android APP。 

為了簡單起見,我們只會轉錄FLAC檔,FLAC檔使用免費無損音訊轉碼器格式。你設備上可能已經有這樣的檔。如果沒有,建議你從維琪共用資源中下載。

步驟1:創建佈局

我們APP的佈局有一個Button控制項,使用者點擊後會顯示檔選擇器,然後流覽並選擇設備上可用的音訊檔。

佈局還有一個TextView控制項來顯示所選音訊檔的文本。代碼如下:

步驟2:創建檔選擇器

當用戶點擊我們在上一步中創建的按鈕時,會顯示檔選擇器介面,所以要設置OnClickListener事件。在此操作之前,請確保已經使用findViewById()方法初始化按鈕了。

使用Android的存儲訪問框架(可運行在API等級19或更高版本的設備上)很輕鬆創建檔選擇器。你只需創建一個ACTION_GET_CONTENT 動作的intent,並傳遞給  startActivityForResult()方法。 或者,你可以通過給Intent物件的setType()方法傳遞MIME參數來限制檔選擇程式僅顯示FLAC檔。

檔選擇器輸出的是另一個Intent物件,該物件包含使用者選擇的檔URI。為了能夠訪問,你必須重寫Activity類的onActivityResult()方法。

步驟3:編碼檔

Cloud Speech API期望音訊資料採用Base64字串的形式。要生成這樣的字串,可以將使用者選擇的檔內容讀取到byte陣列中,然後傳遞給Google API Client庫提供的encodeBase64String()方法。

然而,你當前只有所選檔的URI,而不是檔的絕對路徑。這意味著,你必須先解析URI才能讀取檔。 將該URI傳遞給activity的內容解析者提供的openInputStream()方法。 訪問檔的輸入流後,你可以簡單地將其傳遞給IOUtils類的  toByteArray()方法,該方法將其轉換為位元組陣列。代碼如下:

如上面的代碼所示,我們使用一個新的執行緒來運行所有的I/O操作。這樣做是為了防止阻塞UI。

步驟4:播放檔

在我看來,轉錄的過程中就播放被轉錄的聲音是個好主意。這實現很簡單,卻改善了用戶體驗。

使用MediaPlayer類播放音效檔。一旦使用setDataSource()方法指向檔的URI ,必須調用prepare()方法來同步準備播放機。 當播放機準備就緒時,就可以調用start()方法開始播放檔。 當播放機準備就緒時,就可以調用start()方法開始播放檔。

此外,一旦檔播放完,必須記住釋放播放機的資源。為此,請分配一個OnCompletionListener物件並調用其release()方法。代碼如下:

步驟5:同步轉錄文件

現在,將Base64編碼的音訊資料發送到Cloud Speech API進行轉錄。但首先,我建議將之前生成的API金鑰存儲為Activity類的成員變數。

為了能夠與Cloud Speech API通信,必須用Speech.Builder實例創建一個Speech物件。需要為構造方法傳遞HTTP傳輸和JSON工廠這兩個參數。 另外,為了確保在API的每個HTTP請求中都包含了API金鑰,必須將SpeechRequestInitializer物件與構建器關聯並將API金鑰傳遞給過去。

以下代碼使用AndroidJsonFactory 類作為JSON工廠創建Speech對象,用NetHttpTransport類作為HTTP傳輸:

Cloud Speech API必須被告知音訊檔包含哪種語言。你可以通過創建RecognitionConfig 物件並調用其setLanguageCode() 方法來實現。以下是將其配置為僅轉錄美式英文的方法:

此外,Base64編碼的字串必須包裝在一個RecognitionAudio物件中才能被API使用。

接下來,必須創建SyncRecognizeRequest物件才能使用RecognitionConfigRecognitionAudio物件。顧名思義,它用來創建一個HTTP請求,以便同步轉錄音訊資料。 創建物件後,可以將其作為參數傳遞給syncrecognize()方法,並調用Speech.SpeechOperations.Syncrecognize物件的execute() 方法來執行HTTP請求。

execute()方法返回值是一個SyncRecognizeResponse物件,它包含幾個可選記錄。這裡,我們使用選擇第一項。

最後,將文本傳遞給TextView控制項來顯示。當然,只能在UI執行緒更新UI,請確保調用activity的runOnUiThread()方法之後執行此操作。

運行應用程式,選擇包含美式英語演講的FLAC檔,並查看Cloud Speech API為其生成文本。

要注意,Cloud Speech API目前只能處理單聲道音訊檔。如果發送多個頻道的檔會報錯。

5.使用Cloud Natural Language API

現在有一個文本,將其傳遞給Cloud Natural Language API進行分析。為了簡單起見,我們只進行實體和情緒分析。 換句話說,我們要確定文本中提到的所有實體,如人員,地點和職業,還要判斷其總體情緒是消極的,中立的還是積極的.

步驟1:更新佈局

為了讓使用者開始,佈局必須包含另一個Button控制項。將以下代碼添加到activity的XML佈局檔中:

步驟2:Annotate the Transcript

Cloud Natural Language REST API提供了一個名為annotateText的選項 ,它讓你只需一個HTTP請求即可在文檔上運行情緒和實體分析。我們用它來分析文本。

因為分析必須在使用者點擊按鈕時開始,需要添加一個OnClickListener事件。

要使用Google API Client庫與API進行交互,必須使用CloudNaturalLanguage.Builder類創建CloudNaturalLanguage對象  。它的構造方法還需要HTTP傳輸和JSON工廠這兩個參數。

此外,通過分配CloudNaturalLanguageRequestInitializer實例給它,可以強制它將API金鑰添加到所有請求中

要使用API​​分析的所有文本必須放在Document物件內。 該Document物件還必須包含配置資訊,如文本的語言,以及它是否被格式化為純文字或HTML。代碼如下:

接下來,必須創建一個Features物件來指定你感興趣的特徵。以下代碼顯示了如何創建一個Features物件,該物件表示你要提取實體並僅運行情緒分析。

現在可以使用DocumentFeatures物件來組合一個  AnnotateTextRequest物件,該物件被傳遞給annotateText()方法,然後生成AnnotateTextResponse物件。

請注意,我們正在開啟一個新執行緒,因為在UI執行緒上不允許網路操作。

通過調用AnnotateTextResponse物件的getEntities()方法,  你可以從AnnotateTextResponse物件中提取實體清單。同樣,你可以通過調用getDocumentSentiment()方法來提取文本的整體情緒。 然而,為了獲得情感的實際分數,你必須調用getScore()返回float值。

機智如你,情緒分數等於零意味著情緒是中性的,得分大於零意味著情緒是積極的,小於零的分數意味著情緒是負面的。

如何處理實體清單和情緒評當然取決於你。這裡,我們使用一個AlertDialog來顯示它們。

使用上述代碼,情緒分數將顯示在對話方塊的標題中,實體清單將顯示在其正文中。

如果運行APP,應該能夠分析音訊檔的內容以及轉錄它們。

結語

現在,你應該知道如何使用雲語音和雲自然語言API來創建一個Android APP了吧,它不僅可以轉錄音訊檔,還可以對其執行實體和情緒分析。在本教程中,你還學到了如何使用Android的存儲訪問框架和Google Client API庫。

Google一直在給這兩個API增加新的有趣功能,比如同時支援更多的語言。要保持最新狀態,請參閱官方文檔

當你看到這裡,你還可以看看關於移動APP雲服務和機器學習的其他文章。

关注我们的公众号
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.