小程序
小游戏
企业微信
微信支付
扫描小程序码分享
目前在做微信小程序的demo,发现微信小程序关于语音的api只能通过音频地址播放,这样的话就需要合成好以后才能播放,对于大量的文本,会大大增加等待时间,想问一下,在小程序中,tts的流式播放是如何实现的,或者有什么其他办法,可以一边播放,一边合成
3 个回答
加粗
标红
插入代码
插入链接
插入图片
上传视频
参考此贴百度TTS返回的是文件流怎么转成MP3呢?
https://developers.weixin.qq.com/community/develop/doc/0002c6373682782349dbaf29251800
你好,麻烦通过点击下方“反馈信息”按钮,提供出现问题的。
可以播放,但是两个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;
};
// 进入页面
onLoad() {
this.initInnerAudioContext();
this.getData();
查了一圈,微信小程序似乎不支持流式播放.... 只能等语音全部合成后,下载下来...
关注后,可在微信内接收相应的重要提醒。
请使用微信扫描二维码关注 “微信开放社区” 公众号
参考此贴百度TTS返回的是文件流怎么转成MP3呢?
https://developers.weixin.qq.com/community/develop/doc/0002c6373682782349dbaf29251800
可以播放,但是两个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();
}
}
查了一圈,微信小程序似乎不支持流式播放.... 只能等语音全部合成后,下载下来...