2014-03-14 25 views
14

我試圖開發一個很酷的應用程序,它使用TTS引擎和語音識別。到目前爲止沒關係,但我想要更多。我想創建一個服務(我認爲服務是正確的方式),它總是在「傾聽」,當有人說"ok google"或別的什麼的時候,語音識別就開始了,就像google現在一樣。例如,如果您說"ok google"谷歌現在開始。我不知道從哪裏開始,所以如果可能的話,我直接問這裏。正如我想的那樣,我嘗試着看着這個主題[here](Listening for keywords at all times, like "Ok google" on 4.4),最後一個回答提到了服務。有人可以用我的代碼幫助我嗎?開發類似於「Google now」的應用程序 - 是否可以在沒有按鍵輸入的情況下使用語音識別?

例如,這是通過按一個按鈕就開始語音識別代碼:

/** 
* Instruct the app to listen for user speech input 
*/ 
private void listenToSpeech() { 
    //start the speech recognition intent passing required data 
    Intent listenIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    //indicate package 
    listenIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getClass().getPackage().getName()); 
    //message to display while listening 
    listenIntent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Say a word!"); 
    //set speech model 
    listenIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
    //specify number of results to retrieve 
    listenIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 10); 
    //start listening 
    startActivityForResult(listenIntent, VR_REQUEST); 
} 

你覺得有可能啓動listenIntent只是針對語音和不按任何按鈕?這就是我的意思。

+0

確實有一種好的想法,但我覺得寫一種感覺像「OK Google」這樣的服務的服務也不過是一種語音識別技術,你無法繼續24X7的運行。相反,你可以擔保一個主屏幕小部件,並在它的水龍頭,你可以啓動這個後臺服務,這將最終啓動你的應用程序,是的,你可以開始意圖在一個if塊,你的情況就像檢查你的語音輸入像「OK Google」這樣的硬編碼值。 –

+0

是的,它是一個不錯的主意。但是,你有沒有想法如何用代碼創建這種服務?我的意思是..應用程序如何認識到,如果我說「好的谷歌」必須啓動該意圖?這是我真正的問題。 –

+0

當您創建一個小部件時,您可以將活動映射到其啓動。因此,您可以編寫一個代碼,在其中啓動小部件「XYZ」活動,並且該活動直接採用與在應用程序中採用語音輸入相同的方式進行語音輸入。現在,在輸入語音輸入之後,將其轉換爲文本,並檢查它是否與「OK GOOGLE」匹配,如果是,則只需創建Intent即可。 –

回答

1

(更新2018年6月1日:添加了一些位前面的答案)

你可以用Saiy有參考以前Utter

這個應用程序使用熱詞檢測爲「谷歌現在」。

並且Android沒有提供這樣的API來執行此類操作。

Saiy應用程序現在開放源碼repository here。從我在代碼中看到的很少,它似乎已經使用CMU Pocketshinx實現了功能。

不要忘記張貼您的發現。

注 - 它的CPU密集型和消耗電池在後臺一直監聽。

0

那麼用Jform,不是android,並且你創建了一個按鈕,你就可以調用button.doClick()。所以我用的是Timer,Timer.scheduleAtFixedRate(新任務(),int延遲,int iterval);所以它會獨立完成並重復。所以我想知道的是,我確定這是一個在android中執行do.action/button/key等的方法,您可以使用一個計時器來獨立激活它。看起來好像是虛空,只是試試

listenToSpeech(); 

至於定時器;

Timer listenTimer = new Timer(); 
//listenTimer.schedualAtFixedRate(new listeningTask(),0,1);//place this where your program starts as this starts the timer 
class listeningTask extends TimerTask{ 
    if(condition){ 
    listenToSpeech(); 
    } 
} 

遺憾的格式或壓痕,使用片劑。

+0

如果你使用Timer scheduleAtFixedRate,它每秒只能運行1000次,所以它基本上使用0%的CPU,但如果你真的想,我可以發佈代碼使用套接字和InputStream阻塞,直到inptStream可用 - 我使用套接字,因爲它使您能夠使用waitBlock創建多個「waitBlocks」.thus它允許您使用更少的cpu。 –

相關問題