帖子

【经验分享】java web 工程语音合成,无法生成音频文件

 关闭 [复制链接]

该用户从未签到

1202310  楼主| liangpeichang@c 发表于 2016-3-3 16:20:02 1#
我在做java 平台  web 工程 语音合成的时候,用main方法执行可以生成.pcm 的音频文件,但是当部署项目通过jsp 页面调用servlet  然后再调用语音合成的方法
时就无法再服务器端生成音频文件,main方法和servlet  都调用的同一个语音合成的方法。

评分

参与人数 1语点 -1 收起 理由
小柒 -1 http://bbs.xfyun.cn/forum.php?mod=viewth

查看全部评分

gxlin 发表于 2016-3-3 16:33:47
2#
按您说的情况,应该是有回调错误信息的,请把onComplete()回调错误码的信息发上来看一下。
    关于合成类和回调的详细说明,请使用浏览器,打开《MSC Reference Manual.html》,参考对应的类和接口的说明。
    关于部署时可能遇到的问题,请参考以下贴子:
    http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=9864
使用道具 举报 回复
 楼主| liangpeichang@c 发表于 2016-3-3 16:48:00
3#
你好,onComplete() 回调方法里面没有报错,代码正常运行
使用道具 举报 回复
gxlin 发表于 2016-3-3 17:02:21
4#
liangpeichang@c 发表于 2016-3-3 16:48
你好,onComplete() 回调方法里面没有报错,代码正常运行

请在onComplete里,进入和退出时,打印日志,并在进入时把 speecherror 参数打印一下,并且在里面如果speecherror非null时,把通过 getErrorCode() 获取到的值打印一下,类似:
  
  1. public void onCompleted(SpeechError error){
  2. System.out.println( "onCompleted enter: "+error );
  3.        
  4. if( null != error ){
  5.   System.out.println( "error: "+error.getErrorCode() );
  6. }
  7.        
  8. System.out.println( "onCompleted leave" );
  9. }
复制代码


然后把运行过程完整的控制台日志,以TXT附件或正文的形式发上来。

使用道具 举报 回复
gxlin 发表于 2016-3-3 17:11:54
5#
liangpeichang@c 发表于 2016-3-3 16:48
你好,onComplete() 回调方法里面没有报错,代码正常运行

另外,请通过 Setting.setShowLog( true ) 打开SDK的日志打印。此时日志会涉及APPID的信息,请通过邮件,发到 msp_support@iflytek.com,并附上此贴子的链接说明。
使用道具 举报 回复
 楼主| liangpeichang@c 发表于 2016-3-4 16:11:13
6#
gxlin 发表于 2016-3-3 17:11
另外,请通过 Setting.setShowLog( true ) 打开SDK的日志打印。此时日志会涉及APPID的信息,请通过邮件, ...

以下是输出的错误日志内容:
sart.................
end.................
onCompleted enter: 错误代码:20021
错误原因:引擎错误.
error: 20021
onCompleted leave

使用道具 举报 回复
 楼主| liangpeichang@c 发表于 2016-3-4 16:16:48
7#
sart.................
end.................
onCompleted enter: 错误代码:20021
错误原因:引擎错误.
error: 20021
onCompleted leave
三月 04, 2016 4:09:17 下午 org.apache.catalina.core.StandardContext reload
信息: Reloading Context with name [/wsSpeachServer] has started
三月 04, 2016 4:09:17 下午 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
严重: The web application [/wsSpeachServer] appears to have started a thread named [server-timer] but has failed to stop it. This is very likely to create a memory leak.
三月 04, 2016 4:09:17 下午 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
严重: The web application [/wsSpeachServer] appears to have started a thread named [Thread-2] but has failed to stop it. This is very likely to create a memory leak.
三月 04, 2016 4:09:17 下午 org.apache.catalina.startup.TldConfig execute
信息: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
发布成功
三月 04, 2016 4:09:17 下午 org.apache.catalina.core.StandardContext reload
信息: Reloading Context with name [/wsSpeachServer] is completed
sart.................
end.................
onCompleted enter: 错误代码:20021
错误原因:引擎错误.
error: 20021
onCompleted leave
三月 04, 2016 4:15:57 下午 org.apache.catalina.core.StandardContext reload
信息: Reloading Context with name [/wsSpeachServer] has started
三月 04, 2016 4:15:57 下午 org.apache.catalina.startup.TldConfig execute
信息: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
发布成功
三月 04, 2016 4:15:57 下午 org.apache.catalina.core.StandardContext reload
信息: Reloading Context with name [/wsSpeachServer] is completed
sart.................
<2016-03-04 16:16:21 949> [TRC] | SpeechLog | createSynthesizer enter
<2016-03-04 16:16:21 949> [TRC] | SpeechLog | SpeechSynthesizer constructor enter
<2016-03-04 16:16:21 949> [TRC] | SpeechLog | createSynthesizer leave
<2016-03-04 16:16:21 949> [TRC] | SpeechLog | setParameter enter, key: voice_name, value: 小燕
<2016-03-04 16:16:21 949> [TRC] | SpeechLog | setParameter leave: true
<2016-03-04 16:16:21 949> [TRC] | SpeechLog | setParameter enter, key: speed, value: 50
<2016-03-04 16:16:21 949> [TRC] | SpeechLog | setParameter leave: true
<2016-03-04 16:16:21 949> [TRC] | SpeechLog | setParameter enter, key: volume, value: 50
<2016-03-04 16:16:21 949> [TRC] | SpeechLog | setParameter leave: true
<2016-03-04 16:16:21 949> [TRC] | SpeechLog | setParameter enter, key: tts_audio_path, value: ./lpcf692cf5c-f373-4beb-b31b-78df661a3dfe.pcm
<2016-03-04 16:16:21 949> [TRC] | SpeechLog | setParameter leave: true
<2016-03-04 16:16:21 950> [TRC] | SpeechLog | startSpeaking enter, text: 科大讯飞,让世界聆听我们的声音, listener: com.chinanet.speach.TextToSpeechImpl$1@2d597309
<2016-03-04 16:16:21 962> [TRC] | SpeechLog | PcmBuffer per buf size: 1600
<2016-03-04 16:16:21 962> [TRC] | SpeechLog | reallocateBuffer enter
<2016-03-04 16:16:21 962> [TRC] | SpeechLog | reallocateBuffer size: 1920000
<2016-03-04 16:16:21 963> [TRC] | SpeechLog | reallocateBuffer leave
<2016-03-04 16:16:21 963> [TRC] | SpeechLog | minPlaySec:0
<2016-03-04 16:16:21 963> [TRC] | SpeechLog | curStatus=idle,setStatus=init
<2016-03-04 16:16:21 963> [TRC] | SpeechLog | setStatus success=init
<2016-03-04 16:16:21 964> [TRC] | SpeechLog | startSpeaking leave
end.................
<2016-03-04 16:16:21 965> [TRC] | SpeechLog | curStatus=init,setStatus=start
<2016-03-04 16:16:21 965> [TRC] | SpeechLog | setStatus success=start
<2016-03-04 16:16:21 966> [TRC] | SpeechLog | [composeTtsSessionParam]enter  params:vcn=小燕,speed=50,volume=50,tap=./lpcf692cf5c-f373-4beb-b31b-78df661a3dfe.pcm
<2016-03-04 16:16:21 966> [TRC] | SpeechLog | [QTTSSessionBegin]enter  params:auf=audio/L16;rate=16000,vcn=小燕,tte=unicode,speed=50,volume=50,aue=speex-wb,ssm=1,tap=./lpcf692cf5c-f373-4beb-b31b-78df661a3dfe.pcm
java.lang.UnsatisfiedLinkError: com.iflytek.msc.MSC.QTTSSessionBegin([BLcom/iflytek/msc/MSCSessionInfo;)[C
        at com.iflytek.msc.MSC.QTTSSessionBegin(Native Method)
        at com.iflytek.cloud.b.d.b.a(Unknown Source)
        at com.iflytek.cloud.b.d.c.else(Unknown Source)
        at com.iflytek.cloud.b.e.a$1.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
<2016-03-04 16:16:21 967> [TRC] | SpeechLog | class com.iflytek.cloud.b.d.c occur Error = 错误代码:20021
错误原因:引擎错误.
<2016-03-04 16:16:21 967> [TRC] | SpeechLog | QTts Error Code = 20021
<2016-03-04 16:16:21 967> [TRC] | SpeechLog | curStatus=start,setStatus=exited
<2016-03-04 16:16:21 967> [TRC] | SpeechLog | setStatus success=exited
<2016-03-04 16:16:21 967> [TRC] | SpeechLog | MscSynthesizer#onEnd
onCompleted enter: 错误代码:20021
错误原因:引擎错误.
error: 20021
onCompleted leave
使用道具 举报 回复
gxlin 发表于 2016-3-7 07:47:47
8#
liangpeichang@c 发表于 2016-3-4 16:16
sart.................
end.................
onCompleted enter: 错误代码:20021

根据您的控制台日志,你的项目中20021的错误,正是2楼回复的链接中的贴子的情况。请确认以下两个,并参考该贴子的回复:1,是否有在createSynthesizer前,调用SpeechUtility.createUtility,详情请参考demo, PDF新手指南,HTML的API说明文档;
2,共享库的位置和目录设置,是否正确,评情请参考2楼接链的贴子;
使用道具 举报 回复
 楼主| liangpeichang@c 发表于 2016-3-7 09:39:34
9#
gxlin 发表于 2016-3-7 07:47
根据您的控制台日志,你的项目中20021的错误,正是2楼回复的链接中的贴子的情况。请确认以下两个,并参考 ...

你好:  图片里有我上传的共享库的图片请查看,另外下面的代码是我正在运行中的代码请查看。
按照你的描述没有找到问题所在,请查看。





@Override
public byte[] getSpeechByText()throws Exception {
  SpeechUtility.createUtility("appid="+Constant.APPID);
  Setting.setShowLog(true);
  // add by lpc  end
  System.out.println("sart.................");
  SpeechSynthesizer mTts= SpeechSynthesizer.createSynthesizer( );
  //2.合成参数设置,详见《iFlytek MSC Reference Manual》SpeechSynthesizer 类
  mTts.setParameter(SpeechConstant.VOICE_NAME, Constant.VOICE);//设置发音人
  mTts.setParameter(SpeechConstant.SPEED, Constant.SPEED);//设置语速范围 0~100
  mTts.setParameter(SpeechConstant.VOLUME, Constant.VOLUME);//设置音量,范围 0~100
  //设置合成音频保存位置(可自定义保存位置) ,保存在“./iflytek.pcm”
  //如果不需要保存合成音频,注释该行代码
  String audioPath  ="./lpc" +UUID.randomUUID().toString()+".pcm";
  mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, audioPath);
  //合成监听器
     SynthesizerListener  mSynListener = new SynthesizerListener(){
  //会话结束回调接口,没有错误时,error为null
  public void onCompleted(SpeechError error) {
   System.out.println( "onCompleted enter: "+error );
   if( null != error ){
     System.out.println( "error: "+error.getErrorCode() );
   }
   System.out.println( "onCompleted leave" );
  }
  //缓冲进度回调
  //percent为缓冲进度0~100, beginPos为缓冲音频在文本中开始位置, endPos表示缓冲音频在
  public void onBufferProgress(int percent, int beginPos, int endPos, String info) {}
  //开始播放
  public void onSpeakBegin() {}
  //暂停播放
  public void onSpeakPaused() {}
  //播放进度回调
  //percent为播放进度0~100,beginPos为播放音频在文本中开始位置,endPos表示播放音频在
  public void onSpeakProgress(int percent, int beginPos, int endPos) {}
  //恢复播放回调接口
  public void onSpeakResumed() {}
  };
  mTts.startSpeaking("科大讯飞,让世界聆听我们的声音", mSynListener);
  WavWriter myWavWriter = null;
//  File  myfile = new File(audioPath);
//  while(true){ //循环条件中直接为TRUE
//   if(myfile.exists()){ //直到符合条件后跳出本循环 否则一直循环下去
//    break;
//   }
//  }
//  try {
//   myWavWriter = new WavWriter(myfile, 16000);
//  } catch (IOException e) {
//   e.printStackTrace();
//  }
//  try {
//   myWavWriter.writeHeader();
//  } catch (IOException e) {
//   e.printStackTrace();
//  }
//  try {
//   myWavWriter.close();
//  } catch (IOException e) {
//   e.printStackTrace();
//  }
//   FileInputStream in= new FileInputStream(audioPath);  
//   ByteArrayOutputStream out=new ByteArrayOutputStream(1024);  
//         byte[] temp=new byte[1024];  
//         int size=0;  
//         while((size=in.read(temp))!=-1)  
//         {  
//           out.write(temp,0,size);  
//         }  
//         in.close();  
//         byte[] bytes=out.toByteArray();  
         System.out.println("end.................");
         return null;  
      
}

共享库截图.png
使用道具 举报 回复
 楼主| liangpeichang@c 发表于 2016-3-8 09:48:45
10#
gxlin 发表于 2016-3-7 07:47
根据您的控制台日志,你的项目中20021的错误,正是2楼回复的链接中的贴子的情况。请确认以下两个,并参考 ...

共享截图和我的代码已经贴出来,请看下到底是什么原因导致的,现在无法进行下去了。
使用道具 举报 回复