video-tools/examples/batch-send-files.ts

101 lines
3.1 KiB
TypeScript

import { EventEmitter } from 'eventemitter3';
import { VideoWS, VideoWsResult, sleep } from '../src/asr/provider/funasr/ws.ts';
import fs from 'node:fs';
import path from 'node:path';
type BatchSendOptions = {
vws: VideoWS;
files: string[];
matchText?: string;
emitter?: EventEmitter;
};
export class BatchSendFiles {
files: string[];
vws: VideoWS;
emitter: EventEmitter;
constructor({ vws, files, emitter }: BatchSendOptions) {
this.files = files;
this.vws = vws;
this.emitter = emitter || vws.emitter;
}
async init() {
const isConnected = await this.vws.isConnected();
if (!isConnected) {
console.error('链接失败:', isConnected);
}
this.send();
}
waitOne() {
return new Promise((resolve) => {
this.vws.emitter.once('result', (data) => {
resolve(data);
});
});
}
async checkAudioFile(file: string) {
const stats = fs.statSync(file);
if (!stats.isFile()) {
throw new Error(`File not found: ${file}`);
}
const ext = path.extname(file).toLowerCase();
const validExtensions = ['.wav', '.mp3', '.flac', '.ogg', '.aac'];
if (!validExtensions.includes(ext)) {
throw new Error(`Invalid file type: ${ext}. Supported types are: ${validExtensions.join(', ')}`);
}
const fileSize = stats.size;
if (fileSize === 0) {
throw new Error(`File is empty: ${file}`);
}
const maxSize = 100 * 1024 * 1024; // 100 MB
if (fileSize > maxSize) {
throw new Error(`File size exceeds limit: ${fileSize} bytes. Maximum allowed size is ${maxSize} bytes.`);
}
return {
file,
ext,
size: fileSize,
isValid: true,
};
}
async send() {
const textList: { file: string; text: string }[] = [];
for (const file of this.files) {
let wav_format = 'wav';
try {
const ck = await this.checkAudioFile(file);
if (ck.ext !== '.wav') {
wav_format = ck.ext.replace('.', '');
}
} catch (error) {
console.error('Error checking file:', error);
continue;
}
const data = fs.readFileSync(file);
const wait = this.waitOne();
await this.vws.sendBuffer(data, { wav_format });
await sleep(1000);
console.log('File sent:', file);
const result: VideoWsResult = (await wait) as any;
console.log('Result:', result.text);
textList.push({ file, text: result.text });
console.log('----------------------');
}
this.emitter.emit('send-done', textList);
}
}
// const batchSend = new BatchSendFiles({
// vws: ws,
// // files: [audioTestPath],
// files: [videoTestPath, audioTestPath],
// });
// batchSend.init();
// batchSend.emitter.on('send-done', (data) => {
// const matchText = '在一无所知中,梦里的一天结束了一个新的轮回,便会开始。';
// const textList = data as { file: string; text: string }[];
// for (const item of textList) {
// const getText = item.text || '';
// const distance = natural.JaroWinklerDistance(getText, matchText);
// console.log(`File: ${item.file}, \nText: ${item.text}\nDistance: ${distance}`);
// }
// // console.log('Batch processing done:', data);
// });