讯飞语音云Java SDK语音合成的使用支持文本分段合成

Comdex  2014-06-02  java

讯飞语音云的java sdk调用其实也挺简单的,直接调用那几个方法就行,但一开始使用时可能发现一些问题就如语音合成是有字数限制的,语音合成接口不能同时调用多次,只能在上一次结束后才能开始下一次的播放,要不每次只能播放最后一次调用方法的文本,贴部分代码出来给有需要看看,共同学习分享!只实现了播放和取消功能,暂停的接口调用好像总出错啊,只好等待新版java sdk了...

package notepad.voice;
 
import notepad.listener.VoiceNameListener;
import notepad.listener.VoiceSpeechListener;
 
import com.iflytek.speech.SpeechError;
import com.iflytek.speech.SynthesizerPlayer;
import com.iflytek.speech.SynthesizerPlayerListener;
 
public class VoiceRead implements SynthesizerPlayerListener{
 
 
    SynthesizerPlayer player ;
    //初始化语音合成对象
    public VoiceRead()
    {
        player = SynthesizerPlayer.createSynthesizerPlayer("appid=" + Version.getAppid());
    }
 
    public  void play()
    {
 
        SynthesizerPlayer player = SynthesizerPlayer.getSynthesizerPlayer();
            //设置发音人为小宇
            player.setVoiceName(VoiceNameListener.voice);
            //设置朗读速度为50
            player.setSpeed(50);
            //Setting.saveLogFile(LOG_LEVEL.none, null);
            //合成文本为VoiceSpeechListener.txt[VoiceSpeechListener.i]的分段文本,设置监听器为this
            player.playText(VoiceSpeechListener.txt[VoiceSpeechListener.i], null, this);
 
 
    }
 
    //取消合成
    public void cancel()
    {
 
        SynthesizerPlayer player = SynthesizerPlayer.getSynthesizerPlayer();
        player.cancel();
    }
 
    //在上一段语音结束时开始合成下一段,文本分段后存入字符数组
    @Override
    public void onEnd(SpeechError error) {   
 
     if(error==null&&VoiceSpeechListener.i<VoiceSpeechListener.txt.length-1)//arg0为null表示发送成功,发送下一段
       {
 
         SynthesizerPlayer player = SynthesizerPlayer.getSynthesizerPlayer();
         player.playText(VoiceSpeechListener.txt[++VoiceSpeechListener.i].trim(), null, this);
        }
 
 
    }
 
    @Override
    public void onBufferPercent(int percent, int beginPos, int endPos) {
 
    }
 
    @Override
    public void onPlayBegin() {
 
    }
 
    @Override
    public void onPlayPaused() {
 
    }
 
    @Override
    public void onPlayPercent(int percent, int beginPos, int endPos) {           
    }
 
    @Override
    public void onPlayResumed() {
 
    }
}