我使用的服务是:百度语音合成Android版
调用的接口是:语音合成相关的接口
参数设置情况:参数全部设置正常
开发平台和机型:预装Android6.0版本的安装手机及pos机
SDK版本号:最新版本
代码或日志截图(上传截图能帮助您更快解决问题):
代码中的"XXXX"是我的正确参数。
06-23 11:18:34.942 24282-24493/ywh.pos E/art: No implementation found for int com.baidu.tts.jni.EmbeddedSynthesizerEngine.bdTTSGetLicense(android.content.Context, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) (tried Java_com_baidu_tts_jni_EmbeddedSynthesizerEngine_bdTTSGetLicense and Java_com_baidu_tts_jni_EmbeddedSynthesizerEngine_bdTTSGetLicense__Landroid_content_Context_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2)
private String mSampleDirPath;
private static final String SAMPLE_DIR_NAME = "baiduTTS";
private static final String SPEECH_FEMALE_MODEL_NAME = "bd_etts_speech_female.dat";
private static final String SPEECH_MALE_MODEL_NAME = "bd_etts_speech_male.dat";
private static final String TEXT_MODEL_NAME = "bd_etts_text.dat";
private static final String LICENSE_FILE_NAME = "temp_license_2017-06-22";
private static BaiduVoice instance;
private static Context context;
// 语音合成客户端
private SpeechSynthesizer mSpeechSynthesizer;
public void speek(String text, String utteranceId){
mSpeechSynthesizer.speak(getSpeechSynthesizeBag(text,utteranceId));
}
private SpeechSynthesizeBag getSpeechSynthesizeBag(String text, String utteranceId) {
SpeechSynthesizeBag speechSynthesizeBag = new SpeechSynthesizeBag();
//需要合成的文本text的长度不能超过1024个GBK字节。
speechSynthesizeBag.setText(text);
speechSynthesizeBag.setUtteranceId(utteranceId);
return speechSynthesizeBag;
}
// 初始化语音合成客户端并启动
public void startTTS() {
initialEnv();
// 获取语音合成对象实例
mSpeechSynthesizer = SpeechSynthesizer.getInstance();
// 设置context
mSpeechSynthesizer.setContext(context);
// 设置语音合成状态监听器
mSpeechSynthesizer.setSpeechSynthesizerListener(this);
// 设置在线语音合成授权,需要填入从百度语音官网申请的api_key和secret_key
mSpeechSynthesizer.setApiKey("XXXX", "XXXX"); // 设置离线语音合成授权,需要填入从百度语音官网申请的app_id
mSpeechSynthesizer.setAppId("XXXX"); // 设置语音合成文本模型文件
// 文本模型文件路径 (离线引擎使用)
this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_TEXT_MODEL_FILE, mSampleDirPath + "/"
+ TEXT_MODEL_NAME);
// 声学模型文件路径 (离线引擎使用)
this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_SPEECH_MODEL_FILE, mSampleDirPath + "/"
+ SPEECH_FEMALE_MODEL_NAME);
// 本地授权文件路径,如未设置将使用默认路径.设置临时授权文件路径,LICENCE_FILE_NAME请替换成临时授权文件的实际路径,仅在使用临时license文件时需要进行设置,如果在[应用管理]中开通了正式离线授权,不需要设置该参数,建议将该行代码删除(离线引擎)
// 如果合成结果出现临时授权文件将要到期的提示,说明使用了临时授权文件,请删除临时授权即可。
// this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_LICENCE_FILE, mSampleDirPath + "/"
// + LICENSE_FILE_NAME);
// 设置语音合成声音授权文件
// mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_LICENCE_FILE, path + "temp_license_2017-06-22");
// 获取语音合成授权信息
AuthInfo authInfo = mSpeechSynthesizer.auth(TtsMode.MIX);
// 判断授权信息是否正确,如果正确则初始化语音合成器并开始语音合成,如果失败则做错误处理
if (authInfo.isSuccess()) {
mSpeechSynthesizer.initTts(TtsMode.MIX);
int i = mSpeechSynthesizer.speak("百度语音合成示例程序正在运行");
Log.e(TAG,"" + i);
} else {
// 授权失败
}
}
private void initialEnv() {
if (mSampleDirPath == null) {
String sdcardPath = Environment.getExternalStorageDirectory().toString();
mSampleDirPath = sdcardPath + "/" + SAMPLE_DIR_NAME;
}
makeDir(mSampleDirPath);
copyFromAssetsToSdcard(false, SPEECH_FEMALE_MODEL_NAME, mSampleDirPath + "/" + SPEECH_FEMALE_MODEL_NAME);
copyFromAssetsToSdcard(false, SPEECH_MALE_MODEL_NAME, mSampleDirPath + "/" + SPEECH_MALE_MODEL_NAME);
copyFromAssetsToSdcard(false, TEXT_MODEL_NAME, mSampleDirPath + "/" + TEXT_MODEL_NAME);
copyFromAssetsToSdcard(false, LICENSE_FILE_NAME, mSampleDirPath + "/" + LICENSE_FILE_NAME);
}
private void makeDir(String dirPath) {
File file = new File(dirPath);
if (!file.exists()) {
file.mkdirs();
}
}
/**
* 将sample工程需要的资源文件拷贝到SD卡中使用(授权文件为临时授权文件,请注册正式授权)
*
* @param isCover 是否覆盖已存在的目标文件
* @param source
* @param dest
*/
private void copyFromAssetsToSdcard(boolean isCover, String source, String dest) {
File file = new File(dest);
if (isCover || (!isCover && !file.exists())) {
InputStream is = null;
FileOutputStream fos = null;
try {
is = context.getResources().getAssets().open("data/" + source);
String path = dest;
fos = new FileOutputStream(path);
byte[] buffer = new byte[1024];
int size = 0;
while ((size = is.read(buffer, 0, 1024)) >= 0) {
fos.write(buffer, 0, size);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
if (is != null) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@Override
public void onSynthesizeStart(String s) {
Log.i(TAG,"onSynthesizeStart " + s);
}
@Override
public void onSynthesizeDataArrived(String s, byte[] bytes, int i) {
Log.i(TAG,"onSynthesizeDataArrived " + s);
}
@Override
public void onSynthesizeFinish(String s) {
Log.i(TAG,"onSynthesizeFinish " + s);
}
@Override
public void onSpeechStart(String s) {
Log.i(TAG,"onSpeechStart " + s);
}
@Override
public void onSpeechProgressChanged(String s, int i) {
Log.i(TAG,"onSpeechProgressChanged " + s);
}
@Override
public void onSpeechFinish(String s) {
Log.i(TAG,"onSpeechFinish " + s);
}
@Override
public void onError(String s, SpeechError speechError) {
Log.i(TAG,"onError " + s + " speechError " + speechError);
}
复现步骤、现象及其他描述:授权成功,调用没有报错,就是无法发声。查找问题发现的日志中的错误。
收藏
点赞
0
个赞
请登录后评论
TOP
切换版块
哥们儿啊,求助啊,碰到这个问题你最后怎么解决的呢?
小杨服装店:
问题已经解决,解决方案很简单,是.so文件链接的问题
sourceSets {
main {
jniLibs.srcDirs = ['libs']}
}
最初使用的时候这种方案,但实际这种方案链接不到。
后改成了下面的方案:
task nativeLibsToJar(type: Zip, description: "create a jar archive of the native libs") {destinationDir file("$projectDir/libs")
baseName "Native_Libs2"
extension "jar"
from fileTree(dir: "libs", include: "**/*.so")
into "lib"
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn(nativeLibsToJar)
}
这种方案正常。
开发工具为Android stutio 2.3.2
回复小杨服装店:
感谢您的分享
问题已经解决,解决方案很简单,是.so文件链接的问题
sourceSets {
main {
jniLibs.srcDirs = ['libs']}
}
最初使用的时候这种方案,但实际这种方案链接不到。
后改成了下面的方案:
task nativeLibsToJar(type: Zip, description: "create a jar archive of the native libs") {destinationDir file("$projectDir/libs")
baseName "Native_Libs2"
extension "jar"
from fileTree(dir: "libs", include: "**/*.so")
into "lib"
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn(nativeLibsToJar)
}
这种方案正常。
开发工具为Android stutio 2.3.2
小杨服装店:
我使用的服务是:百度语音合成Android版
调用的接口是:语音合成相关的接口
参数设置情况:参数全部设置正常
开发平台和机型:预装Android6.0版本的安装手机及pos机
SDK版本号:最新版本
代码或日志截图(上传截图能帮助您更快解决问题):
代码中的"XXXX"是我的正确参数。
06-23 11:18:34.942 24282-24493/ywh.pos E/art: No implementation found for int com.baidu.tts.jni.EmbeddedSynthesizerEngine.bdTTSGetLicense(android.content.Context, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) (tried Java_com_baidu_tts_jni_EmbeddedSynthesizerEngine_bdTTSGetLicense and Java_com_baidu_tts_jni_EmbeddedSynthesizerEngine_bdTTSGetLicense__Landroid_content_Context_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2)
private static String TAG = "BaiduVoice";private String mSampleDirPath;
private static final String SAMPLE_DIR_NAME = "baiduTTS";
private static final String SPEECH_FEMALE_MODEL_NAME = "bd_etts_speech_female.dat";
private static final String SPEECH_MALE_MODEL_NAME = "bd_etts_speech_male.dat";
private static final String TEXT_MODEL_NAME = "bd_etts_text.dat";
private static final String LICENSE_FILE_NAME = "temp_license_2017-06-22";
private static BaiduVoice instance;
private static Context context;
// 语音合成客户端
private SpeechSynthesizer mSpeechSynthesizer;
public void speek(String text, String utteranceId){
mSpeechSynthesizer.speak(getSpeechSynthesizeBag(text,utteranceId));
}
private SpeechSynthesizeBag getSpeechSynthesizeBag(String text, String utteranceId) {
SpeechSynthesizeBag speechSynthesizeBag = new SpeechSynthesizeBag();
//需要合成的文本text的长度不能超过1024个GBK字节。
speechSynthesizeBag.setText(text);
speechSynthesizeBag.setUtteranceId(utteranceId);
return speechSynthesizeBag;
}
// 初始化语音合成客户端并启动
public void startTTS() {
initialEnv();
// 获取语音合成对象实例
mSpeechSynthesizer = SpeechSynthesizer.getInstance();
// 设置context
mSpeechSynthesizer.setContext(context);
// 设置语音合成状态监听器
mSpeechSynthesizer.setSpeechSynthesizerListener(this);
// 设置在线语音合成授权,需要填入从百度语音官网申请的api_key和secret_key
mSpeechSynthesizer.setApiKey("XXXX", "XXXX"); // 设置离线语音合成授权,需要填入从百度语音官网申请的app_id
mSpeechSynthesizer.setAppId("XXXX"); // 设置语音合成文本模型文件
// 文本模型文件路径 (离线引擎使用)
this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_TEXT_MODEL_FILE, mSampleDirPath + "/"
+ TEXT_MODEL_NAME);
// 声学模型文件路径 (离线引擎使用)
this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_SPEECH_MODEL_FILE, mSampleDirPath + "/"
+ SPEECH_FEMALE_MODEL_NAME);
// 本地授权文件路径,如未设置将使用默认路径.设置临时授权文件路径,LICENCE_FILE_NAME请替换成临时授权文件的实际路径,仅在使用临时license文件时需要进行设置,如果在[应用管理]中开通了正式离线授权,不需要设置该参数,建议将该行代码删除(离线引擎)
// 如果合成结果出现临时授权文件将要到期的提示,说明使用了临时授权文件,请删除临时授权即可。
// this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_LICENCE_FILE, mSampleDirPath + "/"
// + LICENSE_FILE_NAME);
// 设置语音合成声音授权文件
// mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_LICENCE_FILE, path + "temp_license_2017-06-22");
// 获取语音合成授权信息
AuthInfo authInfo = mSpeechSynthesizer.auth(TtsMode.MIX);
// 判断授权信息是否正确,如果正确则初始化语音合成器并开始语音合成,如果失败则做错误处理
if (authInfo.isSuccess()) {
mSpeechSynthesizer.initTts(TtsMode.MIX);
int i = mSpeechSynthesizer.speak("百度语音合成示例程序正在运行");
Log.e(TAG,"" + i);
} else {
// 授权失败
}
}
private void initialEnv() {
if (mSampleDirPath == null) {
String sdcardPath = Environment.getExternalStorageDirectory().toString();
mSampleDirPath = sdcardPath + "/" + SAMPLE_DIR_NAME;
}
makeDir(mSampleDirPath);
copyFromAssetsToSdcard(false, SPEECH_FEMALE_MODEL_NAME, mSampleDirPath + "/" + SPEECH_FEMALE_MODEL_NAME);
copyFromAssetsToSdcard(false, SPEECH_MALE_MODEL_NAME, mSampleDirPath + "/" + SPEECH_MALE_MODEL_NAME);
copyFromAssetsToSdcard(false, TEXT_MODEL_NAME, mSampleDirPath + "/" + TEXT_MODEL_NAME);
copyFromAssetsToSdcard(false, LICENSE_FILE_NAME, mSampleDirPath + "/" + LICENSE_FILE_NAME);
}
private void makeDir(String dirPath) {
File file = new File(dirPath);
if (!file.exists()) {
file.mkdirs();
}
}
/**
* 将sample工程需要的资源文件拷贝到SD卡中使用(授权文件为临时授权文件,请注册正式授权)
*
* @param isCover 是否覆盖已存在的目标文件
* @param source
* @param dest
*/
private void copyFromAssetsToSdcard(boolean isCover, String source, String dest) {
File file = new File(dest);
if (isCover || (!isCover && !file.exists())) {
InputStream is = null;
FileOutputStream fos = null;
try {
is = context.getResources().getAssets().open("data/" + source);
String path = dest;
fos = new FileOutputStream(path);
byte[] buffer = new byte[1024];
int size = 0;
while ((size = is.read(buffer, 0, 1024)) >= 0) {
fos.write(buffer, 0, size);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
if (is != null) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@Override
public void onSynthesizeStart(String s) {
Log.i(TAG,"onSynthesizeStart " + s);
}
@Override
public void onSynthesizeDataArrived(String s, byte[] bytes, int i) {
Log.i(TAG,"onSynthesizeDataArrived " + s);
}
@Override
public void onSynthesizeFinish(String s) {
Log.i(TAG,"onSynthesizeFinish " + s);
}
@Override
public void onSpeechStart(String s) {
Log.i(TAG,"onSpeechStart " + s);
}
@Override
public void onSpeechProgressChanged(String s, int i) {
Log.i(TAG,"onSpeechProgressChanged " + s);
}
@Override
public void onSpeechFinish(String s) {
Log.i(TAG,"onSpeechFinish " + s);
}
@Override
public void onError(String s, SpeechError speechError) {
Log.i(TAG,"onError " + s + " speechError " + speechError);
}
复现步骤、现象及其他描述:授权成功,调用没有报错,就是无法发声。查找问题发现的日志中的错误。
回复小杨服装店:请您测试下我们的demo是否有此问题,先测联网功能,谢谢