temp
This commit is contained in:
parent
8bc5ba1892
commit
c7b54674ad
@ -1 +1 @@
|
|||||||
Subproject commit 767e436eb8ba3d38bd68e90e18203b039662dce1
|
Subproject commit e4596b4fdee9528a9b3a7934f312d59a0a8293fb
|
90
src/asr.ts
90
src/asr.ts
@ -1,10 +1,9 @@
|
|||||||
import { VideoWS, VideoWsResult } from '@kevisual/video-tools/src/asr/provider/funasr/ws.ts';
|
import { VideoWS, VideoWsResult } from '@kevisual/video-tools/src/asr/provider/funasr/ws.ts';
|
||||||
|
import { BatchSendFiles } from '@kevisual/video-tools/examples/batch-send-files.ts';
|
||||||
import net from 'node:net';
|
import net from 'node:net';
|
||||||
import path from 'node:path';
|
import path from 'node:path';
|
||||||
import fs from 'node:fs';
|
|
||||||
import natural from 'natural';
|
import natural from 'natural';
|
||||||
import { EventEmitter } from 'eventemitter3';
|
import { EventEmitter } from 'eventemitter3';
|
||||||
const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
||||||
const videoTestPath = path.join(process.cwd(), 'videos/my_speech_text.wav');
|
const videoTestPath = path.join(process.cwd(), 'videos/my_speech_text.wav');
|
||||||
const audioTestPath = path.join(process.cwd(), 'videos/test.mp3');
|
const audioTestPath = path.join(process.cwd(), 'videos/test.mp3');
|
||||||
const name = 'output-1746007775571.mp3';
|
const name = 'output-1746007775571.mp3';
|
||||||
@ -25,93 +24,14 @@ const ws = new VideoWS({
|
|||||||
console.log('WebSocket connected');
|
console.log('WebSocket connected');
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
type BatchSenderOptions = {
|
|
||||||
vws: VideoWS;
|
const batchSend = new BatchSendFiles({
|
||||||
files: string[];
|
|
||||||
matchText?: string;
|
|
||||||
emitter?: EventEmitter;
|
|
||||||
};
|
|
||||||
class BatchSenderFiles {
|
|
||||||
files: string[];
|
|
||||||
vws: VideoWS;
|
|
||||||
emitter: EventEmitter;
|
|
||||||
constructor({ vws, files, matchText, emitter }: BatchSenderOptions) {
|
|
||||||
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 batchSender = new BatchSenderFiles({
|
|
||||||
vws: ws,
|
vws: ws,
|
||||||
// files: [audioTestPath],
|
// files: [audioTestPath],
|
||||||
files: [videoTestPath, audioTestPath],
|
files: [videoTestPath, audioTestPath],
|
||||||
});
|
});
|
||||||
batchSender.init();
|
batchSend.init();
|
||||||
batchSender.emitter.on('send-done', (data) => {
|
batchSend.emitter.on('send-done', (data) => {
|
||||||
const matchText = '在一无所知中,梦里的一天结束了一个新的轮回,便会开始。';
|
const matchText = '在一无所知中,梦里的一天结束了一个新的轮回,便会开始。';
|
||||||
const textList = data as { file: string; text: string }[];
|
const textList = data as { file: string; text: string }[];
|
||||||
for (const item of textList) {
|
for (const item of textList) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user