Text To Speech 总结

前言

Android 1.6 加入了文字合成语音的功能,但是 Google 提供的语言库不支持中文。本篇文章总结了几个支持中文的语言库。

TextToSpeech

在介绍其他语言库之前,先介绍一下 Android 的文字合成语言的 API。因为即使使用其他的语言库,想要完成文字合成语言依然要使用 Android 的 API。以下代码取自 Android 官方 ApiDemos 中的 TextToSpeechActivity。

    private void initializeEngine() {
      mTts = new TextToSpeech(this, mInitListener);
    }

获取 TextToSpeech 实例

通过 TextToSpeech(Context context, TextToSpeech.OnInitListener listener) 构造函数获取 TextToSpeech 实例。因此要实现 TextToSpeech.OnInitListener 接口,获取实例并作为参数传递给上述构造函数。

实现 TextToSpeech.OnInitListener

    private final TextToSpeech.OnInitListener mInitListener = new TextToSpeech.OnInitListener() {
      @Override
      public void onInit(int status) {
        // status can be either TextToSpeech.SUCCESS or TextToSpeech.ERROR.
        if (status == TextToSpeech.SUCCESS) {
          // Set preferred language to US english.
          // Note that a language may not be available, and the result will indicate this.
          int result = mTts.setLanguage(Locale.CHINESE);
          // Try this someday for some interesting results.
          // int result mTts.setLanguage(Locale.FRANCE);
          if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
            // Lanuage data is missing or the language is not supported.
            Log.e(TAG, "Language is not available.");
          } else {
            // Check the documentation for other possible result codes.
            // For example, the language may be available for the locale,
            // but not for the specified country and variant.

            // The TTS engine has been successfully initialized.
            // Allow the user to press the button for the app to speak again.
            mAgainButton.setEnabled(true);

          }
        } else {
          // Initialization failed.
          Log.e(TAG, "Could not initialize TextToSpeech.");
        }
      }
    };

调用 speak()

获取到 TextToSpeech 的实例后,调用 speak(String text, int queueMode, HashMap params) 函数实现文字转换语音。

    mTts.speak("你好", TextToSpeech.QUEUE_FLUSH,  // Drop all pending entries in the playback queue.
        null);

销毁

退出时记得清除资源

     @Override public void onDestroy() {
      // Don't forget to shutdown!
      if (mTts != null) {
        mTts.stop();
        mTts.shutdown();
      }

      super.onDestroy();
    }

科大讯飞

科大讯飞的语音合成应该是国内比较先进的吧。貌似魅族和小米的系统就集成了科大讯飞的 TTS。这里下载讯飞的 SDK。这里是讯飞的集成文档。

注意:在运行讯飞的 demo 的之前,要把 res->tts 目录下的几个 .jet 文件拷贝到 sample 的 assets->tts 目录下。否则使用离线合成的时候回出现“本地引擎错误 24001” 的提示。

手说 TTS

手说 TTS 说明

手说TTS开发指南

要想使用手说 TTS 实现语音合成,必须先安装 shoushuoTTS.apk

讯飞和手说 TTS 实现语音合成时都是用的他们自己的 API。下面介绍两个和 Android API 结合实现语音合成的语音库。

Ekho

Ekho 的使用和简单,在这里下载 Ekho 的语音库安装包安装,并在设置中把 Ekho TTs Cantonese 设置为首选引擎。然后利用 TextToSpeech 就可以实现语音合成了。

eyes-free

eyes-free 是在 eSpeak 基础上的一个开源的语音合成库。按照这里的说明编译此库,然后才能使用。

注意:此库里的 TextToSpeech 并不是 Android API 里的 TextToSpeech。而是 eyes-free 库封装的。另外 eyes-free 在 5.0 之上的机器里是无法使用的。测试设备:MX4。

结语

科大讯飞在线合成免费,离线收费;但是效果是最好的,集成比较简单。所以推荐科大讯飞。其他的语音库,需要另外安装 APK,从而安装其对应的语音库数据。其中 eyes-free 和 Ekho 可以集成在应用内,不需要另外安装 APK。但是首次安装时,依然有安装语音库的过程。

你可能感兴趣的:(Android,Android)