generated from tailored/router-template
perf: video tts mix add writer buffer
This commit is contained in:
parent
3ecc9353c7
commit
c7e3fb9129
@ -406,12 +406,14 @@ type TTSWriteType = {
|
|||||||
data?: Buffer;
|
data?: Buffer;
|
||||||
isBegin?: boolean;
|
isBegin?: boolean;
|
||||||
isEnd?: boolean;
|
isEnd?: boolean;
|
||||||
|
index?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
export class TtsMix {
|
export class TtsMix {
|
||||||
appId: string;
|
appId: string;
|
||||||
token: string;
|
token: string;
|
||||||
emitter: EventEmitter;
|
emitter: EventEmitter;
|
||||||
|
|
||||||
constructor(appId: string, token: string) {
|
constructor(appId: string, token: string) {
|
||||||
this.appId = appId;
|
this.appId = appId;
|
||||||
this.token = token;
|
this.token = token;
|
||||||
@ -427,10 +429,53 @@ export class TtsMix {
|
|||||||
async getVoiceDemo(speaker: string, text: string, outputPath: string): Promise<void> {
|
async getVoiceDemo(speaker: string, text: string, outputPath: string): Promise<void> {
|
||||||
return runDemo(this.appId, this.token, speaker, text, outputPath, this.emitter);
|
return runDemo(this.appId, this.token, speaker, text, outputPath, this.emitter);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 写入文件的时候同步的流监听
|
||||||
|
* @param callback
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
onWriteFile(callback: (data: TTSWriteType) => void) {
|
onWriteFile(callback: (data: TTSWriteType) => void) {
|
||||||
this.emitter.on('writeFile', callback);
|
this.emitter.on('writeFile', callback);
|
||||||
return () => {
|
return () => {
|
||||||
this.emitter.off?.('writeFile', callback);
|
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);
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user