temp
This commit is contained in:
		 Submodule packages/video-tools updated: 767e436eb8...e4596b4fde
									
								
							
							
								
								
									
										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) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user