当前位置: 首页 > news >正文

自己免费做网站百度指数排名

自己免费做网站,百度指数排名,做视频的网站带模板下载,安卓系统谁开发的导航app引导中经常遇到破音#xff0c;这里也将之前经历过的方案收集以下#xff0c;方便以后选择#xff1a; 1 对于开始和结尾破音#xff1a; 可以用升降音来处理 两种方式 一种是 直接对开始和结束的时间段进行音量直接渐进改变。这里配的是200ms的渐变。 VolumeSha…导航app引导中经常遇到破音这里也将之前经历过的方案收集以下方便以后选择 1 对于开始和结尾破音 可以用升降音来处理 两种方式 一种是 直接对开始和结束的时间段进行音量直接渐进改变。这里配的是200ms的渐变。   VolumeShaper.Configuration cfg_out null;         if (android.os.Build.VERSION.SDK_INT android.os.Build.VERSION_CODES.O) {             cfg_out new VolumeShaper.Configuration.Builder()                     .setCurve(new float[]{0f,1f},new float[]{1f,0f})                     .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR)                     .setDuration(200)                     .build();             VolumeShaper vShaper mAudioTrack.createVolumeShaper(cfg_out);             vShaper.apply(VolumeShaper.Operation.PLAY);         } 一种是 开始的那帧数据进行音量从零渐进增加到当前音量结束的那几帧数据进行音量从当前音量降到零       /**      * 对音频数据做 fade out      * param byteBuffer byteBuffer      * param channelCount channelCount      */     private ByteBuffer shortFadeOut(ByteBuffer byteBuffer, int channelCount) {         int shortCount byteBuffer.limit() / 2;         if(1 channelCount) {             for(int i 0; i shortCount; i) {                 short data (short) (byteBuffer.getShort(i * 2) * 1.0f * (shortCount - i) / (2*shortCount));                 byteBuffer.putShort(i * 2, data);             }         } else {             for(int i 0; i shortCount; i 2) {                 short data (short) (byteBuffer.getShort(i * 2) * 1.0f * (shortCount - i) / (2*shortCount));                 byteBuffer.putShort(i * 2, data);                 data (short)(byteBuffer.getShort((i 1) * 2) * 1.0f * (shortCount - i) / (2*shortCount));                 byteBuffer.putShort((i 1) * 2, data);             }         }         byteBuffer.rewind();         return byteBuffer;     } 2 适用于自己的tts引擎 tts放入app进程会受当前app的业务影响导致tts 不稳定尤其是导航app大量的cpu内存占用是常有的事可单独放到一个独立进程里并且启动个前台服务提高优先级。   怎么两个进程沟通呢由于是低频的沟通直接广播即可。 3 不固定位置的破音直接控制tts解析出来的数据块 原理破音由于系统处理的数据不足或数据塞入间隔时间过长过短我们这里直接控制每次写入的数据大小及间隔数据    详细看下代码系统不同代码效果也不一样要和系统tts端配合而且要能拿到tts解析数据我们是自己的tts引擎 public class AudioTrackManager {     public static final String TAG AudioTrackManager;     private AudioTrack audioTrack;     private static AudioTrackManager mInstance;     private int bufferSize;     private byte[] simpleBytes null;     private int writeRate 180;     private int pushRate 90;     //系统一次处理的数据块的最小值小于的话就会破音     private static int RateSize 1900; private SyncStack syncStack new SyncStack();     private long oldTime 0;     private ExecutorService pool Executors.newSingleThreadExecutor(); //类似生产者消费者的一个读写类每写一次都给一次取的机会目的是不耽误取出播报的节奏     class SyncStack { LinkedBlockingQueuebyte[] datas new LinkedBlockingQueuebyte[]();         long oldTime 0; public void clearData(){             datas.clear();         } public synchronized void push(byte[] data) {             try {                 datas.put(data);                 long time   System.currentTimeMillis()-oldTime;                 //空出机会给写入线程机会                 if (time pushRate) {                     time 5;                 } else {                     time pushRate - time;                 } if(time0) {                     wait(time);                 }                 oldTime System.currentTimeMillis();             } catch (InterruptedException e) {                 e.printStackTrace();             } //            this.notify();         } public synchronized byte[] pop() throws InterruptedException {             if (datas null || datas.size() 0) {                 //50ms后不再等待数据自动结束流程                 if (datas null || datas.size() 0) {                     wait(50);                 }                 if(datasnull||datas.size()0) {                     return null;                 }             }             return datas.take();         }     } public AudioTrackManager() {         bufferSize AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT);         audioTrack new AudioTrack(AudioPolicyManager.STREAM_NAVI, 8000, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT, bufferSize, AudioTrack.MODE_STREAM);     } private void initTrack() {         if (audioTrack null) {             bufferSize AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT);             audioTrack new AudioTrack(AudioPolicyManager.STREAM_NAVI, 8000, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT, bufferSize, AudioTrack.MODE_STREAM);         }     } public static AudioTrackManager getInstance() {         if (mInstance null) {             synchronized (AudioTrackManager.class) {                 if (mInstance null) {                     mInstance new AudioTrackManager();                 }             }         }         return mInstance;     } public void startReady() {         initTrack();         if(syncStack!null) {             syncStack.clearData();         }else{             syncStack new SyncStack();         }     } //System.arraycopy()方法     public static byte[] byteMerger(byte[] bt1, byte[] bt2) {         byte[] bt3 new byte[bt1.length bt2.length];         System.arraycopy(bt1, 0, bt3, 0, bt1.length);         System.arraycopy(bt2, 0, bt3, bt1.length, bt2.length);         return bt3;     }     /**      * 停止播放      */     public void stopPlay() {         try {             //destroyThread();             Log.v(TAG, yangtest--stopTTS);             if(syncStack!null){                 syncStack.clearData();             }             if (audioTrack ! null) {                 if (audioTrack.getState() AudioRecord.STATE_INITIALIZED) {                     audioTrack.stop();                 }                 if (audioTrack ! null) {                     audioTrack.release();                 }                 audioTrack null;             }         } catch (Exception e) {             e.printStackTrace();         }     } //tts 服务会不停的传过来解析出来的据     public void startPush(byte[] data) {         syncStack.push(data);     }     //启动播报线程     public void startPop() {         Log.e(yangtest,startpop-bufferSize-bufferSize);         pool.execute(                new Runnable(){ public void run() { android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_AUDIO);                         try {                             //等待先写入数据一定的数据防止进来就破音                             Thread.sleep(getStartTime());                         } catch (InterruptedException e) {                             e.printStackTrace();                         } audioTrack.play();                         try {                             while ((simpleBytes syncStack.pop()) ! null) { while (simpleBytes.length RateSize) {                                     try {                                         //一次取的不够先等待最小间隔时间再操作                                         Thread.sleep(writeRate);                                     } catch (InterruptedException e) {                                         e.printStackTrace();                                     }                                     byte[] temp syncStack.pop();                                     if (temp ! null) {                                         simpleBytes byteMerger(simpleBytes, temp);                                     } else {                                         Log.e(yangtest, no-data);                                         break;                                     }                                 }                                 startWrite();                             }                         } catch (InterruptedException e) {                             e.printStackTrace();                         } if (endPlay ! null) {                             endPlay.onEnd();                         }                     } });     }     /**      * 启动播放线程      */     private void startWrite() {         //需先等待最小的间隔时间保持播报节奏         long timelen System.currentTimeMillis() - oldTime;         if (timelen writeRate) {             try {                 Thread.sleep(writeRate - timelen);             } catch (InterruptedException e) {                 e.printStackTrace();             }         }         oldTime System.currentTimeMillis();         audioTrack.write(simpleBytes, 0, simpleBytes.length);         simpleBytes null;     } public long getStartTime(){         int txtLen BdTTSPlayer.speechs.length();         int len 60 txtLen * 10;         return len;     } public void setEndPlay(EndPlay endPlay) {         this.endPlay endPlay;     } EndPlay endPlay; interface EndPlay {         public void onEnd();     } } 该方案需要自己调时间间隔值没有一个固定的答案。
http://www.dnsts.com.cn/news/204705.html

相关文章:

  • 企业购物网站建设市场营销方案500字
  • 克州seo整站排名长春网站建设net
  • 个人网站可以做信息网站吗电脑培训机构哪里有
  • 网站设计服务做泵阀生意到哪个网站
  • 网站免费网站免费网站做招聘需要什么资质
  • 一个空间可以做几个网站吗老字号品牌建设
  • 服装网站建设项目规划书温岭哪里有做网站的
  • 网站建设微信公众号文章企业生产管理软件
  • 常见网站建设公司术语集团网页建设
  • 优秀设计师网站怎么引流推广
  • 贺岁币在建设银行那个网站预约网站建设流程周期
  • 学做网站需要懂什么软件自己如何创立网站
  • 个人网站可以做商业吗seo网络培训学校
  • 网站搭建规划杭州燎远精品课程网站建设
  • phpcms校园网站网站数据库5g
  • 网站做专题提升权重外贸石材网站
  • 郑州网站建设msgg功能多的免费网站建设
  • 网站上面图片上传尺寸购物网站一般分几大模块
  • 美食健康网站的建设网站建设前言和背景
  • 网站开发代码交接文档书xyz域名免费注册
  • 做基因表达热图的网站h5网站价格
  • 一台主机做两个网站重庆直播网站平台建设
  • 长沙免费建站模板wordpress去掉谷歌字体
  • 深圳旅游网站建设网站编辑难做吗
  • 企业网站代码htmlwordpress删除谷歌字体
  • 网站新闻页面无法翻页网络培训系统建设
  • 沈阳h5建站体育类网站模板
  • 合肥营销网站建设价格免费html网页源代码
  • php做的商城网站设计论文wordpress文章不显示
  • 下载织梦做网站软件网站谷歌地图提交