android 中TextToSpeech的用法

目前只支持5种语言,分别是English、 French 、 German 、 Italian 和 Spanish.

系统要求为android 1.6以上

直接上代码啦:

[java]

  1. public class TTSActivity extends Activity implements TextToSpeech.OnInitListener {
  2. private static final String TAG = "TextToSpeechDemo";

private TextToSpeech mTts;//首先来个对象,至于TextToSpeech类,按F3可以查看

[java]

  1. //TODO complete javadoc + add links to constants
  2. public class TextToSpeech {
  3. /**
  4. * Denotes a successful operation.
  5. */
  6. public static final int SUCCESS                = 0;
  7. /**
  8. * Denotes a generic operation failure.
  9. */
  10. public static final int ERROR                  = -1;

以上只包含部分代码,其他的就省略了。

[java]

  1. mTts = new TextToSpeech(this,
  2. this  // TextToSpeech.OnInitListener
  3. );

然后是实例化,构造函数参数也可以F3一下

[java]

  1. public TextToSpeech(Context context, OnInitListener listener) {
  2. mContext = context;
  3. mPackageName = mContext.getPackageName();
  4. mInitListener = listener;
  5. mCachedParams = new String[2*Engine.NB_CACHED_PARAMS]; // store key and value
  6. mCachedParams[Engine.PARAM_POSITION_RATE] = Engine.KEY_PARAM_RATE;
  7. mCachedParams[Engine.PARAM_POSITION_LANGUAGE] = Engine.KEY_PARAM_LANGUAGE;
  8. mCachedParams[Engine.PARAM_POSITION_COUNTRY] = Engine.KEY_PARAM_COUNTRY;
  9. mCachedParams[Engine.PARAM_POSITION_VARIANT] = Engine.KEY_PARAM_VARIANT;
  10. mCachedParams[Engine.PARAM_POSITION_STREAM] = Engine.KEY_PARAM_STREAM;
  11. mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID] = Engine.KEY_PARAM_UTTERANCE_ID;
  12. mCachedParams[Engine.PARAM_POSITION_RATE + 1] =
  13. String.valueOf(Engine.DEFAULT_RATE);
  14. // initialize the language cached parameters with the current Locale
  15. Locale defaultLoc = Locale.getDefault();
  16. mCachedParams[Engine.PARAM_POSITION_LANGUAGE + 1] = defaultLoc.getISO3Language();
  17. mCachedParams[Engine.PARAM_POSITION_COUNTRY + 1] = defaultLoc.getISO3Country();
  18. mCachedParams[Engine.PARAM_POSITION_VARIANT + 1] = defaultLoc.getVariant();
  19. mCachedParams[Engine.PARAM_POSITION_STREAM + 1] =
  20. String.valueOf(Engine.DEFAULT_STREAM);
  21. mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = "";
  22. initTts();
  23. }

context也就是那个Activity

[java]

  1. public abstract class Context {
  2. /**
  3. * File creation mode: the default mode, where the created file can only
  4. * be accessed by the calling application (or all applications sharing the
  5. * same user ID).
  6. * @see #MODE_WORLD_READABLE
  7. * @see #MODE_WORLD_WRITEABLE
  8. */
  9. public static final int MODE_PRIVATE = 0x0000;
  10. /**
  11. * File creation mode: allow all other applications to have read access
  12. * to the created file.
  13. * @see #MODE_PRIVATE
  14. * @see #MODE_WORLD_WRITEABLE
  15. */
  16. public static final int MODE_WORLD_READABLE = 0x0001;
  17. /**
  18. * File creation mode: allow all other applications to have write access
  19. * to the created file.
  20. * @see #MODE_PRIVATE
  21. * @see #MODE_WORLD_READABLE
  22. */

listener是个初始化监听接口

[java]

  1. /**
  2. * Called when the TTS has initialized.
  3. *
  4. * The InitListener must implement the onInit function. onInit is passed a
  5. * status code indicating the result of the TTS initialization.
  6. */
  7. public interface OnInitListener {
  8. public void onInit(int status);
  9. }

implements Listener代码如下:(这是APIDemo里面的)

[java]

  1. // Implements TextToSpeech.OnInitListener.
  2. public void onInit(int status) {
  3. // status can be either TextToSpeech.SUCCESS or TextToSpeech.ERROR.
  4. if (status == TextToSpeech.SUCCESS) {
  5. // Set preferred language to US english.
  6. // Note that a language may not be available, and the result will indicate this.
  7. int result = mTts.setLanguage(Locale.US);
  8. // Try this someday for some interesting results.
  9. // int result mTts.setLanguage(Locale.FRANCE);
  10. if (result == TextToSpeech.LANG_MISSING_DATA ||
  11. result == TextToSpeech.LANG_NOT_SUPPORTED) {
  12. // Lanuage data is missing or the language is not supported.
  13. Log.e(TAG, "Language is not available.");
  14. } else {
  15. // Check the documentation for other possible result codes.
  16. // For example, the language may be available for the locale,
  17. // but not for the specified country and variant.
  18. // The TTS engine has been successfully initialized.
  19. // Allow the user to press the button for the app to speak again.
  20. mAgainButton.setEnabled(true);
  21. // Greet the user.
  22. sayHello();
  23. }
  24. } else {
  25. // Initialization failed.
  26. Log.e(TAG, "Could not initialize TextToSpeech.");
  27. }
  28. }

status这个在构造函数中赋值,(Ctrl+F可以在源码中找到)

[java]

  1. mCachedParams[Engine.PARAM_POSITION_STREAM + 1] =
  2. String.valueOf(Engine.DEFAULT_STREAM);
  3. mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = "";
  4. initTts();//构造函数最后这个地方
  5. }
  6. private void initTts() {
  7. mStarted = false;
  8. // Initialize the TTS, run the callback after the binding is successful
  9. mServiceConnection = new ServiceConnection() {
  10. public void onServiceConnected(ComponentName name, IBinder service) {
  11. synchronized(mStartLock) {
  12. mITts = ITts.Stub.asInterface(service);
  13. mStarted = true;
  14. if (mInitListener != null) {
  15. // TODO manage failures and missing resources
  16. mInitListener.onInit(SUCCESS);//这里给status赋值
  17. }
  18. }
  19. }

setLanguage方法源码:

[java]

  1. public int setLanguage(Locale loc) {
  2. synchronized (mStartLock) {
  3. int result = LANG_NOT_SUPPORTED;
  4. if (!mStarted) {
  5. return result;
  6. }
  7. try {
  8. mCachedParams[Engine.PARAM_POSITION_LANGUAGE + 1] = loc.getISO3Language();
  9. mCachedParams[Engine.PARAM_POSITION_COUNTRY + 1] = loc.getISO3Country();
  10. mCachedParams[Engine.PARAM_POSITION_VARIANT + 1] = loc.getVariant();
  11. // the language is not set here, instead it is cached so it will be associated
  12. // with all upcoming utterances. But we still need to report the language support,
  13. // which is achieved by calling isLanguageAvailable()
  14. result = mITts.isLanguageAvailable(
  15. mCachedParams[Engine.PARAM_POSITION_LANGUAGE + 1],
  16. mCachedParams[Engine.PARAM_POSITION_COUNTRY + 1],
  17. mCachedParams[Engine.PARAM_POSITION_VARIANT + 1] );
  18. } catch (RemoteException e) {
  19. // TTS died; restart it.
  20. Log.e("TextToSpeech.java - setLanguage", "RemoteException");
  21. e.printStackTrace();
  22. mStarted = false;
  23. initTts();
  24. } catch (NullPointerException e) {
  25. // TTS died; restart it.
  26. Log.e("TextToSpeech.java - setLanguage", "NullPointerException");
  27. e.printStackTrace();
  28. mStarted = false;
  29. initTts();
  30. } catch (IllegalStateException e) {
  31. // TTS died; restart it.
  32. Log.e("TextToSpeech.java - setLanguage", "IllegalStateException");
  33. e.printStackTrace();
  34. mStarted = false;
  35. initTts();
  36. } finally {
  37. return result;
  38. }
  39. }
  40. }

Locale.US定义如下:

[java]

  1. public static final Locale UK = new Locale("en", "GB"); //$NON-NLS-1$ //$NON-NLS-2$
  2. /**
  3. * Locale constant for en_US.
  4. *
  5. * @since Android 1.0
  6. */
  7. public static final Locale US = new Locale("en", "US");  //$NON-NLS-1$//$NON-NLS-2$

Locale构造器源码:

[java] view plaincopy

<EMBED id=ZeroClipboardMovie_11 name=ZeroClipboardMovie_11 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=18 width=18 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=11&width=18&height=18" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">

  1. /**
  2. * Constructs a new {@code Locale} using the specified language and country codes.
  3. *
  4. * @param language
  5. *            the language this {@code Locale} represents.
  6. * @param country
  7. *            the country this {@code Locale} represents.
  8. * @since Android 1.0
  9. */
  10. public Locale(String language, String country) {
  11. this(language, country, ""); //$NON-NLS-1$
  12. }

这里每按一次按钮就有一个Speech

[java]

  1. private void sayHello() {
  2. String left = "Please turn left";
  3. String right="Please turn right";
  4. if(mDirection==0){
  5. mTts.speak(left,
  6. TextToSpeech.QUEUE_FLUSH,  // Drop all pending entries in the playback queue.
  7. null);
  8. mDirection=1;
  9. }else{
  10. mTts.speak(right, TextToSpeech.QUEUE_FLUSH, null);
  11. mDirection=0;
  12. }

speak函数源码:各参数都有相应的解释,我就不啰嗦了

[java]

  1. /**
  2. * Speaks the string using the specified queuing strategy and speech
  3. * parameters. Note that the speech parameters are not universally supported
  4. * by all engines and will be treated as a hint. The TTS library will try to
  5. * fulfill these parameters as much as possible, but there is no guarantee
  6. * that the voice used will have the properties specified.
  7. *
  8. * @param text
  9. *            The string of text to be spoken.
  10. * @param queueMode
  11. *            The queuing strategy to use.
  12. *            See QUEUE_ADD and QUEUE_FLUSH.
  13. * @param params
  14. *            The hashmap of speech parameters to be used.
  15. *
  16. * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
  17. */
  18. public int speak(String text, int queueMode, HashMap<String,String> params)
  19. {
  20. synchronized (mStartLock) {
  21. int result = ERROR;
  22. Log.i("TTS received: ", text);
  23. if (!mStarted) {
  24. return result;
  25. }
  26. try {
  27. if ((params != null) && (!params.isEmpty())) {
  28. String extra = params.get(Engine.KEY_PARAM_STREAM);
  29. if (extra != null) {
  30. mCachedParams[Engine.PARAM_POSITION_STREAM + 1] = extra;
  31. }
  32. extra = params.get(Engine.KEY_PARAM_UTTERANCE_ID);
  33. if (extra != null) {
  34. mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = extra;
  35. }
  36. }
  37. result = mITts.speak(mPackageName, text, queueMode, mCachedParams);
  38. } catch (RemoteException e) {
  39. // TTS died; restart it.
  40. Log.e("TextToSpeech.java - speak", "RemoteException");
  41. e.printStackTrace();
  42. mStarted = false;
  43. initTts();
  44. } catch (NullPointerException e) {
  45. // TTS died; restart it.
  46. Log.e("TextToSpeech.java - speak", "NullPointerException");
  47. e.printStackTrace();
  48. mStarted = false;
  49. initTts();
  50. } catch (IllegalStateException e) {
  51. // TTS died; restart it.
  52. Log.e("TextToSpeech.java - speak", "IllegalStateException");
  53. e.printStackTrace();
  54. mStarted = false;
  55. initTts();
  56. } finally {
  57. resetCachedParams();
  58. return result;
  59. }
  60. }
  61. }

还有在Activity退出时作一些操作

[java]

  1. @Override
  2. public void onDestroy() {
  3. // Don‘t forget to shutdown!
  4. if (mTts != null) {
  5. mTts.stop();
  6. mTts.shutdown();
  7. }
  8. super.onDestroy();
  9. }

能看到源码真好...深入学习...呵呵

我们再看下android 到底是怎样stop和shutdown的

[java] view plaincopy

<EMBED id=ZeroClipboardMovie_15 name=ZeroClipboardMovie_15 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=18 width=18 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=15&width=18&height=18" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">

  1. /**
  2. * Stops speech from the TTS.
  3. *
  4. * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
  5. */
  6. public int stop() {
  7. synchronized (mStartLock) {
  8. int result = ERROR;
  9. if (!mStarted) {
  10. return result;
  11. }
  12. try {
  13. result = mITts.stop(mPackageName);
  14. } catch (RemoteException e) {
  15. // TTS died; restart it.
  16. Log.e("TextToSpeech.java - stop", "RemoteException");
  17. e.printStackTrace();
  18. mStarted = false;
  19. initTts();
  20. } catch (NullPointerException e) {
  21. // TTS died; restart it.
  22. Log.e("TextToSpeech.java - stop", "NullPointerException");
  23. e.printStackTrace();
  24. mStarted = false;
  25. initTts();
  26. } catch (IllegalStateException e) {
  27. // TTS died; restart it.
  28. Log.e("TextToSpeech.java - stop", "IllegalStateException");
  29. e.printStackTrace();
  30. mStarted = false;
  31. initTts();
  32. } finally {
  33. return result;
  34. }
  35. }
  36. }

还有shutdown函数:

[java]

  1. /**
  2. * Shuts down the TTS. It is good practice to call this in the onDestroy
  3. * method of the Activity that is using the TTS so that the TTS is stopped
  4. * cleanly.
  5. */
  6. public void shutdown() {
  7. try {
  8. mContext.unbindService(mServiceConnection);
  9. } catch (IllegalArgumentException e) {
  10. // Do nothing and fail silently since an error here indicates that
  11. // binding never succeeded in the first place.
  12. }
  13. }

还有Activity的destroy函数:

[java]

  1. /**
  2. * Perform any final cleanup before an activity is destroyed.  This can
  3. * happen either because the activity is finishing (someone called
  4. * {@link #finish} on it, or because the system is temporarily destroying
  5. * this instance of the activity to save space.  You can distinguish
  6. * between these two scenarios with the {@link #isFinishing} method.
  7. *
  8. * <p><em>Note: do not count on this method being called as a place for
  9. * saving data! For example, if an activity is editing data in a content
  10. * provider, those edits should be committed in either {@link #onPause} or
  11. * {@link #onSaveInstanceState}, not here.</em> This method is usually implemented to
  12. * free resources like threads that are associated with an activity, so
  13. * that a destroyed activity does not leave such things around while the
  14. * rest of its application is still running.  There are situations where
  15. * the system will simply kill the activity‘s hosting process without
  16. * calling this method (or any others) in it, so it should not be used to
  17. * do things that are intended to remain around after the process goes
  18. * away.
  19. *
  20. * <p><em>Derived classes must call through to the super class‘s
  21. * implementation of this method.  If they do not, an exception will be
  22. * thrown.</em></p>
  23. *
  24. * @see #onPause
  25. * @see #onStop
  26. * @see #finish
  27. * @see #isFinishing
  28. */
  29. protected void onDestroy() {
  30. mCalled = true;
  31. // dismiss any dialogs we are managing.
  32. if (mManagedDialogs != null) {
  33. final int numDialogs = mManagedDialogs.size();
  34. for (int i = 0; i < numDialogs; i++) {
  35. final Dialog dialog = mManagedDialogs.valueAt(i);
  36. if (dialog.isShowing()) {
  37. dialog.dismiss();
  38. }
  39. }
  40. }
  41. // close any cursors we are managing.
  42. int numCursors = mManagedCursors.size();
  43. for (int i = 0; i < numCursors; i++) {
  44. ManagedCursor c = mManagedCursors.get(i);
  45. if (c != null) {
  46. c.mCursor.close();
  47. }
  48. }
  49. }

好了,这个TTS就到这里。

至于现在到底是否支持中文发音这个我还没调查过。实在不行的话我们就做English版的软件也不错,单词发音,语音导航等等都是可以运用TTS的。

还有再唠叨一下,最近居然看到源码了,爽YY呀。感觉这一步就像是从了解一个人的表面到了解其本质...从上到下,从外到内...

时间: 2024-10-20 10:15:01

android 中TextToSpeech的用法的相关文章

Android中this的用法

关于Android中this的用法解释 问题由来 由于很多同学在学习Android时候没有对Java有很深的了解,很多人都会对代码中各种各样的this产生疑惑. 以<第一行代码Android>P37页,P43页代码为例: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.first_layout); Button but

关于Android 中 raw的用法以及与assets 的的区别和共同点

一.raw与assets的区别及共同点 (1) res/raw和assets的相同点 两个目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. (2) res/raw和assets的不同点: 1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.raw.filename: assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类. 2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是a

Android中的ContentValues用法

ContentValues 和HashTable类似都是一种存储的机制 但是两者最大的区别就在于,contenvalues只能存储基本类型的数据,像string,int之类的,不能存储对象这种东西,而HashTable却可以存储对象.ContentValues存储对象的时候,以(key,value)的形式来存储数据. 在忘数据库中插入数据的时候,首先应该有一个ContentValues的对象所以: ContentValues initial = new ContentValues(); init

Android中Toast的用法简介

转自:http://www.cnblogs.com/GnagWang/archive/2010/11/26/1888762.html Toast是Android中用来显示显示信息的一种机制,和Dialog不一样的是,Toast是没有焦点的,而且Toast显示的时间有限,过一定的时间就会自动消失.下面用一个实例来看看如何使用Toast. 1.默认效果 代码 Toast.makeText(getApplicationContext(), "默认Toast样式",     Toast.LEN

Android中pm命令用法(转)

usage: pm [list|path|install|uninstall] pm list packages [-f] pm list permission-groups pm list permissions [-g] [-f] [-d] [-u] [GROUP] pm list instrumentation [-f] [TARGET-PACKAGE] pm path PACKAGE pm install [-l] [-r] PATH pm uninstall [-k] PACKAGE

Android 中 LayoutParams 的用法

一个控件应当使用它的父控件的 LayoutParams 类型.因此,一个 TableVow 应该使用 TableLayout.Params . 所以,以一个 TableRow 为例: TableRow tableRow = new TableRow(context); tableRow.setLayoutParams(new TableLayout.LayoutParams( TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutPar

Android中Application类用法

原文:http://www.cnblogs.com/renqingping/archive/2012/10/24/Application.html Application类 Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时系统会创建一个Application对象,用来存储系统的一些信息. Android系统自动会为每个程序运行时创建一个Application类的对象且只创建一个,所以Application可以说是单例(si

android中sharedPreferences的用法

SharedPreferences介绍: 做软件开发应该都知道,很多软件会有配置文件,里面存放这程序运行当中的各个属性值,由于其配置信息并不多,如果采用数据库来存放并不划算,因为数据库连接跟操作等耗时大大影响了程序的效率,因此我们使用键值这种一一对应的关系来存放这些配置信息.SharedPreferences正是Android中用于实现这中存储方式的技术. SharedPreferences的使用非常简单,能够轻松的存放数据和读取数据.SharedPreferences只能保存简单类型的数据,例

Android中Parcelable接口用法(转自Harvey Ren)

1. Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel. Classes implementing the Parcelable interface must also have a static field called CREATOR, which is an object implementing the Parcelable.Creator int