android 合成按照官网demo,各种成功,就是无法发声
小杨服装店 发布于2017-06 浏览:2483 回复:4
0
收藏

我使用的服务是:百度语音合成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);
}



复现步骤、现象及其他描述:授权成功,调用没有报错,就是无法发声。查找问题发现的日志中的错误。

收藏
点赞
0
个赞
共4条回复 最后由用户已被禁言回复于2022-04
#5冯定fengding回复于2018-06

哥们儿啊,求助啊,碰到这个问题你最后怎么解决的呢?

0
#4fujiayi1984回复于2017-06

小杨服装店:

问题已经解决,解决方案很简单,是.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

回复小杨服装店:


感谢您的分享

0
#3小杨服装店回复于2017-06

问题已经解决,解决方案很简单,是.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

0
#2fujiayi1984回复于2017-06

小杨服装店:

我使用的服务是:百度语音合成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是否有此问题,先测联网功能,谢谢

0
TOP
切换版块