本文介绍如何移植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 函数在初始化时已经设置。