基於TextToSpeech(tts)引擎的朗讀demo,很好玩的一個功能
阿新 • • 發佈:2019-02-11
<span style="font-size:18px;">package com.xu.texttospeak; import java.io.File; import java.util.Date; import java.util.Locale; import com.xu.xutexttospeak.R; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.speech.tts.TextToSpeech; import android.speech.tts.TextToSpeech.OnInitListener; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; /** * * @author DaJian35 * 用於朗讀輸入的內容O(∩_∩)O~很好玩的東西 目前tts不支援中文朗讀。 * (如果不能朗讀語音,可以看看手機設定-->語言和輸入法-->文字轉語音(TTS)輸出-->將語言設定成英文(美國)) * */ public class XuTextToSpeech extends Activity implements OnClickListener, OnInitListener { private Button speak; // 朗讀按鈕 private Button record; // 記錄按鈕 private EditText speakInfo; // 用於獲取需要朗讀的內容 private TextToSpeech tts; // texttospeech引擎 private String editInfo; // 獲取edittext的內容 private Toast toast; private String pathRoot; // 聲音記錄的路徑 private Date date; // 用於記錄聲音的檔名 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); // 初始化 } // 初始化 private void initView() { speak = (Button) findViewById(R.id.speak); record = (Button) findViewById(R.id.record); speakInfo = (EditText) findViewById(R.id.speakInfo); // 兩個button的監聽 speak.setOnClickListener(XuTextToSpeech.this); record.setOnClickListener(XuTextToSpeech.this); date = new Date(); // 建立texttospeech物件 tts = new TextToSpeech(XuTextToSpeech.this, XuTextToSpeech.this); } @Override public void onClick(View v) { switch (v.getId()) { // 朗讀按鈕的監聽事件 case R.id.speak: /* * 第二個引數中, TextToSpeech.QUEUE_FLUSH表示: * 當tts物件呼叫speak方法時,它會中斷當前例項正在執行的任務。(可以理解為清除當前語音任務,轉而執行新的語音任務) * TextToSpeech.QUEUE_ADD表示:當tts物件呼叫speak方法時,會把新的發音任務新增到當前發音任務列隊之後 */ if (getEditText().trim().length() == 0) { CenterToast("請填寫需要記錄的內容,且內容不能為空~~"); // 呼叫自定義的toast方法 } else { tts.speak(getEditText(), TextToSpeech.QUEUE_FLUSH, null); CenterToast("speak"); // 呼叫自定義的toast方法 } break; // 記錄聲音按鈕的監聽 case R.id.record: if (isHaveIdCard()) { if (getEditText().trim().length() == 0) { CenterToast("請填寫需要記錄的內容,且內容不能為空~~"); // 呼叫自定義的toast方法 } else { pathRoot = Environment.getExternalStorageDirectory() .getAbsolutePath() + "/XuTextToSpeech"; File pathFile = new File(pathRoot); if (!pathFile.exists()) { pathFile.mkdirs(); } tts.synthesizeToFile(getEditText(), null, pathRoot + "/" + date.getDay() + date.getHours() + date.getMinutes() + date.getSeconds() + ".wav"); CenterToast("聲音記錄成功!!"); } } else { CenterToast("SD卡不存在,不能記錄語音內容~"); } break; default: break; } } // 實現OnInitListener介面方法 @Override public void onInit(int status) { // 如果裝載tts引擎成功 if (status == TextToSpeech.SUCCESS) { // 設定朗讀的語言 int result = tts.setLanguage(Locale.US); if (result != TextToSpeech.LANG_COUNTRY_AVAILABLE && result != TextToSpeech.LANG_AVAILABLE) { CenterToast("TTS暫時不支援這種語言的朗讀!~~"); // 呼叫自定義toast提示 } } else { CenterToast("裝載tts引擎不成功!"); // 呼叫自定義toast提示 } } // 自定義Toast(看起來比較美觀) public void CenterToast(String content) { toast = Toast .makeText(XuTextToSpeech.this, content, Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER, 0, 20); toast.show(); } // 獲得edittext的內容 public String getEditText() { editInfo = speakInfo.getText().toString(); return editInfo; } // 判斷SD是否存在 public boolean isHaveIdCard() { if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { return true; } else { return false; } } // tts的銷燬 @Override protected void onDestroy() { if (tts != null) { tts.shutdown(); } } }</span>
前段時間在《android的瘋狂講義》書上看到了用tts引擎做一個自動朗讀的介紹。很好玩的一個東西,我參考裡面的內容,自己添加了一些嚴謹性的判斷。看上去 好像很多程式碼,其實大部分都是為了嚴謹性而新增的if判斷語句,還有裡面標記了很多註釋,希望能幫助有需要的朋友O(∩_∩)O~
ps:如果還有什麼不懂的,可以提出來,我們一起共同進步~!= =
demo下載地址:http://download.csdn.net/detail/dajian35/8345015