From c7e3fb9129daf6f6fc0e16f96a6a110add32e3e4 Mon Sep 17 00:00:00 2001 From: abearxiong Date: Wed, 23 Apr 2025 16:31:36 +0800 Subject: [PATCH] perf: video tts mix add writer buffer --- src/tts/provider/volcengine/tts-mix.ts | 45 ++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/tts/provider/volcengine/tts-mix.ts b/src/tts/provider/volcengine/tts-mix.ts index 18fbb4c..870d39f 100644 --- a/src/tts/provider/volcengine/tts-mix.ts +++ b/src/tts/provider/volcengine/tts-mix.ts @@ -406,12 +406,14 @@ type TTSWriteType = { data?: Buffer; isBegin?: boolean; isEnd?: boolean; + index?: number; }; export class TtsMix { appId: string; token: string; emitter: EventEmitter; + constructor(appId: string, token: string) { this.appId = appId; this.token = token; @@ -427,10 +429,53 @@ export class TtsMix { async getVoiceDemo(speaker: string, text: string, outputPath: string): Promise { return runDemo(this.appId, this.token, speaker, text, outputPath, this.emitter); } + /** + * 写入文件的时候同步的流监听 + * @param callback + * @returns + */ onWriteFile(callback: (data: TTSWriteType) => void) { this.emitter.on('writeFile', callback); return () => { this.emitter.off?.('writeFile', callback); }; } + /** + * 缓冲区写入 + * @TIPS 如果数据过小,音频在前端播放的时候,会卡顿 + * @param callback + * @returns + */ + onWriteFileBuffer(callback: (data: TTSWriteType) => void, opts?: { chunkSize?: number }) { + let index = 0; + let sendBuffer: Buffer = Buffer.alloc(0); + let chunkSize = opts?.chunkSize || 1024 * 50; // 50kb + const callbackBuff = (data: TTSWriteType) => { + index++; + if (data.isBegin) { + callback(data); + return; + } + const { data: videoBuffer } = data; + const sendValue = { + ...data, + index, + }; + sendBuffer = Buffer.concat([sendBuffer, videoBuffer]); + const sendBufferLenght = Buffer.byteLength(sendBuffer); + if (sendBufferLenght > chunkSize) { + sendValue.data = sendBuffer; + callback(sendValue); + sendBuffer = Buffer.alloc(0); + } else if (data.isEnd) { + sendValue.data = sendBuffer; + callback(sendValue); + sendBuffer = Buffer.alloc(0); + } + }; + this.emitter.on('writeFile', callbackBuff); + return () => { + this.emitter.off?.('writeFile', callbackBuff); + }; + } }