用espeak 做Android TTS

本文介绍如何移植espeak到Android平台及其编译和应用。下文全部基于主机为 Ubuntu10.04.

前提:

1) 已经安装ndk


1、 编译espeak

下载espeak 源码:

如果没有安装git 先安装 ,很简单,sudo apt-get install git

终端运行: git clone https://github.com/rhdunn/espeak.git

然后,git checkout android,切换到Android分支


2、下载gradle

要求2.2以上版本,地址:https://downloads.gradle.org/distributions/gradle-2.9-bin.zip

然后解压。


3、安装 libtool 和wxWidgets

运行命令:

sudo apt-get install make autoconf automake libtool pkg-config
sudo apt-get install libwxgtk2.8-dev

4、 编译

在espeak下创建空文件,espeak.sh ,然后把下面内容复制进去,保存。

</pre><pre class="javascript" name="code">#!/bin/sh

SOURCE_DIR=$1
TARGET_DIR=$(pwd)
NDK_ROOT=/opt/android-18-toolchain/sysroot
build_one()
{
${SOURCE_DIR}/configure \
--srcdir=${SOURCE_DIR} \
--with-extdict-zh=yes \
--with-extdict-zhy=yes \
--prefix=${TARGET_DIR}/build \
--with-sysroot=${NDK_ROOT} \
--with-gradle=/mnt/work/git/Android/gradle-2.9-bin/gradle-2.9/bin/gradle
}

build_one

在运行脚本之前查看 PATH 变量是否已经包含了ndk的根目录,如果不在,那么需要加进去。命令:

export NDK_HOME=<path to ndk home>

export PATH=$PATH:$NDK_HOME

否则找不到ndk编译器
5、运行脚本

chmod 777 espeak.sh

./espeak.sh  .

注意./espeak.sh后面的点,表示当前目录


6、 运行make

7、 运行make install


完成。如果在编译打包成apk时失败也不要紧,一般可能是ndk版本低了或gradle 版本低了,或路径错误,在脚本里改下即可。

如果你用的是ndk 开发,那么只需要编译出了 libespeak.so 即大功告成。在 espeak/android/libs/armeabi-v7a/ 下。 espeak_lib.h 在espeak/src 下找.然后就可以直接用c语言来调用了。


8、 运用

初始化部分:

int rate=espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS,0,"/sdcard",0);
    if(rate==-1){
        LOGE("ESPEAK  initialize failed");
    }else{
        smpl_rate=rate;
    }
    LOGI("espeak callback set");
    espeak_SetSynthCallback(TextToSpeech::TTS_Synth_CB);   // 设置回调函数
            LOGI("espeak voice");
    espeak_ERROR erro=espeak_SetVoiceByName("zh-f2");
     LOGI("espeak voice erro=%d",erro);
     espeak_VOICE *voice=espeak_GetCurrentVoice();

     LOGI("name=%s,languages=%s,iden=%s,gender=%d,age=%d",
          voice->name,voice->languages,voice->identifier,voice->gender,voice->age);
     voice->age=23;
     voice->gender=2;
     espeak_SetVoiceByProperties(voice);

text to speak 部分:

espeak_Synth((const void *)src_text,strlen(src_text),0,POS_SENTENCE,0,espeakCHARS_AUTO,NULL,this);
    espeak_ERROR erro=espeak_Synchronize();
    if(EE_OK !=erro){
        LOGE("synth erro=%d",erro);
    }


回调播放部分:播放器需要自己处理,回调函数只是产生了pcm 的数据

int TextToSpeech::TTS_Synth_CB(short *data, int len, espeak_EVENT *e)
{
    LOGI("synth len=%d",len);
    if(data==NULL)
        return 1;
    if(len>0){
        TextToSpeech *ttsHandle=static_cast<TextToSpeech*>(e->user_data);
        ttsHandle->handleVoiceData((void*)data,len*2
                                  );
    }
    return 0;

}

返回0表示继续,返回1表示结束。TTS_Synth_CB 函数在初始化时已经设置。

 



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值