android 讯飞文档中语音停顿合成技巧

本文介绍了一种在Android应用中使用讯飞语音合成API时如何实现在合成的语音中加入特定时长停顿的方法。通过将文本分割并利用死循环等待的方式实现了自定义停顿,同时提供了一个更简便的方案,即利用中文顿号实现停顿。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近写android的时候碰到一个需求,就是当我们想要自己合成语音的时候,需要在播报一句话的某些位置进行几秒钟的停顿,比如想要合成这样的语音:"大家好,【停顿一秒】欢迎【停顿两秒】来到我的博客,如果有用【停顿一秒】,顶一下呗"。在讯飞的文档中,我没看到有实现这样功能的方法(看的并不仔细,android也才看了一个月)

我的实现方法是把这段文字先拆分,用split(String regex)把文字拆成字符串数组,参数当然是“【停顿一秒】”,这个停顿两秒怎么处理?当然是用两个【停顿一秒】代替,

这样就把原字符串切割成了多个字符串,再遍历数组播报出来就行了(每播报完一个停顿一秒)。这里【停顿两秒】会生成一个空字符串存进数组,当然也是有用的。空字符串不会发出声音,但是会形成停顿效果。其实还是很简单的。不多说,上代码:

//搞个工具类,
//private SpeechSynthesizer mTts;
//private int flag = 0;
public void startSpeaking(String playText) {
    final String[] texts = playText.split("【停顿一秒】");
    // 进行语音合成.
    if (mTts != null){
	//为了不影响主线程,重新开个异步线程
        new AsyncTask(){
            @Override
            protected Object doInBackground(Object[] params) {
                for (int i = 0; i < texts.length; i++) {
		//这是咱们讯飞文档中SpeechSynthesizer提供的播报语音方法
                    mTts.startSpeaking(texts[i],new SynthesizerListener(){
			//这里实现SynthesizerListener中该实现的方法即可,在这些方法中,我们主要用到onCompleted()这个方法,在这个方法中做以下控制
			//播放完语音会自动调用这个方法
			@Override
			public void onCompleted(SpeechError speechError) {
    				flag = 100;
    				try {
					//休眠1秒
        				Thread.sleep(1000);
    				} catch (InterruptedException e) {
       			 		e.printStackTrace();
    				}
			}
		    });
		//这里要让一定要卡住,我是用了死循环卡在这里,不让其自动往下走,否则会发现基本上只播报了数组中最后一段语音,因为代码执行的速度很快,
		//第一句话还没说完,可能刚发出第一个字的第一个音就会再次执行mTts.startSpeaking(texts[i+1],...)了
                    while (true){
			//搞个标示在这,只要当前语音播放完,就修改标识的值,让其跳出这个死循环,让他继续播放下一段语音,当然跳出之后需要再次赋值成0,否则下一次进来这里的时候,
			//就卡不住了
                        if (flag != 0){
                            break;
                        }
                    }
                    flag = 0;
                }
                return null;
            }
        }.execute();
    }
}


OK,现在调用这个方法,把我们需要播放的字符串传进去,就这么简单。


另一种方法,中文顿号"、"即可停顿,想停长时间,可多加几个。在来自http://blog.youkuaiyun.com/eastlhu/article/details/25436973看到的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值