讯飞在线语音TTS队列策略

有一个需求,需要把收到的交易信息推送朗诵出来。由于android没有自带的中文tts,所以采用第三方sdk,有两种方式,一种是离线方式,这种方式还需要下载讯飞的另外一个app,麻烦且不合适。第二种为在线方式语音合成,这里采用第二种。你会发现,如果交易信息很频繁的话,一段话还没读完,另一端话就开始了,而且讯飞这块貌似没做好,需要我们上层封装。

import android.content.Context;
import android.os.Bundle;
import android.util.Log;

import com.iflytek.cloud.ErrorCode;
import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechSynthesizer;
import com.iflytek.cloud.SpeechUtility;
import com.iflytek.cloud.SynthesizerListener;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 2017/1/9.
 */
public class TTSSpeech {
    private static String TAG = TTSSpeech.class.getSimpleName();

    private static class SingletonHolder {
        private static final TTSSpeech INSTANCE = new TTSSpeech();
    }

    public static final TTSSpeech getInstance(Context context) {
        if (!SingletonHolder.INSTANCE.isInit)
            SingletonHolder.INSTANCE.init(context);
        return SingletonHolder.INSTANCE;
    }

    // 语音合成对象
    private SpeechSynthesizer mTts;
    // 默认发音人
    private String voicer = "xiaoyan";
    private boolean isInit;

    private List queue;

    public TTSSpeech() {
    }

    public void init(Context context) {
        // 注意: appid 必须和下载的SDK保持一致,否则会出现10407错误
        SpeechUtility.createUtility(context, "appid=5872e9a8");
        // 初始化合成对象
        mTts = SpeechSynthesizer.createSynthesizer(context, mTtsInitListener);
        queue = new ArrayList();
        setParam();
        isInit = true;
    }

    /**
     * 初始化监听。
     */
    private InitListener mTtsInitListener = new InitListener() {
        @Override
        public void onInit(int code) {
            Log.d(TAG, "InitListener init() code = " + code);
            if (code != ErrorCode.SUCCESS) {

            } else {
                // 初始化成功,之后可以调用startSpeaking方法
                // 注:有的开发者在onCreate方法中创建完合成对象之后马上就调用startSpeaking进行合成,
                // 正确的做法是将onCreate中的startSpeaking调用移至这里
            }
        }
    };

    public void say(String content) {
        queue.add(content);
        if (!mTts.isSpeaking() && queue.size() == 1) {
            Log.d(TAG, "-------------->say:" + content);
            int code = mTts.startSpeaking(content, mTtsListener);
            if (code != ErrorCode.SUCCESS) {
                Log.e(TAG, "语音合成失败,错误码: " + code + " content:" + content);
            }
        }
    }

    /**
     * 合成回调监听。
     */
    private SynthesizerListener mTtsListener = new SynthesizerListener() {

        @Override
        public void onSpeakBegin() {
            Log.d(TAG, "-------------->onSpeakBegin");
        }

        @Override
        public void onSpeakPaused() {
            Log.d(TAG, "-------------->onSpeakPaused");
        }

        @Override
        public void onSpeakResumed() {
        }


        @Override
        public void onBufferProgress(int percent, int beginPos, int endPos,
                                     String info) {
            // 合成进度
        }

        @Override
        public void onSpeakProgress(int percent, int beginPos, int endPos) {
            // 播放进度
        }

        @Override
        public void onCompleted(SpeechError speechError) {
            Log.d(TAG, "-------------->onCompleted");
            if (queue != null && queue.size() > 0) {
                queue.remove(0);
                if (queue.size() > 0) {
                    int code = mTts.startSpeaking((String) queue.get(0), mTtsListener);
                    if (code != ErrorCode.SUCCESS) {
                        Log.e(TAG, "语音合成失败,错误码: " + code + " content:" + queue.get(0));
                    }
                }
            }
        }

        @Override
        public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
            Log.d(TAG, "-------------->onEvent");
            // 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因
            // 若使用本地能力,会话id为null
            //	if (SpeechEvent.EVENT_SESSION_ID == eventType) {
            //		String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
            //		Log.d(TAG, "session id =" + sid);
            //	}
        }
    };

    private void setParam() {
        // 清空参数
        mTts.setParameter(SpeechConstant.PARAMS, null);
        // 根据合成引擎设置相应参数
        mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
        // 设置在线合成发音人
        mTts.setParameter(SpeechConstant.VOICE_NAME, voicer);
        //设置合成语速
        mTts.setParameter(SpeechConstant.SPEED, "50");
        //设置合成音调
        mTts.setParameter(SpeechConstant.PITCH, "50");
        //设置合成音量
        mTts.setParameter(SpeechConstant.VOLUME, "50");
        //设置播放器音频流类型
        mTts.setParameter(SpeechConstant.STREAM_TYPE, "3");
        // 设置播放合成音频打断音乐播放,默认为true
        mTts.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");

    }

    public void destory() {
        queue.clear();
        mTts.stopSpeaking();
        // 退出时释放连接
        mTts.destroy();
    }
}


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TTSSpeech.getInstance(this).say("我是长江1号");
        TTSSpeech.getInstance(this).say("我是长江2号");
        TTSSpeech.getInstance(this).say("我是长江3号");
        TTSSpeech.getInstance(this).say("我是长江4号");
    }
}

队列方式很简单,新建一个队列实例,先进先出,后进后出。。。

直接用List作为队列,读完就移除第一个,如果还有就继续读。。。

可能有个问题是,如果有其他因素(如突然来电)打断队列,队列就会中断。不知道会不会等因素完后继续播报。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: TTS是文本到语音的缩写,是一种将文本转化为人工语音的技术。语音引擎是一种常用的TTS引擎,具有较高的语音合成质量和性能。 语音引擎具有丰富的功能和设置选项。首先,它支持多种语言的语音合成,如中文、英文、日文等。用户可以根据需要选择不同的语种。 其次,语音引擎还支持设置不同的发音风格。用户可以选择标准的自然发音,也可以选择欢快、稳重等不同风格的语音合成效果。 此外,语音引擎还提供了音量、语速、音高等参数的设置选项。用户可以根据自己的需求调整这些参数,以获得理想的语音合成效果。 在使用语音引擎进行TTS设置时,用户还可以选择不同的发音人。语音引擎提供了多个发音人选项,如男声、女声、儿童声等。用户可以根据需要选择适合的发音人,以使语音合成更加贴近实际需求。 总的来说,语音引擎是一款功能强大的TTS引擎,用户可以通过设置不同的参数和选项,定制出符合自己需求的语音合成效果。无论是在教育、无障碍服务、人机对话等领域,语音引擎都能提供高质量的语音合成服务。 ### 回答2: TTS设置是指在语音引擎中进行的相关设置。语音引擎是一种基于人工智能技术的语音合成技术,可以将文字转换为自然流畅的语音输出。 首先,我们可以设置发音人的选择。语音引擎提供了多种发音人的选择,包括男声、女声、童声等不同类型的声音。用户可以根据自己的需求和喜好选择合适的发音人。 其次,我们还可以设置语速和音量。语速决定了语音合成的速度,用户可以根据自己的理解能力和听力习惯进行调整。音量则决定了语音输出的音量大小,用户可以根据具体情况进行合理的设置。 此外,语音引擎还提供了一些高级设置选项。例如,语调、音高、音色等参数可以通过高级设置进行调整,以达到更加个性化和自然的语音输出效果。 在使用语音引擎进行TTS设置时,需要注意以下几点。首先,确保设备具备语音引擎的支持。其次,要确保网络连接良好,以保证语音合成的流畅和实时性。最后,可以根据具体的应用场景和需求进行相应的设置,以达到最佳的语音合成效果。 总之, TTS设置是在语音引擎中进行的各种设置操作,包括发音人的选择、语速和音量的调整,以及一些高级参数的设置,旨在实现更加个性化和自然的语音合成效果。 ### 回答3: TTS(Text-to-Speech)是一种将文本转化为语音的技术。语音引擎是一种广泛应用的语音合成技术,具有较高的音质和语音自然度,因此在许多应用中被广泛使用。 语音引擎的设置需要注意以下几个方面: 1. 语音模型选择:语音引擎提供了多种语音模型供选择,用户可以根据需求选择不同的模型。一般来说,高质量的语音模型会占用更多的系统资源,因此需要根据设备的性能和应用场景进行选择。 2. 语音合成参数设置:语音引擎允许用户根据需要进行一些参数的设置,比如说声音的音量、语速、音调等。根据不同的应用场景,可以进行适当的调整以满足用户的需求。 3. 接口调用方式:使用语音引擎需要调用相应的API接口来进行语音合成。具体的接口调用方式可以参考语音引擎的文档,根据需要选择适合的接口进行调用。 4. 声音包安装:有些语音引擎需要用户安装相应的声音包才能正常使用。这些声音包包含了不同的语音合成模型,可以为用户提供更加个性化的语音合成效果。用户在使用语音引擎之前需要先安装相应的声音包。 总的来说,使用语音引擎进行TTS设置需要根据具体的需求选择合适的语音模型和参数设置,调用相应的接口进行语音合成,并根据需要安装相应的声音包。目前,语音引擎已经广泛应用于语音助手、智能客服、语音合成设备等领域,为用户提供了高质量的语音合成服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值