TextView文字同步讯飞语音滚动解决方案

本文介绍了使用讯飞语音合成时同步滚动TextView文字的方法。包括简单的实现方式及优化方案,并针对文字高度超过屏幕高度时的分屏播放解决方案。

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

讯飞语音同步滚动TextView文字播放的问题

SpeechSynthesizer mTts = new SpeechSynthesizer(context, mTtsInitListener);

1.最简单方式

 private SynthesizerListener mTtsListener = new SynthesizerListener.Stub() {
        。。。。省略
        @Override
        public void onSpeakProgress(int progress) throws RemoteException {
//height 文字内容总高度
 float height=mContent.getLineCount()*mContent.getLineHeight();
 //内容高度大于一屏才滑动,mContent.getMeasuredHeight()控件高度
            if(height>mContent.getMeasuredHeight()) {
//              //置顶滑动,有点快,需要减速
                int y= (int) (height* (progress) / 100);
                mContent.setScrollY(y);
            }
        }
    };

2.优化,减速2行,滚动速度比较适中了,基本播放在中间了

private SynthesizerListener mTtsListener = new SynthesizerListener.Stub() {
        。。。。省略
        @Override
        public void onSpeakProgress(int progress) throws RemoteException {
//height 文字内容总高度
float height=mContent.getLineCount()*mContent.getLineHeight();
            if(height>mContent.getMeasuredHeight()) {//内容高度大于一屏才滚动
                int y= (int) (height* progress / 100);
                //2*mContent.getLineHeight()滚动慢2行,一般来说一屏不至于才2行,比较合适,y必须大于0
                y = y - 2 * mContent.getLineHeight() ;
                if(y>0)mContent.setScrollY(y);

            }
        }
    };

但是以上方法对于 文字总高度>100*控件高度 的又不试用了,这是因为讯飞的回调progress最小值是1,所以讯飞回调progress=1之前,语音就已经读到看不见的地方了,影响用户体验。
目前的解决方式是,将文字分屏播放,分屏总数=文字总高度/100*控件高度,然后将文字是用substring拆分成几段(分屏总数)播放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值