成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

基于Android TTS服務(wù)開(kāi)發(fā)智能助手

譯文
移動(dòng)開(kāi)發(fā) Android
本文中將向你展示一個(gè)基本的Android應(yīng)用程序,此程序能夠聆聽(tīng)用戶的聲音并把它轉(zhuǎn)換為文本數(shù)據(jù)。而且,此程序還能夠進(jìn)行文本分析,然后執(zhí)行相應(yīng)的命令來(lái)實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)及用戶應(yīng)答功能。

 簡(jiǎn)介

本文中將向你展示一個(gè)基本的Android應(yīng)用程序,此程序能夠聆聽(tīng)用戶的聲音并把它轉(zhuǎn)換為文本數(shù)據(jù)。而且,此程序還能夠進(jìn)行文本分析,然后執(zhí)行相應(yīng)的命令來(lái)實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)及用戶應(yīng)答功能。

注意,本文源碼工程下載地址是:https://github.com/sitepoint-editors/SpeechApplication。

程序快照如下:

 

[[167745]]

創(chuàng)建應(yīng)用程序

打開(kāi)Android Studio創(chuàng)建一個(gè)新的項(xiàng)目,選擇最小版本的Android API 18并添加一個(gè)空的Activity。這也是本項(xiàng)目中唯一的一個(gè)Activity。

為了實(shí)現(xiàn)視圖的全屏顯示,打開(kāi)配置文件AndroidManifest.xml,并設(shè)置如下:

  1. android:theme="@style/Theme.AppCompat.NoActionBar" 

這個(gè)配置將使我們當(dāng)前的活動(dòng)(Activity)中隱藏ActionBar的顯示。

到此,你已經(jīng)擁有一個(gè)全屏式的白色背景色布局的視圖,其中僅有一個(gè)TextView控件。為了作一些改進(jìn),你可以把一個(gè)漸變形狀添加到RelativeLayout上。

接下來(lái),右擊drawable文件夾并選擇New->Drawable resource file。命名這個(gè)資源文件為background,并使用如下代碼替換原來(lái)的內(nèi)容:

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2.  
  3. <shape xmlns:android="http://schemas.android.com/apk/res/android" 
  4.  
  5. android:shape="rectangle" > 
  6.  
  7. <gradient 
  8.  
  9. android:type="linear" 
  10.  
  11. android:startColor="#FF85FBFF" 
  12.  
  13. android:endColor="#FF008080" 
  14.  
  15. android:angle="45"/> 
  16.  
  17. </shape> 

實(shí)際上,你可以根據(jù)自己的喜歡任意地修改顏色與角度。

注意:布局中的ImageButton控件使用了一個(gè)來(lái)自于https://design.google.com/icons/#ic_mic_none網(wǎng)站提供的圖像。你可以下載并把它以資源方式添加使用。

接下來(lái),更新文件activity_main.xml中的代碼:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2.  
  3. <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android" 
  4.  
  5. xmlns:tools="http://schemas.android.com/tools" 
  6.  
  7. android:layout_width="match_parent" 
  8.  
  9. android:layout_height="match_parent" 
  10.  
  11. android:background="@drawable/background" 
  12.  
  13. android:id="@+id/rel" 
  14.  
  15. tools:context="com.example.theodhor.speechapplication.MainActivity"
  16.  
  17. <ImageButton 
  18.  
  19. android:layout_width="wrap_content" 
  20.  
  21. android:layout_height="wrap_content" 
  22.  
  23. android:id="@+id/microphoneButton" 
  24.  
  25. android:layout_centerVertical="true" 
  26.  
  27. android:layout_centerHorizontal="true" 
  28.  
  29. android:src="@drawable/ic_mic_none_white_48dp" 
  30.  
  31. android:background="@null"/> 
  32.  
  33. </RelativeLayout> 

增加說(shuō)話功能

現(xiàn)在,用戶接口部分已經(jīng)完成,接下來(lái)要編寫位于MainActivity內(nèi)部的Java代碼了。

首先,在onCreate方法上面聲明一個(gè)變量TextToSpeech:

  1. private TextToSpeechtts; 

然后,在onCreate方法中添加如下代碼:

  1. tts = new TextToSpeech(this, new TextToSpeech.OnInitListener() { 
  2.  
  3. @Override 
  4.  
  5. public void onInit(int status) { 
  6.  
  7. if (status == TextToSpeech.SUCCESS) { 
  8.  
  9. int result = tts.setLanguage(Locale.US); 
  10.  
  11. if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { 
  12.  
  13. Log.e("TTS""This Language is not supported"); 
  14.  
  15.  
  16. speak("Hello"); 
  17.  
  18. else { 
  19.  
  20. Log.e("TTS""Initilization Failed!"); 
  21.  
  22.  
  23.  
  24. }); 

上述代碼將啟動(dòng)系統(tǒng)中的TextToSpeech服務(wù)。其中的speak()方法使用了一個(gè)String類型的參數(shù),它是你要求你的Android設(shè)備需要念出的文字。

下面要?jiǎng)?chuàng)建這個(gè)方法,并添加如下代碼:

  1. private void speak(String text){ 
  2.  
  3. if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.LOLLIPOP) { 
  4.  
  5. tts.speak(text, TextToSpeech.QUEUE_FLUSH, nullnull); 
  6.  
  7. }else
  8.  
  9. tts.speak(text, TextToSpeech.QUEUE_FLUSH, null); 
  10.  
  11.  

上面代碼中使用了Build.VERSION檢查,因?yàn)閠ts.speak(param,param,param)格式的調(diào)用對(duì)于Android API 5.1來(lái)說(shuō)已經(jīng)廢棄了。

在speak()方法后面再創(chuàng)建另一個(gè)方法,用于當(dāng)用戶關(guān)閉程序時(shí)負(fù)責(zé)停止TextToSpeech服務(wù):

  1. @Override 
  2.  
  3. public void onDestroy() { 
  4.  
  5. if (tts != null) { 
  6.  
  7. tts.stop(); 
  8.  
  9. tts.shutdown(); 
  10.  
  11.  
  12. super.onDestroy(); 
  13.  

到此,一旦你啟動(dòng)程序,這個(gè)程序便能說(shuō)出“Hello”這樣的語(yǔ)句了。接下來(lái)要實(shí)現(xiàn)的是使程序具備聽(tīng)的功能。

增加聆聽(tīng)功能

為了使程序能夠具備聽(tīng)的功能,你需要使用麥克風(fēng)按鈕。為此,需要在onCreate方法中添加如下代碼:

  1. findViewById(R.id.microphoneButton).setOnClickListener(new View.OnClickListener() { 
  2.  
  3. @Override 
  4.  
  5. public void onClick(View v) { 
  6.  
  7. listen(); 
  8.  
  9.  
  10. }); 

點(diǎn)擊ImageButton控件時(shí),將觸發(fā)調(diào)用下面這個(gè)函數(shù):

  1. private void listen(){ 
  2.  
  3. Intent i = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
  4.  
  5. i.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
  6.  
  7. i.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault()); 
  8.  
  9. i.putExtra(RecognizerIntent.EXTRA_PROMPT, "Say something"); 
  10.  
  11. try { 
  12.  
  13. startActivityForResult(i, 100); 
  14.  
  15. } catch (ActivityNotFoundException a) { 
  16.  
  17. Toast.makeText(MainActivity.this, "Your device doesn't support Speech Recognition", Toast.LENGTH_SHORT).show(); 
  18.  
  19.  

此方法將啟動(dòng)listening Activity,這個(gè)活動(dòng)會(huì)顯示一個(gè)帶有一段文本提示的對(duì)話框。講話所使用的語(yǔ)言是設(shè)備提供的,通過(guò)Locale.getDefault()方法實(shí)現(xiàn)。

StartActivityForResult (i,100)方法等待當(dāng)前活動(dòng)返回一個(gè)結(jié)果。100只是一個(gè)附加到已啟動(dòng)活動(dòng)的隨機(jī)代碼,其實(shí)也可以是一個(gè)任何適合你需要的數(shù)字。當(dāng)結(jié)果從已啟動(dòng)的活動(dòng)返回時(shí),它包含這個(gè)代碼并使用此代碼來(lái)區(qū)分來(lái)自于彼此的多個(gè)結(jié)果。

要從已啟動(dòng)的活動(dòng)中捕獲結(jié)果,需要添加下面的重寫方法:

  1. @Override 
  2.  
  3. protected void onActivityResult(intrequestCode, intresultCode, Intent data) { 
  4.  
  5. super.onActivityResult(requestCode, resultCode, data); 
  6.  
  7. if(requestCode == 100){ 
  8.  
  9. if (resultCode == RESULT_OK &&null != data) { 
  10.  
  11. ArrayList<String> res = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); 
  12.  
  13. String inSpeech = res.get(0); 
  14.  
  15. recognition(inSpeech); 
  16.  
  17.  
  18.  

這個(gè)方法捕獲來(lái)自于活動(dòng)的每一個(gè)結(jié)果并使用requestCode來(lái)處理語(yǔ)言識(shí)別器結(jié)果數(shù)據(jù)。如果requestCode等于100,requestCode等于OK并且來(lái)自于這個(gè)結(jié)果的數(shù)據(jù)不是null。你會(huì)從res.get(0)中取得result字符串。

接下來(lái),創(chuàng)建一個(gè)新方法recognition,此方法將使用一個(gè)String類型的參數(shù):

  1. private void recognition(String text){ 
  2.  
  3. Log.e("Speech",""+text); 
  4.  

到現(xiàn)在為止,當(dāng)用戶點(diǎn)擊麥克風(fēng)按鈕時(shí),程序能夠聽(tīng)聲音了,并且能夠把用戶的語(yǔ)言轉(zhuǎn)換為文本數(shù)據(jù),最終結(jié)果將通過(guò)Error日志打印輸出。

增加學(xué)習(xí)功能

為了使程序更有趣一些,在這一小節(jié)中你要使應(yīng)用程序能夠?qū)W習(xí)一些簡(jiǎn)單的事情,例如你的名字。為了實(shí)現(xiàn)這一功能,需要使用本地存儲(chǔ)功能。

首先,在onCreate方法中添加如下代碼:

  1. private SharedPreferences preferences; 
  2.  
  3. private SharedPreferences.Editor editor; 
  4.  
  5. private static final String PREFS = "prefs"
  6.  
  7. private static final String NAME = "name"
  8.  
  9. private static final String AGE = "age"
  10.  
  11. private static final String AS_NAME = "as_name"

然后,在onCreate方法中添加如下代碼:

  1. preferences = getSharedPreferences(PREFS,0); 
  2.  
  3. editor = preferences.edit(); 

首先,你需要使應(yīng)用程序提問(wèn)問(wèn)題,所以需要把speak("Hello")修改為speak(“What is your name?)。

在這里,您可以使用一個(gè)簡(jiǎn)單的邏輯;所以,當(dāng)有人問(wèn)"你的名字是什么?",答案是"我的名字是Dori",于是從答案中提出名字。一個(gè)簡(jiǎn)單的方法是把答案拆分由空格分隔的字符串并獲取最后一個(gè)索引的值。

于是,我們要更新recognition方法中的代碼,如下所示:

  1. private void recognition(String text){ 
  2.  
  3. Log.e("Speech",""+text); 
  4.  
  5. //creating an array which contains the words of the answer 
  6.  
  7. String[] speech = text.split(" "); 
  8.  
  9. //the last word is our name 
  10.  
  11. String name = speech[speech.length-1]; 
  12.  
  13. //we got the name, we can put it in local storage and save changes 
  14.  
  15. editor.putString(NAME,name).apply(); 
  16.  
  17. //make the app tell our name 
  18.  
  19. speak("Your name is "+preferences.getString(NAME,null)); 
  20.  

recognition方法使用來(lái)自用戶語(yǔ)音的所有結(jié)果。既然講話可能是不同的,你可以使用它們可能包含的某些單詞來(lái)區(qū)別它們。

例如,這個(gè)方法中的代碼可以是:

  1. private void recognition(String text){ 
  2.  
  3. Log.e("Speech",""+text); 
  4.  
  5. String[] speech = text.split(" "); 
  6.  
  7. //if the speech contains these words, the user is saying their name 
  8.  
  9. if(text.contains("my name is")){ 
  10.  
  11. String name = speech[speech.length-1]; 
  12.  
  13. Log.e("Your name""" + name); 
  14.  
  15. editor.putString(NAME,name).apply(); 
  16.  
  17. speak("Your name is "+preferences.getString(NAME,null)); 
  18.  
  19.  

但這仍然是一個(gè)與應(yīng)用程序的簡(jiǎn)單交互。你可以讓它學(xué)習(xí)你的年齡,或者給它起一個(gè)名字。

在同一個(gè)方法中,你可以嘗試下面這些簡(jiǎn)單的條件:

  1. //This must be the age 
  2.  
  3. //Just speak: I am x years old. 
  4.  
  5. if(text.contains("years") &&text.contains("old")){ 
  6.  
  7. String age = speech[speech.length-3]; 
  8.  
  9. Log.e("THIS""" + age); 
  10.  
  11. editor.putString(AGE, age).apply(); 
  12.  
  13.  
  14. //Then ask it for your age 
  15.  
  16. if(text.contains("how old am I")){ 
  17.  
  18. speak("You are "+preferences.getString(AGE,null)+" years old."); 
  19.  

應(yīng)用程序能夠告訴你時(shí)間信息:

  1. //Ask: What time is it? 
  2.  
  3. if(text.contains("what time is it")){ 
  4.  
  5. SimpleDateFormatsdfDate = new SimpleDateFormat("HH:mm");//dd/MM/yyyy 
  6.  
  7. Date now = new Date(); 
  8.  
  9. String[] strDate = sdfDate.format(now).split(":"); 
  10.  
  11. if(strDate[1].contains("00"))strDate[1] = "o'clock"
  12.  
  13. speak("The time is " + sdfDate.format(now)); 
  14.  

小結(jié)

在我創(chuàng)建的GitHub工程(https://github.com/sitepoint-editors/SpeechApplication)中包含了更多的例子,你可以充分地進(jìn)行實(shí)驗(yàn)并開(kāi)發(fā)出你自己真正的Android助手程序。

最后,希望你喜歡這個(gè)教程,并希望你能夠與自己的手機(jī)產(chǎn)生一次真正有用的對(duì)話。

責(zé)任編輯:趙立京 來(lái)源: 51CTO
相關(guān)推薦

2023-10-11 18:49:17

ChatGPT人工客服數(shù)據(jù)密集

2025-06-19 03:30:00

智能體DifyMCP

2011-06-01 13:05:19

Android TTS技術(shù)

2023-05-22 08:30:35

GPT-4智能編程助手

2025-04-25 08:08:46

2016-11-24 15:11:30

智能手機(jī)

2024-03-13 10:15:34

人工智能語(yǔ)音助手

2023-05-16 09:53:18

ChatGPT人工智能

2011-05-23 15:56:56

Android

2017-11-15 10:29:54

芥末堆

2021-08-18 10:06:33

鴻蒙HarmonyOS應(yīng)用

2011-12-27 20:16:11

Siri

2019-08-07 18:45:40

語(yǔ)音助手TTS前端

2013-01-18 17:26:01

虛擬助手智能手機(jī)語(yǔ)音助理

2023-11-03 07:46:54

CodeGeeX編程助手

2021-12-06 15:05:41

鴻蒙HarmonyOS應(yīng)用

2024-01-04 15:09:03

蜜蜂AI助手鴻蒙操作系統(tǒng)

2011-10-21 09:45:20

zEnterprise大型機(jī)服務(wù)器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 97国产精品视频人人做人人爱 | 成人在线免费视频观看 | 99亚洲精品 | 日本午夜一区 | 夜久久| 91精品国产综合久久香蕉麻豆 | 久久99国产精品 | 国产综合第一页 | 国产精品久久久久9999鸭 | 看片91| 18gay男同69亚洲网站 | 久久久www | 亚洲国产成人精品久久久国产成人一区 | 中文字幕在线视频一区二区三区 | 中文字幕a√ | 在线超碰| 日韩欧美黄色 | 毛片网在线观看 | 久久综合狠狠综合久久 | 日韩精品免费一区二区在线观看 | 日韩精品成人在线 | 成人精品视频99在线观看免费 | 欧美一区二区三区在线观看 | 久久精品亚洲欧美日韩精品中文字幕 | 欧美一区二区三区 | 午夜视频在线免费观看 | 成人伊人 | 久久天堂 | 国产在线第一页 | 一区二区日韩 | 久久一二 | 日韩欧美一区二区三区在线播放 | 99福利| 九九看片 | 欧美日韩一区在线观看 | 久久性色 | 日韩色视频 | 在线观看黄色电影 | 免费精品视频一区 | 日本不卡免费新一二三区 | 中国一级特黄毛片大片 |