Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK
Code

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

by
Difficulty:IntermediateLength:LongLanguages:

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 library

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

Enabling Cloud Speech API

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

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

Enabling Cloud Natural Language API

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

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

API 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
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.