参考文档
https://www.cnblogs.com/lightsalt/archive/2011/10/19/2217628.html
开源的 TTS,使用 Python 来实现文本和语音的转换。
ekho 支持 python 动态库调用
1、ekho.cpp 中添加下列代码,能够不用创建对象而调用C++方法
extern "C" {
Ekho obj;
int d_setvoice(char *text)
{
return obj.setVoice(string(text));
}
int d_speak(char *text)
{
return obj.speak(string(text));
}
int d_stop(void)
{
return obj.stop();
}
int d_pause(void)
{
return obj.pause();
}
int d_resume(void)
{
return obj.resume();
}
void d_setspeed(int tempo_delta)
{
obj.setSpeed(tempo_delta);
}
void d_setpitch(int pitch_delta)
{
obj.setPitch(pitch_delta);
}
void d_setvolume(int volume_delta)
{
obj.setVolume(volume_delta);
}
void d_setrate(int rate_delta)
{
obj.setRate(rate_delta);
}
bool d_isspeaking()
{
return obj.isSpeaking();
}
}
2、在 ./MakeFile 和./libmusicxml/linux/MakeFile 的 CXXFLAG 中增加 -fPIC -shared
3、因为 -l 参数配置错误,make 报错时手动执行。7.6 版本最终生成动态库的时候也需要这行下面代码,否则生成的执行文件无法被 python 调用。
g++ -DHAVE_CONFIG_H -I. -I./utfcpp/source -I./sonic -pthread -lstdc++ -g -O2 -O0 -MT src/ekho-ekho.o -MD -MP -MF src/.deps/ekho-ekho.Tpo -c -o src/ekho-ekho.o -shared -fPIC `test -f 'src/ekho.cpp' || echo './'`src/ekho.cpp
g++ -I./utfcpp/source -I./sonic -g -O2 -O0 -o test_ekho src/test_ekho-test_ekho.o libekho.a ./libmusicxml/libmusicxml2.a -lespeak -lsndfile -lpthread -lpulse -lpulse-simple -lpulsecommon
g++ -I./utfcpp/source -I./sonic -pthread -g -O2 -O0 -o ekho src/ekho-ekho.o -fPIC -shared -lstdc++ libekho.a ./libmusicxml/libmusicxml2.a -lespeak -lsndfile -lpthread -pthread -lpulse -lpulse-simple -lpulsecommon
python 测试代码
import ctypes
from ctypes import *
so = ctypes.cdll.LoadLibrary
lib = so("./ekho")
speak=lib.d_speak
setvoice=lib.d_setvoice
speak.argtypes=[POINTER(c_char)]
setvoice.argtypes=[POINTER(c_char)]
STR_SPEAK=(c_char * 100)(*bytes("hello, thank you, how are you.",'utf8'))
cast(STR_SPEAK, POINTER(c_char))
speak(STR_SPEAK)
STR_VOICE=(c_char * 100)(*bytes("Mandarin",'utf8'))
cast(STR_VOICE, POINTER(c_char))
setvoice(STR_VOICE)
STR_SPEAK=(c_char * 100)(*bytes("原来你还在这里",'utf8'))
cast(STR_SPEAK, POINTER(c_char))
speak(STR_SPEAK)
STR_VOICE=(c_char * 100)(*bytes("Cantonese",'utf8'))
cast(STR_VOICE, POINTER(c_char))
setvoice(STR_VOICE)
STR_SPEAK=(c_char * 100)(*bytes("原来你还在这里",'utf8'))
cast(STR_SPEAK, POINTER(c_char))
speak(STR_SPEAK)