收藏
回答

微信小程序中的TTS如何实现流式播放的?

目前在做微信小程序的demo,发现微信小程序关于语音的api只能通过音频地址播放,这样的话就需要合成好以后才能播放,对于大量的文本,会大大增加等待时间,想问一下,在小程序中,tts的流式播放是如何实现的,或者有什么其他办法,可以一边播放,一边合成


回答关注问题邀请回答
收藏

3 个回答

  • 社区技术运营专员-Jahozheng
    社区技术运营专员-Jahozheng
    2022-02-27

    参考此贴百度TTS返回的是文件流怎么转成MP3呢?

    https://developers.weixin.qq.com/community/develop/doc/0002c6373682782349dbaf29251800

    2022-02-27
    有用
    回复 2
    • Jackie
      Jackie
      2023-10-11
      这个不能实现流式播放
      2023-10-11
      回复
    • 更好的Jimmy
      更好的Jimmy
      10-24
      这个问题有人解决了吗?
      10-24
      回复
  • 土豆思思•﹏•
    土豆思思•﹏•
    11-04

    可以播放,但是两个buffer音频播放不是很流畅。

    因为每次创建新的 AudioBufferSourceNode 并连接到音频上下文时,可能会引入微小的延迟或不连续性

    看看有没有人有解决方法

    import { Vue, Component } from 'vue-property-decorator';

    import {

      BASE_URL,

      ACCESS_TOKEN,

      BASE_REQUEST_PARAMS,

      extractAudioValues,

      hexStringToArrayBuffer,

      uint8ArrayToString

    } from './constant';


    const text =

      '这篇文章详细介绍了前端流式播放TTS语音的实现方法,通过示例代码讲解了如何使用关键帧和音频通道来播放音频文件,对于理解TTS语音播放的技术细节很有帮助。代码中对音频播放状态的控制逻辑清晰,对于正在研究或实现类似功能的开发者来说,是一篇不错的参考文章。';


    @Component

    export default class VkThreejs extends Vue {

      audioCtx: any = undefined;

      source;

      arrayBuffers = [];

      audioIndex = 0;

      isDecoding = false;


      initInnerAudioContext() {

        // this.audioCtx = wx.createInnerAudioContext({

        //   useWebAudioImplement: true // 是否使用 WebAudio 作为底层音频驱动,默认关闭。对于短音频、播放频繁的音频建议开启此选项,开启后将获得更优的性能表现。由于开启此选项后也会带来一定的内存增长,因此对于长音频建议关闭此选项

        // })

        this.audioCtx = wx.createWebAudioContext();

        this.source = this.audioCtx.createBufferSource();

      }


      getData() {

        return new Promise((resolve) => {

          let read = [];

          const requestTask = uni.request({

            url: BASE_URL, //调用后端接口

            method: 'POST',

            //获取文件流

            // responseType: 'text',

            enableChunked: true,

            header: {

              'content-type': 'application/json',

              Authorization: 'Bearer ' + ACCESS_TOKEN

            },

            data: {

              ...BASE_REQUEST_PARAMS,

              text: text

            }

          });


          requestTask.onChunkReceived((res) => {

            const resData = res.data;

            const stringData = uint8ArrayToString(resData);

            const bufferData = hexStringToArrayBuffer(stringData);


            this.audioCtx.decodeAudioData(

              bufferData,

              (buffer) => {

                this.loadAudioFile(buffer, resData);

              },

              (err) => {

                console.error('decodeAudioData fail', err);

              }

            );

          });

        });

      }


      // 加载音频文件并解码为音频缓冲区

      loadAudioFile(decodeBuffer: ArrayBuffer, originBuffer: ArrayBuffer): void {

        // if (originBuffer.byteLength < 10) {

        //   // 因为是采用 SSE 数据格式为:data:xxxxxx\n\n

        //   // 这里就是为了排除 data: 和 \n\n,只接受中间的数据

        //   // 通过打印开源发现data:的Uint8Array:[100, 97, 116, 97, 58],\n\n的Uint8Array:[10, 10]

        //   return;

        // }

        this.arrayBuffers.push(decodeBuffer);

        this.playNextAudio();

      }


      // 创建播放下一个音频的方法

      playNextAudio(): void {

        const len = this.arrayBuffers.length;

        // 检查是否还有要播放的音频,如果有,继续播放

        if (this.audioIndex < len && !this.isDecoding && this.audioIndex !== len - 1) {

          this.isDecoding = true;

          this.playAudio(this.arrayBuffers[this.audioIndex++]);

        }

      }


      // 播放音频

      playAudio(arrayBuffer: ArrayBuffer): void {

        let source = this.audioCtx.createBufferSource();

        source.buffer = arrayBuffer;

        source.connect(this.audioCtx.destination);


        // 播放音频

        source.start(0);


        // 监听音频结束事件

        source.onended = () => {

          // 在微信小程序中,由于 Web Audio API 的限制,使用 AudioBufferSourceNode 连续播放多个音频片段可能会出现杂音问题。

          // 这是因为每次创建新的 AudioBufferSourceNode 并连接到音频上下文时,可能会引入微小的延迟或不连续性。

          this.isDecoding = false;

          this.playNextAudio();

        };

      }


      // 进入页面

      onLoad() {

        this.initInnerAudioContext();

        this.getData();

      }

    }


    11-04
    有用
    回复
  • Jackie
    Jackie
    2022-04-30

    查了一圈,微信小程序似乎不支持流式播放.... 只能等语音全部合成后,下载下来...

    2022-04-30
    有用
    回复 7
    • Zvemiry9.
      Zvemiry9.
      2022-08-29
      找到方法了吗
      2022-08-29
      回复
    • 炽天使
      炽天使
      2023-09-13
      audiobuffer试了,好像不行。。
      2023-09-13
      回复
    • 朱同学
      朱同学
      05-29
      弄好了吗
      05-29
      回复
    • 晚安比奇堡
      晚安比奇堡
      08-02
      解决了吗
      08-02
      回复
    • 品如的袜子
      品如的袜子
      08-29回复炽天使
      你解决了吗
      08-29
      回复
    查看更多(2)
登录 后发表内容