[转载]Android TTS学习(补充)--我能说中文 - ichliebephone的专栏 - 博客频道 - CSDN.NET

[转载]Android TTS学习(补充)–我能说中文 – ichliebephone的专栏 – 博客频道 – CSDN.NET.

一. 基础知识

Android 从1.6 版本开始支持Text To Speech ,使用的是Pico 语音合成引擎,但是只支持 English 、 French 、 German 、 Italian 和 Spanish 五大语言 , 暂时没有对中文提供支持。因此使用 Android 默认的 TTS Engine 是没法朗读中文的。

不过有开源项目 eyes-free ( http://code.google.com/p/eyes-free/ , Android 上的 TTS 功能应该也是基于这个开源项目提供的)除了提供 Pico 外,还把支持其他更多语言语音合成的另一个 TTS 引擎 eSpeak 也移植到了 Android 平台,其中就支持中文的语音合成。

因此在安装了 eyes-free 提供的 TTS Service Extended 的 apk 后,就可以在程序中使用 eyes-free 提供的 TTS library ,并把 TTS Engine 设置为不是默认的 Pico ,而是 eSpeak ,就可以实现朗读中文了。不过经过测试,实际的效果还是很差的,只能说勉强可以朗读而已。

二. 实例分析

下面我们就通过一个具体的例子来说明朗读中文的实现过程。

 

希望实现的效果和之前的类似:

图 1 实现效果图

上面一个输入框,点击 “我说” 按钮则朗读上面的文字内容。

首先我们要到 eyes-free 那下载需要的 TTS library 的 jar 包 (http://code.google.com/p/eyes-free/downloads/detail?name=TTS_library_stub_3.0_market.jar&can=2&q=) 。

 

创建一个 Android 工程,工程名为 NiHaoTTS ,并且把下载的 jar 包放在 assets 文件夹下。右键点击工程,选择 properties , Java Build Path , Libraries , Add JARs, 往工程中添加进 assets 下的 jar 包 , 如下图所示:

图2 添加 TTS library jar 包

其中 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
  8.         android:id=“@+id/ttstext”
  9.         android:layout_width=“fill_parent”
  10.         android:layout_height=“wrap_content”
  11.         android:text=“你好,我能说中文”>
  12.     </EditText>
  13.     <Button
  14.         android:id=“@+id/ttsbtn”
  15.         android:layout_width=“fill_parent”
  16.         android:layout_height=“wrap_content”
  17.         android:text=“我说”
  18.         android:enabled=“false”>
  19.     </Button>
  20. </LinearLayout>

Java 文件的编写:

Java 文件和之前的类似,只是因为使用了 eyes-free 的 TTS API ,而不是 Android 自带的 TTS API ,因此有些许改变。相关的 API 参考: http://eyes-free.googlecode.com/svn/trunk/documentation/tts/com/google/tts/package-summary.html ,其中我们可以看到基本和 Android 的 API ()类似,其中一个明显的区别是创建 TTS 对象这里使用的是 TextToSpeechBeta ,而之前我们使用的是 TextToSpeech


 

Java 完整的代码为:

  1. public class NiHaoTTS extends Activity implements OnInitListener{
  2.     /** Called when the activity is first created. */
  3.     private Button mBtn;
  4.     private EditText mText;
  5.     //使用com.google.tts包中的TextToSpeechBeta
  6.     private TextToSpeechBeta mTTS;
  7.     private static final String TAG = “TTS Demo”;
  8.     private static final int REQ_TTS_STATUS_CHECK = 0;
  9.     @Override
  10.     public void onCreate(Bundle savedInstanceState) {
  11.         super.onCreate(savedInstanceState);
  12.         setContentView(R.layout.main);
  13.         //检查TTS数据是否已经安装并且可用
  14.         Intent checkIntent = new Intent();
  15.         checkIntent.setAction(TextToSpeechBeta.Engine.ACTION_CHECK_TTS_DATA);
  16.         startActivityForResult(checkIntent, REQ_TTS_STATUS_CHECK);
  17.         mText = (EditText)findViewById(R.id.ttstext);
  18.         mBtn = (Button) findViewById(R.id.ttsbtn);
  19.         mBtn.setOnClickListener(new OnClickListener() {
  20.             @Override
  21.             public void onClick(View v) {
  22.                 // TODO Auto-generated method stub
  23.                 String ttsText = mText.getText().toString();
  24.                 if(ttsText != “”)
  25.                 {
  26.                     //读取文本框中的中文
  27.                     mTTS.speak(ttsText, TextToSpeechBeta.QUEUE_ADD, null);
  28.                 }
  29.             }
  30.         });
  31.     }
  32.   //实现TTS初始化接口  
  33.     @Override
  34.     public void onInit(int status, int version) {
  35.         // TODO Auto-generated method stub
  36.         Log.v(TAG, “version = “ + String.valueOf(version));
  37.         //判断TTS初始化的返回版本号,如果为-1,表示没有安装对应的TTS数据
  38.         if(version == –1)
  39.         {
  40.             //提示安装所需的TTS数据
  41.             alertInstallEyesFreeTTSData();
  42.         }
  43.         else
  44.         {
  45.             //TTS Engine初始化完成
  46.             if(status == TextToSpeechBeta.SUCCESS)
  47.             {
  48.                 Log.v(TAG, “success to init tts”);
  49.                 //设置TTS引擎,com.google.tts即eSpeak支持的语言包含中文,使用Android系统默认的pico可以设置为com.svox.pico
  50.                 mTTS.setEngineByPackageNameExtended(“com.google.tts”);
  51.                 int result = mTTS.setLanguage(Locale.CHINA);
  52.                 //设置发音语言
  53.                 if(result == TextToSpeechBeta.LANG_MISSING_DATA || result == TextToSpeechBeta.LANG_NOT_SUPPORTED)
  54.                 //判断语言是否可用
  55.                 {
  56.                     Log.v(TAG, “Language is not available”);
  57.                     mBtn.setEnabled(false);
  58.                 }
  59.                 else
  60.                 {
  61.                     mTTS.speak(“你好,朋友!”, TextToSpeechBeta.QUEUE_ADD, null);
  62.                     mBtn.setEnabled(true);
  63.                 }
  64.             }
  65.             else
  66.             {
  67.                 Log.v(TAG, “failed to init tts”);
  68.             }
  69.         }
  70.     }
  71.     protected  void onActivityResult(int requestCode, int resultCode, Intent data) {
  72.         if(requestCode == REQ_TTS_STATUS_CHECK)
  73.         {
  74.             switch (resultCode) {
  75.             case TextToSpeechBeta.Engine.CHECK_VOICE_DATA_PASS:
  76.                 //这个返回结果表明TTS Engine可以用
  77.             {
  78.                 //使用的是TextToSpeechBeta
  79.                 mTTS = new TextToSpeechBeta(thisthis);
  80.                 Log.v(TAG, “TTS Engine is installed!”);
  81.             }
  82.                 break;
  83.             case TextToSpeechBeta.Engine.CHECK_VOICE_DATA_BAD_DATA:
  84.                 //需要的语音数据已损坏
  85.             case TextToSpeechBeta.Engine.CHECK_VOICE_DATA_MISSING_DATA:
  86.                 //缺少需要语言的语音数据
  87.             case TextToSpeechBeta.Engine.CHECK_VOICE_DATA_MISSING_VOLUME:
  88.                 //缺少需要语言的发音数据
  89.             {
  90.                 //这三种情况都表明数据有错,重新下载安装需要的数据
  91.                 Log.v(TAG, “Need language stuff:”+resultCode);
  92.                 Intent dataIntent = new Intent();
  93.                 dataIntent.setAction(TextToSpeechBeta.Engine.ACTION_INSTALL_TTS_DATA);
  94.                 startActivity(dataIntent);
  95.             }
  96.                 break;
  97.             case TextToSpeechBeta.Engine.CHECK_VOICE_DATA_FAIL:
  98.                 //检查失败
  99.             default:
  100.                 Log.v(TAG, “Got a failure. TTS apparently not available”);
  101.                 break;
  102.             }
  103.         }
  104.         else
  105.         {
  106.             //其他Intent返回的结果
  107.         }
  108.     }
  109.     //弹出对话框提示安装所需的TTS数据
  110.     private void alertInstallEyesFreeTTSData()
  111.     {
  112.         Builder alertInstall = new AlertDialog.Builder(this)
  113.             .setTitle(“缺少需要的语音包”)
  114.             .setMessage(“下载安装缺少的语音包”)
  115.             .setPositiveButton(“确定”new DialogInterface.OnClickListener() {
  116.                 @Override
  117.                 public void onClick(DialogInterface dialog, int which) {
  118.                     // TODO Auto-generated method stub
  119.                     //下载eyes-free的语音数据包
  120.                     String ttsDataUrl = “http://eyes-free.googlecode.com/files/tts_3.1_market.apk”;
  121.                     Uri ttsDataUri = Uri.parse(ttsDataUrl);
  122.                     Intent ttsIntent = new Intent(Intent.ACTION_VIEW, ttsDataUri);
  123.                     startActivity(ttsIntent);
  124.                 }
  125.             })
  126.             .setNegativeButton(“取消”new DialogInterface.OnClickListener() {
  127.                 @Override
  128.                 public void onClick(DialogInterface dialog, int which) {
  129.                     // TODO Auto-generated method stub
  130.                     finish();
  131.                 }
  132.             });
  133.             alertInstall.create().show();
  134.     }
  135.     @Override
  136.     protected void onDestroy() {
  137.         // TODO Auto-generated method stub
  138.         super.onDestroy();
  139.         if(mTTS!=null){
  140.             mTTS.shutdown();
  141.         }
  142.     }
  143.     @Override
  144.     protected void onPause() {
  145.         // TODO Auto-generated method stub
  146.         super.onPause();
  147.         if(mTTS != null)
  148.         {
  149.             mTTS.stop();
  150.         }
  151.     }
  152. }

基本和我们之前学过的类似,其中不同的地方有:


1 TTS 的初始化回调函数多了一个版本号参数 version,

public void onInit( int status, int version) ,

如果返回的版本号 version 等于 -1 ,则表明还没有安装 eyes-free 提供的 TTS Service Extended ,提示进行下载和安装。

// 提示安装所需的 TTS 数据

alertInstallEyesFreeTTSData();


 

主要就是弹出对话框进行提示,然后链接到 eyes-free 网站进行下载对应的 apk

// 弹出对话框提示安装所需的 TTS 数据

private void alertInstallEyesFreeTTSData()

{

Builder alertInstall = new AlertDialog.Builder( this )

.setTitle( 缺少需要的语音包 )

.setMessage( 下载安装缺少的语音包 )

.setPositiveButton( 确定 , new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

// TODO Auto-generated method stub

// 下载 eyes-free 的语音数据包

String ttsDataUrl = “http://eyes-free.googlecode.com/files/tts_3.1_market.apk” ;

Uri ttsDataUri = Uri.parse (ttsDataUrl);

Intent ttsIntent = new Intent(Intent. ACTION_VIEW , ttsDataUri);

startActivity(ttsIntent);

}

})

.setNegativeButton( 取消 , new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

// TODO Auto-generated method stub

finish();

}

});

alertInstall.create().show();

}


下载完进行安装,然后重新启动程序就可以运行。

2 )如果已经安装了,则可以进设置 TTS 引擎和需要合成的语言。

// 设置 TTS 引擎, com.google.tts eSpeak 支持的语言包含中文,使用 Android 系统默认的 pico 可以设置为 com.svox.pico

mTTS .setEngineByPackageNameExtended( “com.google.tts” );

int result = mTTS .setLanguage(Locale. CHINA );

// 设置发音语言


其中如果设置为 com.google.tts 则表示使用 eSpeak 引擎,其包括对中文语音合成的支持。如果设置为 com.svox.pico 则表示使用 Pico 引擎,实际效果就是使用 Android 自带的 Pico 的效果,不过只支持 5 中语言,不支持中文。


除了这两块,其他和我们之前的程序基本一样。

然后就可以运行程序。因为模拟器开始时没有安装需要的 eyes-free TTS Service Extended apk ,因此会弹出提示对话框,点击确定开始下载,下载完进行安装,如下图所示。

图3 安装eyes-free的TTS

安装完会在应用程序中看到对应的图标,并且在 TTS 的设置中也会增加 eSpeak TTS 一项,如下图所示:

图4 安装了eyes-free的TTS

安装完后就可以再次打开 NiHaoTTS 程序,这时会有个选择询问使用哪个 TTS ,选择第二项,然后就可以在输入框中输入中文来朗读了。

图5 选择TTS

不过经过简单测试就知道了,中文朗读的效果基本没法实际使用的。

文章对应的完整代码例子可以在这里下载:

http://download.csdn.net/source/3237373

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏