diff --git a/packages/video-tools b/packages/video-tools index 767e436..e4596b4 160000 --- a/packages/video-tools +++ b/packages/video-tools @@ -1 +1 @@ -Subproject commit 767e436eb8ba3d38bd68e90e18203b039662dce1 +Subproject commit e4596b4fdee9528a9b3a7934f312d59a0a8293fb diff --git a/src/asr.ts b/src/asr.ts index 3cf6f5f..bcec47b 100644 --- a/src/asr.ts +++ b/src/asr.ts @@ -1,10 +1,9 @@ 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 path from 'node:path'; -import fs from 'node:fs'; import natural from 'natural'; 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 audioTestPath = path.join(process.cwd(), 'videos/test.mp3'); const name = 'output-1746007775571.mp3'; @@ -25,93 +24,14 @@ const ws = new VideoWS({ console.log('WebSocket connected'); }, }); -type BatchSenderOptions = { - vws: VideoWS; - 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({ + +const batchSend = new BatchSendFiles({ vws: ws, // files: [audioTestPath], files: [videoTestPath, audioTestPath], }); -batchSender.init(); -batchSender.emitter.on('send-done', (data) => { +batchSend.init(); +batchSend.emitter.on('send-done', (data) => { const matchText = '在一无所知中,梦里的一天结束了一个新的轮回,便会开始。'; const textList = data as { file: string; text: string }[]; for (const item of textList) {