亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Android TTS學習——保存對你的喜歡

系統 1902 0

Android TTS學習——保存對你的喜歡

分類:? Google Android ? Android TTS ? 1100人閱讀 ? 評論 (4) ? 收藏 ? 舉報

一. ? 簡單介紹

在上一篇里

http://blog.csdn.net/ichliebephone/archive/2010/08/13/5810370.aspx

我們介紹了TTS提供的接口 ? OnUtteranceCompletedListener ? 的使用,這個接口的作用是監聽語音片段的朗讀,并在語音片段朗讀結束后調用其定義的回調函數,在回調函數里可以進行需要的操作。

在這一篇里我們介紹一下TTS提供的另一個有用的功能,把合成的語音以音頻文件的形式保存在系統里,然后就可以直接用播放音頻文件的方式來播放。

這個功能調用的函數為:

public?int? ? synthesizeToFile ? ( ? String ? ?text,? ? HashMap ? < ? String ? ,? ? String ? >?params,? String ? ?filename)

第一個參數為要進行語音合成的文本;第二個參數我們在上一個Demo中有所介紹,是一個鍵值對形式的HashMap類型變量,可以設置語音片段的ID等;第三個參數為保存到系統中的文件名。

當你想和朋友分享一份精彩的文本合成語音后的效果時,你可以使用這個功能把它保存為音頻文件發送給朋友,這樣即使朋友的手機不具備TTS功能,也可以用播放音頻的方式分享到;當你要對同一段較長的文本多次進行語音合成時,你可以把這段文本的語音保存為音頻文件,然后使用時播放,這樣會更省資源,運行速度更快,因為使用TTS是比較費資源的一個過程。因此我們會在某些場合用到這個功能。

下面我們就用這個功能完成一個Demo例子,當你害羞當面向她表白你對她的喜歡時,讓Android幫你語音合成你想說的話,然后你就可以向她發送保存了對她喜歡的這個音頻文件。

二. ? 實例開發

?

我們希望做的效果如下:

Android TTS學習——保存對你的喜歡

?

1? 實現效果圖

?

第一個文本框里可以輸入需要語音合成的文本,第二個文本框里輸入要保存成的音頻文件的文件名,點擊第一個 Speak ?按鈕你可以預聽一下 TTS ?語音合成的效果,點擊第二個 Record ?按鈕,就會以音頻文件的形式保存,然后就可以點擊第三個 Play ?按鈕播放保存的這個音頻文件。

創建一個 Android ?工程,工程名為 AndroidTTSDemoFourth ?,其中 SDK ?版本需選擇 1.6 ?及以上。

其中 Main.xml ?文件很簡單,如下所示:

?

  1. <? xml ? version = "1.0" ? encoding = "utf-8" ?> ??
  2. < LinearLayout ? xmlns:android = "http://schemas.android.com/apk/res/android" ??
  3. ???? android:orientation = "vertical" ??
  4. ???? android:layout_width = "fill_parent" ??
  5. ???? android:layout_height = "fill_parent" ??
  6. ???? > ??
  7. ???? < EditText ? android:id = "@+id/inputText" ???
  8. ???????????????? android:hint = "Input?the?text?here!" ???
  9. ???????????????? android:layout_width = "fill_parent" ???
  10. ???????????????? android:layout_height = "wrap_content" > ??
  11. ???????????????? </ EditText > ??
  12. ???? < Button ? android:text = "Speak" ???
  13. ???????????????? android:id = "@+id/speakBtn" ???
  14. ???????????????? android:layout_width = "wrap_content" ???
  15. ???????????????? android:layout_height = "wrap_content" ??
  16. ???????????????? android:layout_gravity = "center_horizontal" ??
  17. ???????????????? android:enabled = "false" ??
  18. ???????????????? > </ Button > ??
  19. ???? < TextView ? android:id = "@+id/filenameLabel" ??
  20. ???????????????? android:text = "Save?as:" ??
  21. ???????????????? android:layout_width = "fill_parent" ???
  22. ???????????????? android:layout_height = "wrap_content" ??????????????????
  23. ???????????????? > </ TextView > ?????
  24. ???? < EditText ? android:id = "@+id/filenameText" ??
  25. ???????????????? android:hint = "Input?the?saving?file?name?here!" ??
  26. ???????????????? android:layout_width = "fill_parent" ???
  27. ???????????????? android:layout_height = "wrap_content" > ??????????????????
  28. ???????????????? > </ EditText > ??
  29. ???? < LinearLayout ? xmlns:android = "http://schemas.android.com/apk/res/android" ??
  30. ???????????????????? android:orientation = "horizontal" ??
  31. ???????????????????? android:layout_width = "fill_parent" ??
  32. ???????????????????? android:layout_height = "fill_parent" ??
  33. ???????????????????? android:gravity = "center_horizontal" ??
  34. ???????????????????? > ??
  35. ???????? < Button ? android:id = "@+id/recordBtn" ??
  36. ???????????????????? android:text = "Record" ??
  37. ???????????????????? android:layout_width = "wrap_content" ???
  38. ???????????????????? android:layout_height = "wrap_content" ??
  39. ???????????????????? > </ Button > ??
  40. ???????? < Button ? android:id = "@+id/playBtn" ??
  41. ???????????????????? android:text = "Play" ??
  42. ???????????????????? android:layout_width = "wrap_content" ???
  43. ???????????????????? android:layout_height = "wrap_content" ??
  44. ???????????????????? android:enabled = "false" ??
  45. ???????????????????? > </ Button > ??
  46. ???? </ LinearLayout > ?????????????????????????????
  47. </ LinearLayout > ??

?

?

Java ? 文件的編寫:

有了前面這些 Demo ?的實例開發,這個 Demo ?實現起來就比較簡單了,程序的代碼如下所示:

?

  1. public ? class ?AndroidTTSDemoFourth? extends ?Activity? implements ?OnInitListener{??
  2. ???? //實現初始接口 ??
  3. ???? /**?Called?when?the?activity?is?first?created.?*/ ??
  4. ???? //定義變量 ??
  5. ???? private ?EditText?inputText?=? null ;??
  6. ???? private ?Button?speakBtn?=? null ;??
  7. ???? private ?EditText?filenameText?=? null ;??
  8. ???? private ?Button?recordBtn?=? null ;??
  9. ???? private ?Button?playBtn?=? null ;??
  10. ???? private ?TextToSpeech?mTts;??
  11. ???? private ? static ? final ?String?TAG?=? "TTS?Demo" ;??
  12. ???? private ? static ? final ?String?loveConfession?=? "jia?jia,?I?love?you.?" ;??
  13. ???? private ?String?loveFileName?=? null ;??
  14. ???? private ?File?loveFile?=? null ;??
  15. ???? private ?MediaPlayer?player?=? null ;??
  16. ??????
  17. ???? @Override ??
  18. ???? public ? void ?onCreate(Bundle?savedInstanceState)?{??
  19. ???????? super .onCreate(savedInstanceState);??
  20. ????????setContentView(R.layout.main);??
  21. ???????? //創建TextToSpeech實例,初始化完成后會調用OnInitListener(第二個參數)的回調函數 ??
  22. ????????mTts?=? new ?TextToSpeech( this ,??
  23. ???????????????? this ?? //?TextToSpeech.OnInitListener ??
  24. ????????????????);??
  25. ???????? //設置控件 ??
  26. ????????inputText?=?(EditText)findViewById(R.id.inputText);??
  27. ????????speakBtn?=?(Button)findViewById(R.id.speakBtn);??
  28. ????????filenameText?=?(EditText)findViewById(R.id.filenameText);??
  29. ????????recordBtn?=?(Button)findViewById(R.id.recordBtn);??
  30. ????????playBtn?=?(Button)findViewById(R.id.playBtn);??
  31. ????????????????
  32. ????????inputText.setText(loveConfession);????
  33. ????????filenameText.setText( "/sdcard/love.wav" );??
  34. ????????speakBtn.setOnClickListener( new ?OnClickListener()?{???????
  35. ???????????? public ? void ?onClick(View?v)?{??
  36. ???????????????? //?TODO?Auto-generated?method?stub ??
  37. ???????????????? //朗讀輸入框里的內容 ??
  38. ????????????????mTts.speak(inputText.getText().toString(),?TextToSpeech.QUEUE_ADD,? null );??
  39. ????????????}??
  40. ????????});??
  41. ????????recordBtn.setOnClickListener( new ?OnClickListener()?{??????????????
  42. ???????????? @Override ??
  43. ???????????? public ? void ?onClick(View?v)?{??
  44. ???????????????? //?TODO?Auto-generated?method?stub ??
  45. ???????????????? //把TTS語音合成的結果保存為音頻文件 ??
  46. ????????????????loveFileName?=?filenameText.getText().toString();??
  47. ????????????????loveFile?=? new ?File(loveFileName);??
  48. ???????????????? if (loveFile.exists())??
  49. ????????????????{??
  50. ????????????????????loveFile.delete();??
  51. ????????????????}??
  52. ???????????????? //把語音合成的結果保存到文件中 ??
  53. ???????????????? if (TextToSpeech.SUCCESS?==?mTts.synthesizeToFile(inputText.getText().toString(),? null ,?loveFileName))??
  54. ????????????????{??
  55. ????????????????????Toast.makeText(getBaseContext(),? "sound?file?created!" ,?Toast.LENGTH_SHORT).show();??
  56. ????????????????????playBtn.setEnabled( true );??
  57. ????????????????}??
  58. ???????????????? else ??
  59. ????????????????{??
  60. ????????????????????Toast.makeText(getBaseContext(),? "failed?to?create?sound?file!" ,?Toast.LENGTH_SHORT).show();??
  61. ????????????????}??
  62. ????????????}??
  63. ????????});??
  64. ????????playBtn.setOnClickListener( new ?OnClickListener()?{????????????
  65. ???????????? @Override ??
  66. ???????????? public ? void ?onClick(View?v)?{??
  67. ???????????????? //?TODO?Auto-generated?method?stub ??
  68. ???????????????? //播放保存著的音頻文件 ??
  69. ???????????????? try ??
  70. ????????????????{??
  71. ????????????????????player?=? new ?MediaPlayer();??
  72. ????????????????????player.setDataSource(loveFileName);??
  73. ????????????????????player.prepare();??
  74. ????????????????????player.start();??
  75. ????????????????}??
  76. ???????????????? catch ?(Exception?e)?{??
  77. ???????????????????? //?TODO:?handle?exception ??
  78. ????????????????????Toast.makeText(getBaseContext(),? "failed?to?play?sound?file!" ,?Toast.LENGTH_SHORT).show();??
  79. ????????????????????e.printStackTrace();??
  80. ????????????????}??
  81. ????????????}??
  82. ????????});??
  83. ????}??
  84. ??????
  85. ???? public ? void ?onInit( int ?status)?{??
  86. ???????? //?TODO?Auto-generated?method?stub ??
  87. ???????? //TTS?Engine初始化完成 ??
  88. ???????? if (status?==?TextToSpeech.SUCCESS)??
  89. ????????{??
  90. ???????????? int ?result?=?mTts.setLanguage(Locale.US);??
  91. ???????????? //設置發音語言 ??
  92. ???????????? if (result?==?TextToSpeech.LANG_MISSING_DATA?||?result?==?TextToSpeech.LANG_NOT_SUPPORTED)??
  93. ???????????? //判斷語言是否可用 ??
  94. ????????????{??
  95. ????????????????Log.v(TAG,? "Language?is?not?available" );??
  96. ????????????????speakBtn.setEnabled( false );??
  97. ????????????}??
  98. ???????????? else ??
  99. ????????????{??
  100. ????????????????speakBtn.setEnabled( true );??
  101. ????????????}??
  102. ????????}??
  103. ????}??
  104. ??????
  105. ???? @Override ??
  106. ???? protected ? void ?onDestroy()?{??
  107. ???????? //?TODO?Auto-generated?method?stub ??
  108. ???????? //釋放TTS的資源 ??
  109. ???????? if (mTts?!=? null )??
  110. ????????{??
  111. ????????????mTts.stop();??
  112. ????????????mTts.shutdown();??
  113. ????????}?????
  114. ???????? super .onDestroy();??
  115. ????}??
  116. }??

?

?

TTS ?相關的新的部分為 recordBtn ?的 onClick ?事件的處理,先根據指定的文件名創建一個 File ?變量,來判斷文件是否已經存在,如果已存在就先刪除。然后調用函數

mTts ? .synthesizeToFile( ? inputText ? .getText().toString(),? null ? ,? loveFileName ? )

把文本框中的內容語音合成后保存到文件中。

另一個 playBtn ?的 onClick ?事件的處理,主要就是創建一個 MediaPlayer ?實例,播放上一步保存的音頻文件。

?

至此,這個 Demo ?就完成了,但是在運行前,需創建一個帶 SD ?卡的 AVD ?,因為要往 SD ?卡上保存文件,如下所示:

Android TTS學習——保存對你的喜歡

2? 必須創建帶 SD ?卡的 AVD

?

同時還需在 AndroidManifest.xml ?文件中添加寫外部存儲設備的權限:

< ? uses-permission ? android:name ? = ? "android.permission.WRITE_EXTERNAL_STORAGE" ? ></ uses-permission ? >

接著就可以運行這個 Demo ?了,運行程序后在 Eclipse ?中切換到 DDMS ?視圖,接著選擇查看 File Explorer ?,我們看到在沒有點擊程序的 Record ?按鈕進行語音合成到文件保存時, sdcard ?目錄下沒有額外的文件,如下圖所示:

Android TTS學習——保存對你的喜歡

?

3? 原始的 SD ?卡目錄

?

?

然后我們在程序中點擊 Record ?按鈕,讓 TTS ?把語音合成到文件,合成成功的話會彈出“ sound file created! ?”的提示,并且 Play ?按鈕變成可用。點擊 Play ?按鈕就會播放剛剛保存的音頻文件,和點擊第一個的 Speak ?按鈕朗讀的內容是一樣的。這時,我們再來查看下 SD ?卡的目錄,會發現多了一個文件: love.wav ?,正是我們設定保存的文件名,如下圖所示:

Android TTS學習——保存對你的喜歡

?

4? 語音合成到文件后的 SD ?卡目錄

?

?

并且,我們還可以使用 adb pull ?命令把這個文件從 SD ?卡上提取出來,在 CMD ?窗口中運行 adb pull ./sdcard/love.wav? 就可以把 SD ?卡上的這個音頻文件保存的當前目錄下,如下圖所示:

Android TTS學習——保存對你的喜歡

?

5? 提取 SD ?卡上保存的音頻文件

最后,也可以在電腦上播放記錄了你對她的喜歡的這個音頻文件了,或者也可以把這個文件發送給你喜歡的她。

?

注:文章參加“ ?首屆Google暑期大學生博客分享大賽——2010 Andriod篇

Android TTS學習——保存對你的喜歡


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产91在线视频 | 夜夜爱夜夜操 | 一道精品视频一区二区三区图片 | 日本高清毛片视频在线看 | 久久99精品麻豆国产 | 538在线视频二三区视视频 | 色姑娘综合网 | 日本欧美成 | 亚洲午夜国产精品无卡 | 亚洲欧洲尹人香蕉综合 | 亚洲国产精品不卡毛片a在线 | 日韩欧美中文字幕在线视频 | 国产欧美日韩图片一区二区 | 成人爽a毛片在线视频网站 成人爽视频 | 一级毛片aa| 久久免费福利视频 | 日日摸夜夜夜夜夜添 | 日本sese| 在线免费观看国产精品 | 久久久高清 | 四虎网址在线 | 午夜时刻免费实验区观看 | 久久亚洲网站 | 黄色69| 日本一道一区 | 亚洲一区二区欧美日韩 | 日韩精品视频一区二区三区 | 神马影院伦理我不卡 | 四虎国产精品免费久久影院 | 成人亚洲性情网站www在线观看 | 日韩欧美无线在码 | 香蕉免费一级视频在线观看 | 欧美成人h版影片在线观看 欧美成人h精品网站 | 久草久草在线视频 | 99这里只有 | 日本大蕉香蕉大视频在线观看 | 久久久久久久国产精品毛片 | 欧美精品久久久久久久影视 | 日本一级爰免费视频 | 性性影院在线观看 | 这里只有精品视频在线 |