univoice 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{base-Bw2Puefv.d.ts → base-BH6BJnc0.d.ts} +4 -0
- package/dist/{chunk-GQ3UDWVG.js → chunk-5KBJXEBG.js} +21 -3
- package/dist/chunk-5KBJXEBG.js.map +1 -0
- package/dist/{save-lNS0YZU4.d.ts → save-CH5QtsBG.d.ts} +1 -1
- package/dist/src/asr/index.d.ts +3 -3
- package/dist/src/asr/index.js +1 -1
- package/dist/src/asr/providers/index.d.ts +2 -2
- package/dist/src/asr/providers/index.js +2 -2
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.js +1 -1
- package/dist/{xfyun-iV-ra5ZL.d.ts → xfyun-6REH-yLC.d.ts} +5 -1
- package/examples/asr/providers/doubao/streaming-end-of-speech-detection.ts +343 -0
- package/examples/assets/16khz_16bit_1channel/00.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/01.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/02.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/03.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/04.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/05.opus +3 -0
- package/examples/assets/16khz_16bit_1channel/06.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/07.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/08.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/09.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/10.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/100.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/101.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/102.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/103.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/104.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/105.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/106.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/107.opus +3 -0
- package/examples/assets/16khz_16bit_1channel/108.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/109.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/11.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/110.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/111.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/112.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/113.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/114.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/115.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/116.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/117.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/118.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/119.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/12.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/120.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/121.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/122.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/123.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/124.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/125.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/126.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/127.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/128.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/129.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/13.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/130.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/131.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/132.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/133.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/134.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/135.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/136.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/137.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/138.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/139.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/14.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/140.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/141.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/142.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/143.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/144.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/145.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/146.opus +3 -0
- package/examples/assets/16khz_16bit_1channel/147.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/148.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/149.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/15.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/150.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/151.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/152.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/153.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/154.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/155.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/156.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/157.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/158.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/159.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/16.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/160.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/161.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/162.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/163.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/164.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/165.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/166.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/167.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/168.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/169.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/17.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/170.opus +3 -0
- package/examples/assets/16khz_16bit_1channel/171.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/172.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/173.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/174.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/175.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/176.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/177.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/178.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/179.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/18.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/180.opus +3 -0
- package/examples/assets/16khz_16bit_1channel/181.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/182.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/183.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/184.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/185.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/186.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/187.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/188.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/189.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/19.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/190.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/191.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/192.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/193.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/194.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/195.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/196.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/197.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/198.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/199.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/20.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/200.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/201.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/202.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/203.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/204.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/205.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/206.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/207.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/208.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/209.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/21.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/210.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/211.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/212.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/213.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/214.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/215.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/216.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/217.opus +4 -0
- package/examples/assets/16khz_16bit_1channel/218.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/219.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/22.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/220.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/221.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/222.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/223.opus +4 -0
- package/examples/assets/16khz_16bit_1channel/224.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/225.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/226.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/227.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/228.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/229.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/23.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/230.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/231.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/232.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/233.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/234.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/235.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/236.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/237.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/238.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/239.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/24.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/240.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/241.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/242.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/243.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/244.opus +3 -0
- package/examples/assets/16khz_16bit_1channel/245.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/246.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/247.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/248.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/249.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/25.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/250.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/251.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/252.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/253.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/26.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/27.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/28.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/29.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/30.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/31.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/32.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/33.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/34.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/35.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/36.opus +3 -0
- package/examples/assets/16khz_16bit_1channel/37.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/38.opus +3 -0
- package/examples/assets/16khz_16bit_1channel/39.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/40.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/41.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/42.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/43.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/44.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/45.opus +3 -0
- package/examples/assets/16khz_16bit_1channel/46.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/47.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/48.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/49.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/50.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/51.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/52.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/53.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/54.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/55.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/56.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/57.opus +3 -0
- package/examples/assets/16khz_16bit_1channel/58.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/59.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/60.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/61.opus +3 -0
- package/examples/assets/16khz_16bit_1channel/62.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/63.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/64.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/65.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/66.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/67.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/68.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/69.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/70.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/71.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/72.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/73.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/74.opus +4 -0
- package/examples/assets/16khz_16bit_1channel/75.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/76.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/77.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/78.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/79.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/80.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/81.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/82.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/83.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/84.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/85.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/86.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/87.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/88.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/89.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/90.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/91.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/92.opus +0 -0
- package/examples/assets/16khz_16bit_1channel/93.opus +3 -0
- package/examples/assets/16khz_16bit_1channel/94.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/95.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/96.opus +1 -0
- package/examples/assets/16khz_16bit_1channel/97.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/98.opus +2 -0
- package/examples/assets/16khz_16bit_1channel/99.opus +0 -0
- package/package.json +1 -1
- package/dist/chunk-GQ3UDWVG.js.map +0 -1
|
@@ -26,6 +26,10 @@ interface DoubaoASROptions extends BaseASROptions {
|
|
|
26
26
|
enablePunc?: boolean;
|
|
27
27
|
enableDdc?: boolean;
|
|
28
28
|
showUtterances?: boolean;
|
|
29
|
+
endWindowSize?: number;
|
|
30
|
+
enableNonstream?: boolean;
|
|
31
|
+
vadSegmentDuration?: number;
|
|
32
|
+
forceToSpeechTime?: number;
|
|
29
33
|
}
|
|
30
34
|
interface QwenASROptions extends BaseASROptions {
|
|
31
35
|
audioFormat?: {
|
|
@@ -564,6 +564,11 @@ var DoubaoASR = class extends BaseASR {
|
|
|
564
564
|
enablePunc;
|
|
565
565
|
enableDdc;
|
|
566
566
|
showUtterances;
|
|
567
|
+
// VAD 配置
|
|
568
|
+
endWindowSize;
|
|
569
|
+
enableNonstream;
|
|
570
|
+
vadSegmentDuration;
|
|
571
|
+
forceToSpeechTime;
|
|
567
572
|
constructor(options) {
|
|
568
573
|
super(options);
|
|
569
574
|
this.appKey = options.appKey || "";
|
|
@@ -579,6 +584,10 @@ var DoubaoASR = class extends BaseASR {
|
|
|
579
584
|
this.enablePunc = options.enablePunc ?? true;
|
|
580
585
|
this.enableDdc = options.enableDdc ?? false;
|
|
581
586
|
this.showUtterances = options.showUtterances ?? true;
|
|
587
|
+
this.endWindowSize = options.endWindowSize;
|
|
588
|
+
this.enableNonstream = options.enableNonstream;
|
|
589
|
+
this.vadSegmentDuration = options.vadSegmentDuration;
|
|
590
|
+
this.forceToSpeechTime = options.forceToSpeechTime;
|
|
582
591
|
this.baseUrl = options.baseUrl || "wss://openspeech.bytedance.com/api/v3/sauc";
|
|
583
592
|
}
|
|
584
593
|
/**
|
|
@@ -650,7 +659,16 @@ var DoubaoASR = class extends BaseASR {
|
|
|
650
659
|
enable_itn: this.enableItn,
|
|
651
660
|
enable_punc: this.enablePunc,
|
|
652
661
|
enable_ddc: this.enableDdc,
|
|
653
|
-
show_utterances: this.showUtterances
|
|
662
|
+
show_utterances: this.showUtterances,
|
|
663
|
+
// VAD 参数:仅在有值时传递,未传则使用服务端默认值
|
|
664
|
+
...this.endWindowSize !== void 0 && { end_window_size: this.endWindowSize },
|
|
665
|
+
...this.enableNonstream !== void 0 && { enable_nonstream: this.enableNonstream },
|
|
666
|
+
...this.vadSegmentDuration !== void 0 && {
|
|
667
|
+
vad_segment_duration: this.vadSegmentDuration
|
|
668
|
+
},
|
|
669
|
+
...this.forceToSpeechTime !== void 0 && {
|
|
670
|
+
force_to_speech_time: this.forceToSpeechTime
|
|
671
|
+
}
|
|
654
672
|
}
|
|
655
673
|
};
|
|
656
674
|
}
|
|
@@ -1881,5 +1899,5 @@ var XfyunASR = class extends BaseASR {
|
|
|
1881
1899
|
};
|
|
1882
1900
|
|
|
1883
1901
|
export { BaseASR, DEFAULT_SAMPLE_RATE, DoubaoASR, GeminiASR, MinimaxASR, QwenASR, WhisperASR, XfyunASR, bufferToAudioStream, convertToWav, createASR, getASRProviders, isWav, parseWavInfo, processAudio, readAudio, registerASRProvider, splitAudio };
|
|
1884
|
-
//# sourceMappingURL=chunk-
|
|
1885
|
-
//# sourceMappingURL=chunk-
|
|
1902
|
+
//# sourceMappingURL=chunk-5KBJXEBG.js.map
|
|
1903
|
+
//# sourceMappingURL=chunk-5KBJXEBG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/asr/utils/audio.ts","../src/asr/base.ts","../src/asr/factory.ts","../src/asr/protocols/sauc.ts","../src/asr/providers/doubao.ts","../src/asr/providers/gemini.ts","../src/asr/providers/minimax.ts","../src/asr/providers/openai.ts","../src/asr/protocols/dashscope.ts","../src/asr/providers/qwen.ts","../src/asr/providers/xfyun.ts"],"names":["Buffer","parseResponse","WebSocket","randomUUID","readFile"],"mappings":"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","file":"chunk-5KBJXEBG.js","sourcesContent":["/**\n * 音频处理工具\n * 用于音频格式判断、转换和分割\n */\n\nimport { Buffer } from 'node:buffer';\nimport { execFileSync } from 'node:child_process';\nimport { mkdtempSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\n\n/**\n * 默认采样率\n */\nexport const DEFAULT_SAMPLE_RATE = 16000;\n\n/**\n * WAV 文件信息\n */\nexport interface WavInfo {\n channels: number;\n sampleWidth: number;\n sampleRate: number;\n frameCount: number;\n data: Buffer;\n}\n\n/**\n * 判断是否为 WAV 格式\n */\nexport function isWav(data: Buffer): boolean {\n if (data.length < 44) {\n return false;\n }\n return data.slice(0, 4).toString() === 'RIFF' && data.slice(8, 12).toString() === 'WAVE';\n}\n\n/**\n * 检测是否为压缩音频格式(MP3、OGG、FLAC 等)\n */\nexport function isCompressedAudio(data: Buffer): boolean {\n if (data.length < 4) return false;\n // MP3: ID3v2 标签\n if (data[0] === 0x49 && data[1] === 0x44 && data[2] === 0x33) return true;\n // MP3: 帧同步标记\n if (data[0] === 0xff && (data[1] & 0xe0) === 0xe0) return true;\n // OGG\n if (data.slice(0, 4).toString() === 'OggS') return true;\n // FLAC\n if (data.slice(0, 4).toString() === 'fLaC') return true;\n return false;\n}\n\n/**\n * 将裸 PCM 数据封装为 WAV 格式\n */\nexport function createWavFromPcm(\n pcmData: Buffer,\n sampleRate: number = DEFAULT_SAMPLE_RATE,\n channels: number = 1,\n bitDepth: number = 16\n): Buffer {\n const byteRate = sampleRate * channels * (bitDepth / 8);\n const blockAlign = channels * (bitDepth / 8);\n const dataSize = pcmData.length;\n\n const header = Buffer.alloc(44);\n header.write('RIFF', 0);\n header.writeUInt32LE(36 + dataSize, 4);\n header.write('WAVE', 8);\n header.write('fmt ', 12);\n header.writeUInt32LE(16, 16);\n header.writeUInt16LE(1, 20); // PCM 格式\n header.writeUInt16LE(channels, 22);\n header.writeUInt32LE(sampleRate, 24);\n header.writeUInt32LE(byteRate, 28);\n header.writeUInt16LE(blockAlign, 32);\n header.writeUInt16LE(bitDepth, 34);\n header.write('data', 36);\n header.writeUInt32LE(dataSize, 40);\n\n return Buffer.concat([header, pcmData]);\n}\n\n/**\n * 解析 WAV 文件信息\n */\nexport function parseWavInfo(data: Buffer): WavInfo {\n if (data.length < 44) {\n throw new Error('Invalid WAV file: too short');\n }\n\n // 解析 WAV 头\n const chunkId = data.slice(0, 4).toString();\n if (chunkId !== 'RIFF') {\n throw new Error('Invalid WAV file: not RIFF format');\n }\n\n const format = data.slice(8, 12).toString();\n if (format !== 'WAVE') {\n throw new Error('Invalid WAV file: not WAVE format');\n }\n\n // 解析 fmt 子块\n const audioFormat = data.readUInt16LE(20);\n if (audioFormat !== 1) {\n throw new Error(`Unsupported WAV format: ${audioFormat}, only PCM (1) is supported`);\n }\n\n const numChannels = data.readUInt16LE(22);\n const sampleRate = data.readUInt32LE(24);\n const bitsPerSample = data.readUInt16LE(34);\n\n // 查找 data 子块\n let pos = 36;\n while (pos < data.length - 8) {\n const subchunkId = data.slice(pos, pos + 4).toString();\n const subchunkSize = data.readUInt32LE(pos + 4);\n\n if (subchunkId === 'data') {\n const waveData = data.slice(pos + 8, pos + 8 + subchunkSize);\n const frameCount = Math.floor(subchunkSize / (numChannels * (bitsPerSample / 8)));\n\n return {\n channels: numChannels,\n sampleWidth: bitsPerSample / 8,\n sampleRate,\n frameCount,\n data: waveData,\n };\n }\n\n pos += 8 + subchunkSize;\n }\n\n throw new Error('Invalid WAV file: no data subchunk found');\n}\n\n/**\n * 检查 ffmpeg 是否可用\n */\nexport function checkFfmpeg(): boolean {\n try {\n execFileSync('ffmpeg', ['-version'], { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * 创建临时目录\n */\nlet tempDir: string | null = null;\n\nfunction getTempDir(): string {\n if (!tempDir) {\n tempDir = mkdtempSync(join(tmpdir(), 'univoice-asr-'));\n }\n return tempDir;\n}\n\n/**\n * 使用 ffmpeg 转换音频为 WAV 格式\n */\nexport function convertToWav(\n input: Buffer | string,\n sampleRate: number = DEFAULT_SAMPLE_RATE\n): Buffer {\n if (!checkFfmpeg()) {\n throw new Error('ffmpeg is not installed or not in PATH');\n }\n\n let inputPath: string;\n let shouldCleanup = false;\n\n if (Buffer.isBuffer(input)) {\n // 将 Buffer 写入临时文件\n const tempFile = join(getTempDir(), `input-${Date.now()}.tmp`);\n writeFileSync(tempFile, input);\n inputPath = tempFile;\n shouldCleanup = true;\n } else {\n inputPath = input;\n }\n\n try {\n const result = execFileSync(\n 'ffmpeg',\n [\n '-v',\n 'quiet',\n '-y',\n '-i',\n inputPath,\n '-acodec',\n 'pcm_s16le',\n '-ac',\n '1',\n '-ar',\n String(sampleRate),\n '-f',\n 'wav',\n '-',\n ],\n { maxBuffer: 50 * 1024 * 1024 } // 50MB buffer\n );\n return result;\n } finally {\n if (shouldCleanup) {\n try {\n unlinkSync(inputPath);\n } catch {\n // 忽略清理错误\n }\n }\n }\n}\n\n/**\n * 使用 ffprobe 检测音频文件的采样率\n *\n * @param input 音频文件路径或 Buffer\n * @returns 采样率(Hz),如果无法检测则返回 null\n */\nexport function detectSampleRate(input: Buffer | string): number | null {\n if (!checkFfmpeg()) {\n return null;\n }\n\n let inputPath: string;\n let shouldCleanup = false;\n\n if (Buffer.isBuffer(input)) {\n // 将 Buffer 写入临时文件\n const tempFile = join(getTempDir(), `input-${Date.now()}.tmp`);\n writeFileSync(tempFile, input);\n inputPath = tempFile;\n shouldCleanup = true;\n } else {\n inputPath = input;\n }\n\n try {\n const result = execFileSync(\n 'ffprobe',\n [\n '-v',\n 'error',\n '-show_entries',\n 'stream=sample_rate',\n '-of',\n 'default=noprint_wrappers=1:nokey=1',\n inputPath,\n ],\n { encoding: 'utf8' }\n );\n\n const sampleRate = parseInt(result.trim(), 10);\n if (Number.isNaN(sampleRate) || sampleRate <= 0) {\n return null;\n }\n\n return sampleRate;\n } catch {\n return null;\n } finally {\n if (shouldCleanup) {\n try {\n unlinkSync(inputPath);\n } catch {\n // 忽略清理错误\n }\n }\n }\n}\n\n/**\n * 根据时长计算分段大小(字节数)\n */\nexport function calculateSegmentSize(\n channels: number,\n sampleWidth: number,\n sampleRate: number,\n durationMs: number\n): number {\n const bytesPerSecond = channels * sampleWidth * sampleRate;\n return Math.floor((bytesPerSecond * durationMs) / 1000);\n}\n\n/**\n * 分割音频数据\n */\nexport function splitAudio(data: Buffer, segmentSize: number): Buffer[] {\n if (segmentSize <= 0) {\n return [];\n }\n\n const segments: Buffer[] = [];\n for (let i = 0; i < data.length; i += segmentSize) {\n const end = Math.min(i + segmentSize, data.length);\n segments.push(data.slice(i, end));\n }\n return segments;\n}\n\n/**\n * 读取音频数据\n * 支持多种输入类型:Buffer、文件路径\n */\nexport async function readAudio(input: Buffer | Uint8Array | string): Promise<Buffer> {\n if (Buffer.isBuffer(input)) {\n return input;\n }\n\n if (input instanceof Uint8Array) {\n return Buffer.from(input);\n }\n\n // 文件路径\n if (typeof input === 'string') {\n // 检查是否为 URL\n if (input.startsWith('http://') || input.startsWith('https://')) {\n const response = await fetch(input);\n const arrayBuffer = await response.arrayBuffer();\n return Buffer.from(arrayBuffer);\n }\n\n // 本地文件\n return readFile(input);\n }\n\n throw new Error(`Unsupported audio input type: ${typeof input}`);\n}\n\n/**\n * 处理音频数据\n * 包括格式转换、WAV 解析和分段计算\n */\nexport async function processAudio(\n input: Buffer | Uint8Array | string,\n segmentDurationMs: number = 200\n): Promise<{\n wavData: Buffer;\n wavInfo: WavInfo;\n segmentSize: number;\n audioData: Buffer;\n}> {\n // 读取音频数据\n const rawData = await readAudio(input);\n\n // 判断音频格式并转换为 WAV\n let wavData: Buffer;\n if (isWav(rawData)) {\n wavData = rawData;\n } else if (isCompressedAudio(rawData)) {\n // 压缩格式(MP3 等)需要 ffmpeg 解码\n wavData = convertToWav(rawData, DEFAULT_SAMPLE_RATE);\n } else {\n // 裸 PCM 数据,直接添加 WAV 头\n wavData = createWavFromPcm(rawData, DEFAULT_SAMPLE_RATE);\n }\n\n // 解析 WAV 信息\n const wavInfo = parseWavInfo(wavData);\n\n // 计算分段大小\n const segmentSize = calculateSegmentSize(\n wavInfo.channels,\n wavInfo.sampleWidth,\n wavInfo.sampleRate,\n segmentDurationMs\n );\n\n return {\n wavData,\n wavInfo,\n segmentSize,\n audioData: wavInfo.data,\n };\n}\n\n/**\n * 将 Buffer 或 Uint8Array 转换为音频流\n * 用于 listen 方法,支持流式输入识别\n *\n * @param buffer 音频数据\n * @param chunkSize 分块大小(字节),默认 3200(100ms @ 16kHz 16bit mono)\n * @returns 音频流\n */\nexport async function* bufferToAudioStream(\n buffer: Buffer | Uint8Array,\n chunkSize = 3200\n): AsyncIterable<Buffer | Uint8Array> {\n for (let i = 0; i < buffer.length; i += chunkSize) {\n yield buffer.slice(i, Math.min(i + chunkSize, buffer.length));\n }\n}\n","import { bufferToAudioStream, processAudio } from '@/asr/utils/audio';\nimport type {\n ASRConnection,\n ASRConnectOptions,\n ASRResponse,\n ASRSegment,\n ASRStreamChunk,\n AudioCodecFormat,\n AudioContainerFormat,\n AudioStream,\n AudioStreamInput,\n BaseASROptions,\n ListenInstanceOptions,\n} from '@/types/asr';\n\nexport abstract class BaseASR {\n abstract name: string;\n public apiKey: string;\n public baseUrl: string;\n public model: string;\n public language: string;\n public prompt: string;\n public responseFormat: 'json' | 'text' | 'srt' | 'vtt' | 'verbose_json';\n public format: AudioContainerFormat;\n public codec: AudioCodecFormat;\n\n constructor(options: BaseASROptions) {\n this.apiKey = options.apiKey || '';\n this.baseUrl = options.baseUrl || '';\n this.model = options.model || 'default';\n this.language = options.language || 'zh-CN';\n this.prompt = options.prompt || '';\n this.responseFormat = options.responseFormat || 'json';\n this.format = options.format || 'pcm';\n this.codec = options.codec || 'raw';\n }\n\n /**\n * 流式输入识别方法\n * 子类必须实现此方法\n *\n * @param audio 音频流\n * @returns 流式识别结果\n */\n abstract listenStream(audio: AudioStream): AsyncIterable<ASRStreamChunk>;\n\n /**\n * 判断输入是否为 AudioStream\n */\n private isAudioStream(input: AudioStreamInput): input is AudioStream {\n return input !== null && typeof input === 'object' && Symbol.asyncIterator in input;\n }\n\n /**\n * 判断输入是否为字符串(文件路径)\n */\n private isString(input: AudioStreamInput): input is string {\n return typeof input === 'string';\n }\n\n /**\n * 适配音频输入为音频流\n */\n private adaptAudioInput(audio: AudioStreamInput): AudioStream {\n if (this.isAudioStream(audio)) return audio;\n if (this.isString(audio)) return this.fileToPcmAudioStream(audio);\n return bufferToAudioStream(audio);\n }\n\n /**\n * 将音频文件路径转换为 PCM 音频流\n */\n private async *fileToPcmAudioStream(filePath: string): AudioStream {\n const { audioData } = await processAudio(filePath);\n const chunkSize = 3200; // 100ms @ 16kHz 16bit mono\n\n for (let i = 0; i < audioData.length; i += chunkSize) {\n const end = Math.min(i + chunkSize, audioData.length);\n yield audioData.slice(i, end);\n }\n }\n\n /**\n * 预建立连接\n * 默认不支持,子类可覆写此方法以支持连接预建立\n *\n * @param options 连接选项\n * @returns ASR 连接实例\n */\n connect(_options?: ASRConnectOptions): Promise<ASRConnection> {\n throw new Error(\n `${this.name} does not support connection pre-establishment. Use listen() directly.`\n );\n }\n\n /**\n * 创建流式迭代器\n */\n private async *createStreamIterable(audio: AudioStreamInput): AsyncIterable<ASRStreamChunk> {\n const audioStream = this.adaptAudioInput(audio);\n yield* this.listenStream(audioStream);\n }\n\n /**\n * 收集非流式识别结果\n */\n private async collectASRResponse(audio: AudioStreamInput): Promise<ASRResponse> {\n const segments: ASRSegment[] = [];\n const textParts: string[] = [];\n\n const audioStream = this.adaptAudioInput(audio);\n\n for await (const chunk of this.listenStream(audioStream)) {\n if (chunk.isFinal && chunk.text) {\n textParts.push(chunk.text);\n }\n if (chunk.segment) {\n segments.push(chunk.segment);\n }\n }\n\n return {\n text: textParts.join(''),\n segments: segments.length > 0 ? segments : undefined,\n };\n }\n\n /**\n * 从音频流、音频数据或音频文件路径进行语音识别(流式模式)\n *\n * @param audio 音频流(AsyncIterable)、音频数据(Buffer/Uint8Array)或音频文件路径\n * @param options 识别选项\n * @returns 流式识别结果\n */\n listen(\n audio: AudioStreamInput,\n options: ListenInstanceOptions & { stream: true }\n ): AsyncIterable<ASRStreamChunk>;\n\n /**\n * 从音频流、音频数据或音频文件路径进行语音识别(非流式模式)\n *\n * @param audio 音频流(AsyncIterable)、音频数据(Buffer/Uint8Array)或音频文件路径\n * @param options 识别选项\n * @returns 非流式识别结果\n */\n listen(\n audio: AudioStreamInput,\n options?: ListenInstanceOptions & { stream?: false }\n ): Promise<ASRResponse>;\n\n /**\n * listen 实现\n */\n listen(\n audio: AudioStreamInput,\n options?: ListenInstanceOptions\n ): Promise<ASRResponse> | AsyncIterable<ASRStreamChunk> {\n if (options?.stream === true) {\n return this.createStreamIterable(audio);\n }\n return this.collectASRResponse(audio);\n }\n}\n","import { BaseASR } from '@/asr/base';\nimport type { ASROptions } from '@/types/asr';\n\n// 重新导出 BaseASR 以便外部使用\nexport { BaseASR } from '@/asr/base';\n\n// biome-ignore lint/suspicious/noExplicitAny: 各 provider 构造函数参数类型不同,用 any 在 Map 层面做适配;类型安全由 createASR 的判别联合参数保证\nconst providers = new Map<string, new (options: any) => BaseASR>();\n\nexport function registerASRProvider(\n type: string,\n // biome-ignore lint/suspicious/noExplicitAny: 同上\n provider: new (options: any) => BaseASR\n): void {\n providers.set(type, provider);\n}\n\nexport function createASR(options: ASROptions): BaseASR {\n const ProviderClass = providers.get(options.provider);\n if (!ProviderClass) {\n throw new Error(`ASR provider \"${options.provider}\" not found`);\n }\n return new ProviderClass(options);\n}\n\nexport function getASRProviders(): string[] {\n return Array.from(providers.keys());\n}\n","/**\n * 豆包 ASR SAUC 协议实现\n * 基于 WebSocket 二进制协议\n */\n\nimport { Buffer } from 'node:buffer';\nimport { randomUUID } from 'node:crypto';\nimport { gunzipSync, gzipSync } from 'node:zlib';\n\n/**\n * 协议版本\n */\nexport enum ProtocolVersion {\n V1 = 0b0001,\n}\n\n/**\n * 消息类型\n */\nexport enum MessageType {\n /** 客户端发送包含请求参数的 full client request */\n CLIENT_FULL_REQUEST = 0b0001,\n /** 客户端发送包含音频数据的 audio only request */\n CLIENT_AUDIO_ONLY_REQUEST = 0b0010,\n /** 服务端下发包含识别结果的 full server response */\n SERVER_FULL_RESPONSE = 0b1001,\n /** 服务端处理错误时下发的消息类型 */\n SERVER_ERROR_RESPONSE = 0b1111,\n}\n\n/**\n * 消息类型特定标志\n */\nexport enum MessageTypeSpecificFlags {\n /** header后4个字节不为sequence number */\n NO_SEQUENCE = 0b0000,\n /** header后4个字节为sequence number且为正 */\n POS_SEQUENCE = 0b0001,\n /** header后4个字节不为sequence number,仅指示此为最后一包(负包) */\n NEG_SEQUENCE = 0b0010,\n /** header后4个字节为sequence number且需要为负数(最后一包/负包) */\n NEG_WITH_SEQUENCE = 0b0011,\n}\n\n/**\n * 序列化方式\n */\nexport enum SerializationType {\n NO_SERIALIZATION = 0b0000,\n JSON = 0b0001,\n}\n\n/**\n * 压缩方式\n */\nexport enum CompressionType {\n NONE = 0b0000,\n GZIP = 0b0001,\n}\n\n/**\n * ASR 请求头构建器\n */\nexport class ASRRequestHeader {\n private messageType: MessageType = MessageType.CLIENT_FULL_REQUEST;\n private messageTypeSpecificFlags: MessageTypeSpecificFlags =\n MessageTypeSpecificFlags.POS_SEQUENCE;\n private serializationType: SerializationType = SerializationType.JSON;\n private compressionType: CompressionType = CompressionType.GZIP;\n private reservedData: number = 0x00;\n\n withMessageType(messageType: MessageType): this {\n this.messageType = messageType;\n return this;\n }\n\n withMessageTypeSpecificFlags(flags: MessageTypeSpecificFlags): this {\n this.messageTypeSpecificFlags = flags;\n return this;\n }\n\n withSerializationType(serializationType: SerializationType): this {\n this.serializationType = serializationType;\n return this;\n }\n\n withCompressionType(compressionType: CompressionType): this {\n this.compressionType = compressionType;\n return this;\n }\n\n toBytes(): Buffer {\n const header = Buffer.alloc(4);\n header[0] = (ProtocolVersion.V1 << 4) | 0b0001; // version + header size (4 bytes)\n header[1] = (this.messageType << 4) | this.messageTypeSpecificFlags;\n header[2] = (this.serializationType << 4) | this.compressionType;\n header[3] = this.reservedData;\n return header;\n }\n\n static default(): ASRRequestHeader {\n return new ASRRequestHeader();\n }\n}\n\n/**\n * ASR 响应结构\n */\nexport interface ASRResponseMessage {\n code: number;\n event: number;\n isLastPackage: boolean;\n payloadSequence: number;\n payloadSize: number;\n payloadMsg: SAUCResponsePayload | null;\n}\n\n/**\n * SAUC 响应 payload 结构\n */\nexport interface SAUCResponsePayload {\n audio_info?: {\n duration: number;\n };\n result?: {\n text: string;\n utterances?: SAUCUtterance[];\n };\n}\n\n/**\n * SAUC 分句信息\n */\nexport interface SAUCUtterance {\n text: string;\n start_time: number;\n end_time: number;\n definite: boolean;\n words?: SAUCWord[];\n}\n\n/**\n * SAUC 词信息\n */\nexport interface SAUCWord {\n text: string;\n start_time: number;\n end_time: number;\n blank_duration: number;\n}\n\n/**\n * 构建鉴权请求头\n */\nexport function buildAuthHeaders(options: {\n appKey: string;\n accessKey: string;\n resourceId?: string;\n connectId?: string;\n}): Record<string, string> {\n const connectId = options.connectId || randomUUID();\n return {\n 'X-Api-App-Key': options.appKey,\n 'X-Api-Access-Key': options.accessKey,\n 'X-Api-Resource-Id': options.resourceId || 'volc.bigasr.sauc.duration',\n 'X-Api-Connect-Id': connectId,\n };\n}\n\n/**\n * Full Client Request 参数\n */\nexport interface FullClientRequestParams {\n user?: {\n uid?: string;\n did?: string;\n platform?: string;\n sdk_version?: string;\n app_version?: string;\n };\n audio: {\n format: 'pcm' | 'wav' | 'ogg' | 'mp3';\n codec?: 'raw' | 'opus';\n rate?: number;\n bits?: number;\n channel?: number;\n language?: string;\n };\n request: {\n model_name: string;\n enable_itn?: boolean;\n enable_punc?: boolean;\n enable_ddc?: boolean;\n show_utterances?: boolean;\n enable_nonstream?: boolean;\n result_type?: 'full' | 'single';\n /** 强制判停时间(ms),静音超过此时长直接判停输出 definite */\n end_window_size?: number;\n /** 语义切分最大静音阈值(ms) */\n vad_segment_duration?: number;\n /** 强制语音时间(ms),音频超过此时长后才尝试判停 */\n force_to_speech_time?: number;\n corpus?: {\n boosting_table_name?: string;\n boosting_table_id?: string;\n correct_table_name?: string;\n correct_table_id?: string;\n context?: string;\n };\n };\n}\n\n/**\n * 构建 Full Client Request 消息\n */\nexport function buildFullClientRequest(\n params: FullClientRequestParams,\n sequence: number,\n useGzip: boolean = true\n): Buffer {\n const header = ASRRequestHeader.default().withMessageTypeSpecificFlags(\n MessageTypeSpecificFlags.POS_SEQUENCE\n );\n\n const payloadJson = JSON.stringify(params);\n const payloadBytes = Buffer.from(payloadJson, 'utf-8');\n const compressedPayload = useGzip ? gzipSync(payloadBytes) : payloadBytes;\n\n const headerBytes = header.toBytes();\n const sequenceBytes = Buffer.alloc(4);\n sequenceBytes.writeInt32BE(sequence, 0);\n\n const payloadSizeBytes = Buffer.alloc(4);\n payloadSizeBytes.writeUInt32BE(compressedPayload.length, 0);\n\n return Buffer.concat([headerBytes, sequenceBytes, payloadSizeBytes, compressedPayload]);\n}\n\n/**\n * 构建 Audio Only Request 消息\n */\nexport function buildAudioOnlyRequest(\n sequence: number,\n segment: Buffer,\n isLast: boolean = false,\n useGzip: boolean = true\n): Buffer {\n const header = ASRRequestHeader.default()\n .withMessageType(MessageType.CLIENT_AUDIO_ONLY_REQUEST)\n .withSerializationType(SerializationType.NO_SERIALIZATION);\n\n if (isLast) {\n header.withMessageTypeSpecificFlags(MessageTypeSpecificFlags.NEG_WITH_SEQUENCE);\n } else {\n header.withMessageTypeSpecificFlags(MessageTypeSpecificFlags.POS_SEQUENCE);\n }\n\n const compressedSegment = useGzip ? gzipSync(segment) : segment;\n\n const headerBytes = header.toBytes();\n const sequenceBytes = Buffer.alloc(4);\n // 如果是最后一包,序列号需要为负数\n sequenceBytes.writeInt32BE(isLast ? -sequence : sequence, 0);\n\n const payloadSizeBytes = Buffer.alloc(4);\n payloadSizeBytes.writeUInt32BE(compressedSegment.length, 0);\n\n return Buffer.concat([headerBytes, sequenceBytes, payloadSizeBytes, compressedSegment]);\n}\n\n/**\n * 解析服务端响应\n */\nexport function parseResponse(data: Buffer): ASRResponseMessage {\n const response: ASRResponseMessage = {\n code: 0,\n event: 0,\n isLastPackage: false,\n payloadSequence: 0,\n payloadSize: 0,\n payloadMsg: null,\n };\n\n if (data.length < 4) {\n throw new Error('Response data too short');\n }\n\n const headerSize = data[0] & 0x0f;\n const messageType = (data[1] >> 4) & 0x0f;\n const messageTypeSpecificFlags = data[1] & 0x0f;\n const serializationMethod = (data[2] >> 4) & 0x0f;\n const messageCompression = data[2] & 0x0f;\n\n let payload = data.slice(headerSize * 4);\n\n // 解析 message type specific flags\n if (messageTypeSpecificFlags & 0x01) {\n response.payloadSequence = payload.readInt32BE(0);\n payload = payload.slice(4);\n }\n if (messageTypeSpecificFlags & 0x02) {\n response.isLastPackage = true;\n }\n if (messageTypeSpecificFlags & 0x04) {\n response.event = payload.readInt32BE(0);\n payload = payload.slice(4);\n }\n\n // 解析 message type\n if (messageType === MessageType.SERVER_FULL_RESPONSE) {\n response.payloadSize = payload.readUInt32BE(0);\n payload = payload.slice(4);\n } else if (messageType === MessageType.SERVER_ERROR_RESPONSE) {\n response.code = payload.readInt32BE(0);\n response.payloadSize = payload.readUInt32BE(4);\n payload = payload.slice(8);\n }\n\n if (payload.length === 0) {\n return response;\n }\n\n // 解压缩\n if (messageCompression === CompressionType.GZIP) {\n try {\n payload = gunzipSync(payload);\n } catch {\n return response;\n }\n }\n\n // 解析 payload\n try {\n if (serializationMethod === SerializationType.JSON) {\n const payloadStr = payload.toString('utf-8');\n response.payloadMsg = JSON.parse(payloadStr);\n }\n } catch {\n // 忽略解析错误\n }\n\n return response;\n}\n\n/**\n * 错误码定义\n */\nexport enum SAUCErrCode {\n SUCCESS = 20000000,\n INVALID_REQUEST = 45000001,\n EMPTY_AUDIO = 45000002,\n TIMEOUT = 45000081,\n INVALID_AUDIO_FORMAT = 45000151,\n SERVER_BUSY = 55000031,\n}\n\n/**\n * 获取错误码描述\n */\nexport function getErrorMessage(code: number): string {\n switch (code) {\n case SAUCErrCode.SUCCESS:\n return '成功';\n case SAUCErrCode.INVALID_REQUEST:\n return '请求参数无效';\n case SAUCErrCode.EMPTY_AUDIO:\n return '空音频';\n case SAUCErrCode.TIMEOUT:\n return '等包超时';\n case SAUCErrCode.INVALID_AUDIO_FORMAT:\n return '音频格式不正确';\n case SAUCErrCode.SERVER_BUSY:\n return '服务器繁忙';\n default:\n if (code >= 55000000 && code < 56000000) {\n return '服务内部处理错误';\n }\n return `未知错误: ${code}`;\n }\n}\n","import { Buffer } from 'node:buffer';\nimport WebSocket from 'ws';\nimport { BaseASR } from '@/asr/base';\nimport {\n buildAudioOnlyRequest,\n buildAuthHeaders,\n buildFullClientRequest,\n type FullClientRequestParams,\n getErrorMessage,\n parseResponse,\n} from '@/asr/protocols/sauc';\nimport { bufferToAudioStream, DEFAULT_SAMPLE_RATE } from '@/asr/utils/audio';\nimport type {\n ASRConnection,\n ASRConnectionState,\n ASRConnectOptions,\n ASRResponse,\n ASRSegment,\n ASRStreamChunk,\n AudioStream,\n AudioStreamInput,\n DoubaoASROptions,\n ListenInstanceOptions,\n} from '@/types/asr';\n\n/**\n * 豆包 ASR 提供商\n * 使用 WebSocket 二进制协议实现语音识别\n */\nexport class DoubaoASR extends BaseASR {\n name = 'doubao';\n\n // 豆包专用配置\n public appKey: string;\n public accessKey: string;\n public resourceId: string;\n public mode: 'streaming' | 'nostream' | 'async';\n\n // 音频配置\n public sampleRate: number;\n public bits: number;\n public channel: number;\n public segmentDuration: number;\n\n // 识别配置\n public enableItn: boolean;\n public enablePunc: boolean;\n public enableDdc: boolean;\n public showUtterances: boolean;\n\n // VAD 配置\n public endWindowSize?: number;\n public enableNonstream?: boolean;\n public vadSegmentDuration?: number;\n public forceToSpeechTime?: number;\n\n constructor(options: DoubaoASROptions) {\n super(options);\n\n // 豆包专用配置\n this.appKey = options.appKey || '';\n this.accessKey = options.accessKey || options.apiKey || '';\n this.resourceId = options.resourceId || 'volc.bigasr.sauc.duration';\n this.mode = options.mode || 'streaming';\n\n // 音频格式配置\n const audioFormat = options.audioFormat || {};\n this.sampleRate = audioFormat.sampleRate || DEFAULT_SAMPLE_RATE;\n this.bits = audioFormat.bits || 16;\n this.channel = audioFormat.channel || 1;\n this.segmentDuration = options.segmentDuration || 200;\n\n // 识别配置\n this.enableItn = options.enableItn ?? true;\n this.enablePunc = options.enablePunc ?? true;\n this.enableDdc = options.enableDdc ?? false;\n this.showUtterances = options.showUtterances ?? true;\n\n // VAD 配置\n this.endWindowSize = options.endWindowSize;\n this.enableNonstream = options.enableNonstream;\n this.vadSegmentDuration = options.vadSegmentDuration;\n this.forceToSpeechTime = options.forceToSpeechTime;\n\n // WebSocket 基础 URL\n this.baseUrl = options.baseUrl || 'wss://openspeech.bytedance.com/api/v3/sauc';\n }\n\n /**\n * 获取 WebSocket URL\n */\n private getWebSocketUrl(): string {\n switch (this.mode) {\n case 'streaming':\n return `${this.baseUrl}/bigmodel`;\n case 'async':\n return `${this.baseUrl}/bigmodel_async`;\n default:\n return `${this.baseUrl}/bigmodel_nostream`;\n }\n }\n\n /**\n * 等待 WebSocket 连接建立\n */\n private waitForConnection(ws: WebSocket): Promise<void> {\n return new Promise((resolve, reject) => {\n ws.once('open', () => resolve());\n ws.once('error', (error) => reject(error));\n });\n }\n\n /**\n * 接收 WebSocket 消息\n */\n private receiveMessage(ws: WebSocket): Promise<ReturnType<typeof parseResponse>> {\n return new Promise((resolve, reject) => {\n const handleMessage = (data: WebSocket.RawData) => {\n ws.off('message', handleMessage);\n ws.off('error', handleError);\n\n try {\n const buffer = Buffer.isBuffer(data) ? data : Buffer.from(data as ArrayBuffer);\n const response = parseResponse(buffer);\n resolve(response);\n } catch (error) {\n reject(error);\n }\n };\n\n const handleError = (error: Error) => {\n ws.off('message', handleMessage);\n ws.off('error', handleError);\n reject(error);\n };\n\n ws.on('message', handleMessage);\n ws.on('error', handleError);\n });\n }\n\n /**\n * 构建 Full Client Request 参数\n * 使用实例属性配置音频格式,支持 PCM、OGG/Opus 等格式\n */\n private buildFullClientRequestParams(): FullClientRequestParams {\n return {\n user: {\n uid: 'univoice-sdk',\n },\n audio: {\n format: this.format,\n codec: this.codec,\n rate: this.sampleRate,\n bits: this.bits,\n channel: this.channel,\n language: this.language,\n },\n request: {\n model_name: 'bigmodel',\n enable_itn: this.enableItn,\n enable_punc: this.enablePunc,\n enable_ddc: this.enableDdc,\n show_utterances: this.showUtterances,\n // VAD 参数:仅在有值时传递,未传则使用服务端默认值\n ...(this.endWindowSize !== undefined && { end_window_size: this.endWindowSize }),\n ...(this.enableNonstream !== undefined && { enable_nonstream: this.enableNonstream }),\n ...(this.vadSegmentDuration !== undefined && {\n vad_segment_duration: this.vadSegmentDuration,\n }),\n ...(this.forceToSpeechTime !== undefined && {\n force_to_speech_time: this.forceToSpeechTime,\n }),\n },\n };\n }\n\n /**\n * 创建响应队列\n * 用于解耦发送和接收逻辑\n */\n private createResponseQueue() {\n const queue: {\n items: ASRStreamChunk[];\n resolve: ((value: ASRStreamChunk | null) => void) | null;\n done: boolean;\n error: Error | null;\n } = {\n items: [],\n resolve: null,\n done: false,\n error: null,\n };\n\n return {\n push: (item: ASRStreamChunk) => {\n if (queue.resolve) {\n queue.resolve(item);\n queue.resolve = null;\n } else {\n queue.items.push(item);\n }\n },\n next: async (): Promise<ASRStreamChunk | null> => {\n if (queue.items.length > 0) {\n const item = queue.items.shift();\n return item ?? null;\n }\n if (queue.done) {\n return null;\n }\n return new Promise((resolve) => {\n queue.resolve = resolve;\n });\n },\n complete: () => {\n queue.done = true;\n if (queue.resolve) {\n queue.resolve(null);\n queue.resolve = null;\n }\n },\n error: (err: Error) => {\n queue.error = err;\n if (queue.resolve) {\n queue.resolve(null);\n queue.resolve = null;\n }\n },\n getError: () => queue.error,\n };\n }\n\n /**\n * 设置 WebSocket 消息处理器\n * 事件驱动模式,不阻塞主流程\n */\n private setupMessageHandler(ws: WebSocket, queue: ReturnType<typeof this.createResponseQueue>) {\n const handleMessage = (data: WebSocket.RawData) => {\n try {\n const buffer = Buffer.isBuffer(data) ? data : Buffer.from(data as ArrayBuffer);\n const response = parseResponse(buffer);\n\n if (response.code !== 0) {\n queue.error(new Error(`ASR error: ${getErrorMessage(response.code)}`));\n return;\n }\n\n if (response.payloadMsg?.result) {\n const result = response.payloadMsg.result;\n const chunk: ASRStreamChunk = {\n text: result.text,\n isFinal: response.isLastPackage,\n };\n\n if (result.utterances && result.utterances.length > 0) {\n const utt = result.utterances[0];\n chunk.segment = {\n id: 0,\n start: utt.start_time,\n end: utt.end_time,\n text: utt.text,\n confidence: utt.definite ? 1.0 : 0.8,\n };\n }\n\n queue.push(chunk);\n }\n\n if (response.isLastPackage) {\n queue.complete();\n }\n } catch (err) {\n queue.error(err instanceof Error ? err : new Error(String(err)));\n }\n };\n\n ws.on('message', handleMessage);\n\n return () => {\n ws.off('message', handleMessage);\n };\n }\n\n /**\n * 发送音频流\n * 作为后台任务运行,不阻塞主流程\n */\n private async sendAudioStream(\n ws: WebSocket,\n audio: AudioStream,\n initialSequence: number\n ): Promise<number> {\n let sequence = initialSequence;\n\n for await (const chunk of audio) {\n const data = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n const audioRequest = buildAudioOnlyRequest(sequence, data, false);\n ws.send(audioRequest);\n sequence++;\n }\n\n // 发送结束标记\n const lastRequest = buildAudioOnlyRequest(sequence, Buffer.alloc(0), true);\n ws.send(lastRequest);\n\n return sequence;\n }\n\n /**\n * 流式输入识别方法\n * 接收音频流进行识别,实现双向通信:边发边收\n */\n async *listenStream(audio: AudioStream): AsyncIterable<ASRStreamChunk> {\n // 验证必要参数\n if (!this.appKey) {\n throw new Error('appKey is required for Doubao ASR');\n }\n if (!this.accessKey) {\n throw new Error('accessKey is required for Doubao ASR');\n }\n\n // 创建 WebSocket 连接\n const url = this.getWebSocketUrl();\n const headers = buildAuthHeaders({\n appKey: this.appKey,\n accessKey: this.accessKey,\n resourceId: this.resourceId,\n });\n\n const ws = new WebSocket(url, { headers });\n\n try {\n // 等待连接建立\n await this.waitForConnection(ws);\n\n // 发送 Full Client Request 并等待确认\n let sequence = 1;\n const fullClientRequest = buildFullClientRequest(\n this.buildFullClientRequestParams(),\n sequence++\n );\n ws.send(fullClientRequest);\n\n const initResponse = await this.receiveMessage(ws);\n if (initResponse.code !== 0) {\n throw new Error(`Init failed: ${getErrorMessage(initResponse.code)}`);\n }\n\n yield* this.listenStreamOnConnection(ws, audio, { value: sequence });\n } finally {\n ws.close();\n }\n }\n\n /**\n * 预建立 WebSocket 连接\n * 建立 WebSocket 连接并发送 FullClientRequest(SAUC 协议的连接级别初始化)\n */\n override async connect(options?: ASRConnectOptions): Promise<ASRConnection> {\n if (!this.appKey) {\n throw new Error('appKey is required for Doubao ASR');\n }\n if (!this.accessKey) {\n throw new Error('accessKey is required for Doubao ASR');\n }\n\n const timeout = options?.timeout ?? 10000;\n\n const url = this.getWebSocketUrl();\n const headers = buildAuthHeaders({\n appKey: this.appKey,\n accessKey: this.accessKey,\n resourceId: this.resourceId,\n });\n\n const ws = new WebSocket(url, { headers });\n\n // 带超时的连接等待\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`Connection timed out after ${timeout}ms`));\n ws.close();\n }, timeout);\n\n ws.once('open', () => {\n clearTimeout(timer);\n resolve();\n });\n\n ws.once('error', (err) => {\n clearTimeout(timer);\n reject(err);\n });\n });\n\n // 发送 FullClientRequest(连接级别初始化)\n let sequence = 1;\n const fullClientRequest = buildFullClientRequest(\n this.buildFullClientRequestParams(),\n sequence++\n );\n ws.send(fullClientRequest);\n\n // 等待初始化确认\n const initResponse = await this.receiveMessage(ws);\n if (initResponse.code !== 0) {\n ws.close();\n throw new Error(`Init failed: ${getErrorMessage(initResponse.code)}`);\n }\n\n return new DoubaoASRConnection(ws, this, sequence);\n }\n\n /**\n * 在已建立的 WebSocket 连接上进行流式识别\n * 不创建/关闭 WebSocket,不发送 FullClientRequest\n */\n async *listenStreamOnConnection(\n ws: WebSocket,\n audio: AudioStream,\n seqHolder: { value: number }\n ): AsyncIterable<ASRStreamChunk> {\n const queue = this.createResponseQueue();\n let cleanup: (() => void) | undefined;\n\n try {\n cleanup = this.setupMessageHandler(ws, queue);\n\n const sendPromise = this.sendAudioStream(ws, audio, seqHolder.value);\n\n while (true) {\n const chunk = await queue.next();\n\n if (chunk === null) {\n break;\n }\n\n yield chunk;\n\n if (chunk.isFinal) {\n break;\n }\n }\n\n const finalSeq = await sendPromise;\n // 更新序列号持有者,供下次 listen 使用\n seqHolder.value = finalSeq + 1;\n\n const queueError = queue.getError();\n if (queueError) {\n throw queueError;\n }\n } finally {\n cleanup?.();\n }\n }\n}\n\n/**\n * 豆包 ASR 连接实例\n * 通过 DoubaoASR.connect() 获取,持有已建立的 WebSocket 连接\n */\nclass DoubaoASRConnection implements ASRConnection {\n private _state: ASRConnectionState = 'connected';\n private seqHolder: { value: number };\n\n constructor(\n private ws: WebSocket,\n private provider: DoubaoASR,\n initialSequence: number\n ) {\n this.seqHolder = { value: initialSequence };\n }\n\n get state(): ASRConnectionState {\n if (this.ws.readyState === WebSocket.CLOSED || this.ws.readyState === WebSocket.CLOSING) {\n return 'closed';\n }\n return this._state;\n }\n\n listen(\n audio: AudioStreamInput,\n options: ListenInstanceOptions & { stream: true }\n ): AsyncIterable<ASRStreamChunk>;\n\n listen(\n audio: AudioStreamInput,\n options?: ListenInstanceOptions & { stream?: false }\n ): Promise<ASRResponse>;\n\n listen(\n audio: AudioStreamInput,\n options?: ListenInstanceOptions\n ): Promise<ASRResponse> | AsyncIterable<ASRStreamChunk> {\n this.ensureConnected();\n\n const audioStream = this.adaptAudioInput(audio);\n\n if (options?.stream === true) {\n return this.provider.listenStreamOnConnection(this.ws, audioStream, this.seqHolder);\n }\n return this.collectResponse(audioStream);\n }\n\n close(): void {\n if (this.ws.readyState === WebSocket.OPEN) {\n this.ws.close();\n }\n this._state = 'closed';\n }\n\n private ensureConnected(): void {\n if (this.state !== 'connected') {\n throw new Error('Connection is closed');\n }\n }\n\n private adaptAudioInput(audio: AudioStreamInput): AudioStream {\n if (audio !== null && typeof audio === 'object' && Symbol.asyncIterator in audio) {\n return audio;\n }\n if (typeof audio === 'string') {\n throw new Error('DoubaoASR connection does not support file path input');\n }\n return bufferToAudioStream(audio);\n }\n\n private async collectResponse(audioStream: AudioStream): Promise<ASRResponse> {\n const segments: ASRSegment[] = [];\n const textParts: string[] = [];\n\n for await (const chunk of this.provider.listenStreamOnConnection(\n this.ws,\n audioStream,\n this.seqHolder\n )) {\n if (chunk.isFinal && chunk.text) {\n textParts.push(chunk.text);\n }\n if (chunk.segment) {\n segments.push(chunk.segment);\n }\n }\n\n return {\n text: textParts.join(''),\n segments: segments.length > 0 ? segments : undefined,\n };\n }\n}\n","import { BaseASR } from '@/asr/base';\nimport type { ASRStreamChunk, AudioStream, BaseASROptions } from '@/types/asr';\n\nexport class GeminiASR extends BaseASR {\n name = 'gemini';\n\n constructor(options: BaseASROptions) {\n super(options);\n this.baseUrl = options.baseUrl || 'https://generativelanguage.googleapis.com/v1beta';\n this.model = options.model || 'gemini-asr';\n }\n\n // biome-ignore lint/correctness/useYield: TODO 待实现\n async *listenStream(_audio: AudioStream): AsyncIterable<ASRStreamChunk> {\n throw new Error('Gemini ASR listenStream method is not implemented yet');\n }\n}\n","import { BaseASR } from '@/asr/base';\nimport type { ASRStreamChunk, AudioStream, BaseASROptions } from '@/types/asr';\n\nexport class MinimaxASR extends BaseASR {\n name = 'minimax';\n\n constructor(options: BaseASROptions) {\n super(options);\n this.baseUrl = options.baseUrl || 'https://api.minimax.chat/v1';\n this.model = options.model || 'speech-01';\n }\n\n // biome-ignore lint/correctness/useYield: TODO 待实现\n async *listenStream(_audio: AudioStream): AsyncIterable<ASRStreamChunk> {\n throw new Error('Minimax ASR listenStream method is not implemented yet');\n }\n}\n","import { BaseASR } from '@/asr/base';\nimport type { ASRStreamChunk, AudioStream, BaseASROptions } from '@/types/asr';\n\nexport class WhisperASR extends BaseASR {\n name = 'openai';\n\n constructor(options: BaseASROptions) {\n super(options);\n this.baseUrl = options.baseUrl || 'https://api.openai.com/v1';\n this.model = options.model || 'whisper-1';\n }\n\n // biome-ignore lint/correctness/useYield: TODO 待实现\n async *listenStream(_audio: AudioStream): AsyncIterable<ASRStreamChunk> {\n throw new Error('OpenAI ASR listenStream method is not implemented yet');\n }\n}\n","import { Buffer } from 'node:buffer';\nimport WebSocket from 'ws';\n\n/**\n * DashScope Paraformer ASR WebSocket API 协议实现\n * 参考文档: https://help.aliyun.com/zh/model-studio/websocket-for-paraformer-real-time-service\n */\n\n/**\n * 任务状态\n */\nexport enum TaskStatus {\n Pending = 'Pending',\n Running = 'Running',\n Completed = 'Completed',\n Failed = 'Failed',\n}\n\n/**\n * WebSocket 消息类型\n */\nexport type ASRMessage = RunTaskMessage | FinishTaskMessage;\n\n/**\n * run-task 消息 - 启动 ASR 任务\n */\nexport interface RunTaskMessage {\n header: {\n task_id: string;\n action: 'run-task';\n streaming: 'duplex';\n };\n payload: {\n task_group: 'audio';\n task: 'asr';\n function: 'recognition';\n model: string;\n parameters: {\n format: string;\n sample_rate?: number;\n language_hints?: string[];\n enable_words?: boolean;\n enable_punctuation_prediction?: boolean;\n enable_inverse_text_normalization?: boolean;\n punctuation_map?: Record<string, string>;\n };\n input: Record<string, never>;\n };\n}\n\n/**\n * finish-task 消息 - 结束任务\n */\nexport interface FinishTaskMessage {\n header: {\n task_id: string;\n action: 'finish-task';\n streaming: 'duplex';\n };\n payload: {\n input: Record<string, never>;\n };\n}\n\n/**\n * 服务端响应事件类型\n */\nexport type ASREvent =\n | TaskStartedEvent\n | ResultGeneratedEvent\n | TaskFinishedEvent\n | TaskFailedEvent;\n\n/**\n * task-started 事件\n */\nexport interface TaskStartedEvent {\n header: {\n task_id: string;\n event: 'task-started';\n };\n payload: Record<string, never>;\n}\n\n/**\n * result-generated 事件 - 包含识别结果\n */\nexport interface ResultGeneratedEvent {\n header: {\n task_id: string;\n event: 'result-generated';\n task_status: TaskStatus;\n };\n payload: {\n output: {\n sentence: {\n text: string;\n start_time?: number;\n end_time?: number;\n confidence?: number;\n /** 句子是否结束 */\n sentence_end?: boolean;\n words?: Array<{\n text: string;\n start_time: number;\n end_time: number;\n confidence?: number;\n }>;\n };\n };\n };\n}\n\n/**\n * task-finished 事件\n */\nexport interface TaskFinishedEvent {\n header: {\n task_id: string;\n event: 'task-finished';\n task_status: TaskStatus;\n };\n payload: {\n output: {\n sentence?: {\n text: string;\n start_time?: number;\n end_time?: number;\n confidence?: number;\n };\n };\n usage?: {\n duration: number;\n };\n };\n}\n\n/**\n * task-failed 事件\n */\nexport interface TaskFailedEvent {\n header: {\n task_id: string;\n event: 'task-failed';\n task_status: TaskStatus;\n error_code: string;\n error_message: string;\n };\n payload: Record<string, never>;\n}\n\n/**\n * 服务端响应\n */\nexport type ServerResponse = ASREvent;\n\n/**\n * 创建 run-task 消息\n */\nexport function createRunTaskMessage(\n taskId: string,\n options: {\n model: string;\n format: string;\n sampleRate?: number;\n languageHints?: string[];\n enableWords?: boolean;\n enablePunctuationPrediction?: boolean;\n enableInverseTextNormalization?: boolean;\n }\n): RunTaskMessage {\n return {\n header: {\n task_id: taskId,\n action: 'run-task',\n streaming: 'duplex',\n },\n payload: {\n task_group: 'audio',\n task: 'asr',\n function: 'recognition',\n model: options.model,\n parameters: {\n format: options.format,\n ...(options.sampleRate ? { sample_rate: options.sampleRate } : {}),\n ...(options.languageHints ? { language_hints: options.languageHints } : {}),\n ...(options.enableWords !== undefined ? { enable_words: options.enableWords } : {}),\n ...(options.enablePunctuationPrediction !== undefined\n ? { enable_punctuation_prediction: options.enablePunctuationPrediction }\n : {}),\n ...(options.enableInverseTextNormalization !== undefined\n ? { enable_inverse_text_normalization: options.enableInverseTextNormalization }\n : {}),\n },\n input: {},\n },\n };\n}\n\n/**\n * 创建 finish-task 消息\n */\nexport function createFinishTaskMessage(taskId: string): FinishTaskMessage {\n return {\n header: {\n task_id: taskId,\n action: 'finish-task',\n streaming: 'duplex',\n },\n payload: {\n input: {},\n },\n };\n}\n\n/**\n * 解析服务端响应\n */\nexport function parseServerResponse(data: WebSocket.Data): ServerResponse {\n let text: string;\n if (Buffer.isBuffer(data)) {\n text = data.toString('utf8');\n } else if (data instanceof ArrayBuffer) {\n text = new TextDecoder().decode(data);\n } else if (Array.isArray(data)) {\n text = Buffer.concat(data).toString('utf8');\n } else {\n text = String(data);\n }\n return JSON.parse(text) as ServerResponse;\n}\n\n/**\n * 检查是否是结果生成事件\n */\nexport function isResultGeneratedEvent(event: ServerResponse): event is ResultGeneratedEvent {\n return event.header.event === 'result-generated';\n}\n\n/**\n * 检查是否是完成事件\n */\nexport function isFinishedEvent(event: ServerResponse): event is TaskFinishedEvent {\n return event.header.event === 'task-finished';\n}\n\n/**\n * 检查是否是失败事件\n */\nexport function isFailedEvent(event: ServerResponse): event is TaskFailedEvent {\n return event.header.event === 'task-failed';\n}\n\n/**\n * 等待 task-started 事件\n */\nexport async function waitForTaskStarted(ws: WebSocket): Promise<void> {\n const msg = await receiveResponse(ws);\n if (msg.header.event !== 'task-started') {\n if (isFailedEvent(msg)) {\n throw new Error(`ASR task failed: ${msg.header.error_code} - ${msg.header.error_message}`);\n }\n throw new Error(`Unexpected event: ${msg.header.event}, expected task-started`);\n }\n}\n\n/**\n * WebSocket 状态管理\n */\ninterface WebSocketState {\n queue: ServerResponse[];\n callbacks: ((msg: ServerResponse) => void)[];\n}\n\nconst wsStates = new Map<WebSocket, WebSocketState>();\n\nfunction getOrCreateState(ws: WebSocket): WebSocketState {\n let state = wsStates.get(ws);\n if (!state) {\n state = { queue: [], callbacks: [] };\n wsStates.set(ws, state);\n }\n return state;\n}\n\nfunction setupMessageHandler(ws: WebSocket) {\n if (!wsStates.has(ws)) {\n const state = getOrCreateState(ws);\n\n ws.on('message', (data: WebSocket.Data) => {\n try {\n const msg = parseServerResponse(data);\n\n if (state.callbacks.length > 0) {\n const callback = state.callbacks.shift();\n if (callback) callback(msg);\n } else {\n state.queue.push(msg);\n }\n } catch (error) {\n console.error('Error parsing ASR message:', error);\n }\n });\n\n ws.on('close', () => {\n wsStates.delete(ws);\n });\n }\n}\n\n/**\n * 接收服务端消息\n */\nexport async function receiveResponse(ws: WebSocket): Promise<ServerResponse> {\n setupMessageHandler(ws);\n\n return new Promise((resolve, reject) => {\n const state = wsStates.get(ws);\n if (!state) {\n reject(new Error('WebSocket state not found'));\n return;\n }\n\n if (state.queue.length > 0) {\n const msg = state.queue.shift();\n if (msg) {\n resolve(msg);\n return;\n }\n }\n\n const errorHandler = (error: WebSocket.ErrorEvent) => {\n const index = state.callbacks.indexOf(resolver);\n if (index !== -1) {\n state.callbacks.splice(index, 1);\n }\n reject(error);\n };\n\n const resolver = (msg: ServerResponse) => {\n ws.removeListener('error', errorHandler);\n resolve(msg);\n };\n\n state.callbacks.push(resolver);\n ws.once('error', errorHandler);\n });\n}\n\n/**\n * 发送消息\n */\nexport async function sendMessage(ws: WebSocket, message: ASRMessage): Promise<void> {\n const data = JSON.stringify(message);\n return new Promise((resolve, reject) => {\n ws.send(data, (error?: Error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n}\n\n/**\n * 发送二进制音频数据\n */\nexport async function sendBinaryData(ws: WebSocket, data: Buffer | Uint8Array): Promise<void> {\n return new Promise((resolve, reject) => {\n ws.send(data, (error?: Error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n}\n","import { Buffer } from 'node:buffer';\nimport { randomUUID } from 'node:crypto';\nimport { readFile } from 'node:fs/promises';\nimport WebSocket from 'ws';\nimport { BaseASR } from '@/asr/base';\nimport {\n createFinishTaskMessage,\n createRunTaskMessage,\n isFailedEvent,\n isFinishedEvent,\n isResultGeneratedEvent,\n parseServerResponse,\n sendBinaryData,\n sendMessage,\n waitForTaskStarted,\n} from '@/asr/protocols/dashscope';\nimport { detectSampleRate } from '@/asr/utils/audio';\nimport type {\n ASRConnection,\n ASRConnectionState,\n ASRConnectOptions,\n ASRResponse,\n ASRSegment,\n ASRStreamChunk,\n AudioStream,\n AudioStreamInput,\n ListenInstanceOptions,\n QwenASROptions,\n} from '@/types/asr';\n\n/**\n * Qwen ASR 提供商\n * 基于阿里云 DashScope Paraformer WebSocket API 实现语音识别\n *\n * 支持的模型:\n * - paraformer-realtime-v2 (推荐:支持多语言、任意采样率)\n * - paraformer-realtime-8k-v1 (支持 8kHz 采样率)\n * - paraformer-realtime-v1 (支持 16kHz 采样率)\n */\nexport class QwenASR extends BaseASR {\n name = 'qwen';\n\n /** 采样率 */\n public sampleRate?: number;\n /** 是否启用词级时间戳 */\n public enableWords?: boolean;\n /** 是否启用标点预测 */\n public enablePunctuationPrediction?: boolean;\n /** 是否启用逆文本规范化 */\n public enableInverseTextNormalization?: boolean;\n\n constructor(options: QwenASROptions) {\n super(options);\n // WebSocket API 地址\n this.baseUrl = options.baseUrl || 'wss://dashscope.aliyuncs.com/api-ws/v1/inference/';\n // 默认使用 paraformer-realtime-v2(支持多语言、任意采样率)\n this.model = options.model || 'paraformer-realtime-v2';\n\n // 音频配置\n this.sampleRate = options.audioFormat?.sampleRate;\n\n // 识别配置\n this.enableWords = options.enableWords;\n this.enablePunctuationPrediction = options.enablePunc;\n this.enableInverseTextNormalization = options.enableItn;\n }\n\n /**\n * 构建认证请求头\n */\n private buildAuthHeaders(): Record<string, string> {\n return {\n Authorization: `Bearer ${this.apiKey}`,\n };\n }\n\n /**\n * 将语言代码转换为 language_hints 格式\n * 例如: 'zh-CN' -> ['zh'], 'en-US' -> ['en']\n */\n private getLanguageHints(): string[] | undefined {\n if (!this.language) return undefined;\n\n // 提取语言主代码\n const langMap: Record<string, string> = {\n 'zh-CN': 'zh',\n 'zh-TW': 'zh',\n 'zh-HK': 'zh',\n 'en-US': 'en',\n 'en-GB': 'en',\n 'ja-JP': 'ja',\n 'ko-KR': 'ko',\n 'de-DE': 'de',\n 'fr-FR': 'fr',\n 'es-ES': 'es',\n 'ru-RU': 'ru',\n 'pt-BR': 'pt',\n 'it-IT': 'it',\n 'nl-NL': 'nl',\n 'pl-PL': 'pl',\n 'tr-TR': 'tr',\n 'vi-VN': 'vi',\n 'th-TH': 'th',\n 'ar-SA': 'ar',\n };\n\n const hint = langMap[this.language] || this.language.split('-')[0];\n return [hint];\n }\n\n /**\n * 创建响应队列\n * 用于解耦发送和接收逻辑\n */\n private createResponseQueue() {\n const queue: {\n items: ASRStreamChunk[];\n resolve: ((value: ASRStreamChunk | null) => void) | null;\n done: boolean;\n error: Error | null;\n } = {\n items: [],\n resolve: null,\n done: false,\n error: null,\n };\n\n return {\n push: (item: ASRStreamChunk) => {\n if (queue.resolve) {\n queue.resolve(item);\n queue.resolve = null;\n } else {\n queue.items.push(item);\n }\n },\n next: async (): Promise<ASRStreamChunk | null> => {\n if (queue.items.length > 0) {\n const item = queue.items.shift();\n return item ?? null;\n }\n if (queue.done) {\n return null;\n }\n return new Promise((resolve) => {\n queue.resolve = resolve;\n });\n },\n complete: () => {\n queue.done = true;\n if (queue.resolve) {\n queue.resolve(null);\n queue.resolve = null;\n }\n },\n error: (err: Error) => {\n queue.error = err;\n if (queue.resolve) {\n queue.resolve(null);\n queue.resolve = null;\n }\n },\n getError: () => queue.error,\n };\n }\n\n /**\n * 设置 WebSocket 消息处理器\n * 事件驱动模式,不阻塞主流程\n */\n private setupMessageHandler(ws: WebSocket, queue: ReturnType<typeof this.createResponseQueue>) {\n const handleMessage = (data: WebSocket.RawData) => {\n try {\n const buffer = Buffer.isBuffer(data) ? data : Buffer.from(data as ArrayBuffer);\n const event = parseServerResponse(buffer);\n\n // 处理失败事件\n if (isFailedEvent(event)) {\n queue.error(\n new Error(`ASR task failed: ${event.header.error_code} - ${event.header.error_message}`)\n );\n return;\n }\n\n // 处理完成事件\n if (isFinishedEvent(event)) {\n // 可能有最后一个句子\n if (event.payload.output?.sentence) {\n const sentence = event.payload.output.sentence;\n const chunk: ASRStreamChunk = {\n text: sentence.text,\n isFinal: true,\n confidence: sentence.confidence,\n };\n\n if (sentence.start_time !== undefined && sentence.end_time !== undefined) {\n chunk.segment = {\n id: 0,\n start: sentence.start_time,\n end: sentence.end_time,\n text: sentence.text,\n confidence: sentence.confidence,\n };\n }\n\n queue.push(chunk);\n }\n queue.complete();\n return;\n }\n\n // 处理结果生成事件\n if (isResultGeneratedEvent(event)) {\n const sentence = event.payload.output.sentence;\n const chunk: ASRStreamChunk = {\n text: sentence.text,\n // 使用 sentence_end 字段判断是否为最终结果\n isFinal: sentence.sentence_end === true,\n confidence: sentence.confidence,\n };\n\n // 构建分段信息\n if (sentence.start_time !== undefined && sentence.end_time !== undefined) {\n chunk.segment = {\n id: 0,\n start: sentence.start_time,\n end: sentence.end_time,\n text: sentence.text,\n confidence: sentence.confidence,\n } as ASRSegment;\n }\n\n queue.push(chunk);\n }\n } catch (err) {\n queue.error(err instanceof Error ? err : new Error(String(err)));\n }\n };\n\n ws.on('message', handleMessage);\n\n // 处理连接关闭事件\n const handleClose = (_code: number, _reason: Buffer) => {\n // 如果队列还没有完成,说明连接意外关闭\n if (!queue.getError()) {\n queue.complete();\n }\n };\n\n // 处理连接错误事件\n const handleError = (err: Error) => {\n queue.error(err);\n };\n\n ws.on('close', handleClose);\n ws.on('error', handleError);\n\n return () => {\n ws.off('message', handleMessage);\n ws.off('close', handleClose);\n ws.off('error', handleError);\n };\n }\n\n /**\n * 发送音频流\n * 作为后台任务运行,不阻塞主流程\n */\n private async sendAudioStream(ws: WebSocket, audio: AudioStream): Promise<void> {\n for await (const chunk of audio) {\n const data = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n await sendBinaryData(ws, data);\n }\n }\n\n /**\n * 流式输入识别方法\n * 接收音频流进行识别,实现双向通信:边发边收\n *\n * @param audio 音频流\n * @param detectedSampleRate 可选的检测到的采样率(优先于实例的 sampleRate)\n */\n async *listenStream(\n audio: AudioStream,\n detectedSampleRate?: number\n ): AsyncIterable<ASRStreamChunk> {\n // 验证必要参数\n if (!this.apiKey) {\n throw new Error('apiKey is required for Qwen ASR');\n }\n\n // 使用传入的采样率或实例的采样率\n const sampleRate = detectedSampleRate ?? this.sampleRate;\n\n // 创建 WebSocket 连接\n const ws = new WebSocket(this.baseUrl, {\n headers: this.buildAuthHeaders(),\n });\n\n try {\n // 等待连接建立\n await new Promise<void>((resolve, reject) => {\n ws.on('open', resolve);\n ws.on('error', reject);\n });\n\n yield* this.listenStreamOnConnection(ws, audio, sampleRate);\n } finally {\n ws.close();\n }\n }\n\n /**\n * 预建立 WebSocket 连接\n * 只建立连接,不发送协议级初始化(DashScope 的 run-task 是 task 级别,每次 listen 时才发送)\n */\n override async connect(options?: ASRConnectOptions): Promise<ASRConnection> {\n if (!this.apiKey) {\n throw new Error('apiKey is required for Qwen ASR');\n }\n\n const timeout = options?.timeout ?? 10000;\n\n const ws = new WebSocket(this.baseUrl, {\n headers: this.buildAuthHeaders(),\n });\n\n // 带超时的连接等待\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`Connection timed out after ${timeout}ms`));\n ws.close();\n }, timeout);\n\n ws.once('open', () => {\n clearTimeout(timer);\n resolve();\n });\n\n ws.once('error', (err) => {\n clearTimeout(timer);\n reject(err);\n });\n });\n\n return new QwenASRConnection(ws, this);\n }\n\n /**\n * 在已建立的 WebSocket 连接上进行流式识别\n * 从 listenStream 中提取的核心逻辑,不创建/关闭 WebSocket\n */\n async *listenStreamOnConnection(\n ws: WebSocket,\n audio: AudioStream,\n detectedSampleRate?: number\n ): AsyncIterable<ASRStreamChunk> {\n const sampleRate = detectedSampleRate ?? this.sampleRate;\n\n // 创建响应队列\n const queue = this.createResponseQueue();\n\n // 设置消息处理器(事件驱动,不阻塞)\n let cleanup: (() => void) | undefined;\n\n try {\n cleanup = this.setupMessageHandler(ws, queue);\n\n // 生成任务 ID\n const taskId = randomUUID();\n\n // 发送 run-task 指令\n const runTaskMsg = createRunTaskMessage(taskId, {\n model: this.model,\n format: this.format || 'mp3',\n sampleRate,\n languageHints: this.getLanguageHints(),\n enableWords: this.enableWords,\n enablePunctuationPrediction: this.enablePunctuationPrediction,\n enableInverseTextNormalization: this.enableInverseTextNormalization,\n });\n await sendMessage(ws, runTaskMsg);\n\n // 等待 task-started 事件\n await waitForTaskStarted(ws);\n\n // 启动发送任务,完成后发送 finish-task\n const sendWithFinishPromise = this.sendAudioStream(ws, audio).then(async () => {\n const finishTaskMsg = createFinishTaskMessage(taskId);\n await sendMessage(ws, finishTaskMsg);\n });\n\n // 从队列 yield 响应(边发边收)\n while (true) {\n const chunk = await queue.next();\n\n if (chunk === null) {\n break;\n }\n\n yield chunk;\n }\n\n // 等待发送任务和 finish-task 完成\n await sendWithFinishPromise;\n\n // 检查是否有错误\n const queueError = queue.getError();\n if (queueError) {\n throw queueError;\n }\n } finally {\n cleanup?.();\n }\n }\n\n /**\n * 将音频文件路径转换为原始音频流\n * Qwen ASR 原生支持 mp3、wav、pcm 等格式,直接发送原始数据即可\n */\n async *fileToRawAudioStream(filePath: string): AudioStream {\n const buffer = await readFile(filePath);\n // 分块发送,每块约 4KB\n const chunkSize = 4096;\n for (let i = 0; i < buffer.length; i += chunkSize) {\n yield buffer.subarray(i, Math.min(i + chunkSize, buffer.length));\n }\n }\n\n /**\n * 判断输入是否为文件路径\n */\n isFilePath(input: AudioStreamInput): input is string {\n if (typeof input !== 'string') return false;\n // 简单判断:如果字符串看起来像路径就尝试作为文件处理\n return (\n input.includes('/') ||\n input.includes('\\\\') ||\n input.endsWith('.mp3') ||\n input.endsWith('.wav')\n );\n }\n\n /**\n * 重写 listen 方法以支持原始音频文件\n * Qwen ASR 原生支持 mp3、wav、pcm 等格式,不需要转换为 PCM\n */\n listen(\n audio: AudioStreamInput,\n options: ListenInstanceOptions & { stream: true }\n ): AsyncIterable<ASRStreamChunk>;\n\n listen(\n audio: AudioStreamInput,\n options?: ListenInstanceOptions & { stream?: false }\n ): Promise<ASRResponse>;\n\n listen(\n audio: AudioStreamInput,\n options?: ListenInstanceOptions\n ): Promise<ASRResponse> | AsyncIterable<ASRStreamChunk> {\n // 如果是文件路径,使用原始音频流,并自动检测采样率\n if (this.isFilePath(audio)) {\n // 检测文件采样率\n const detectedRate = detectSampleRate(audio);\n const effectiveSampleRate = detectedRate ?? this.sampleRate;\n\n const rawStream = this.fileToRawAudioStream(audio);\n if (options?.stream === true) {\n return this.listenStream(rawStream, effectiveSampleRate);\n }\n return this.collectQwenResponse(rawStream, effectiveSampleRate);\n }\n\n // 其他情况:自行处理\n if (options?.stream === true) {\n return this.createQwenStreamIterable(audio);\n }\n return this.collectQwenResponse(this.adaptQwenAudioInput(audio), this.sampleRate);\n }\n\n /**\n * 判断输入是否为音频流(Qwen 专用)\n */\n private isQwenAudioStream(input: AudioStreamInput): input is AudioStream {\n return input !== null && typeof input === 'object' && Symbol.asyncIterator in input;\n }\n\n /**\n * 判断输入是否为字符串(Qwen 专用)\n */\n private isQwenString(input: AudioStreamInput): input is string {\n return typeof input === 'string';\n }\n\n /**\n * 适配音频输入为音频流(Qwen 专用)\n */\n adaptQwenAudioInput(audio: AudioStreamInput): AudioStream {\n if (this.isQwenAudioStream(audio)) return audio;\n // 对于非文件路径的字符串,使用父类的 PCM 转换\n if (this.isQwenString(audio) && !this.isFilePath(audio)) {\n // 这里返回一个空的音频流,实际不应该走到这个分支\n // 因为 isFilePath 应该已经匹配了所有文件路径\n throw new Error('Invalid audio input: expected file path or audio stream');\n }\n // Buffer 或 Uint8Array:分块发送,每块约 4KB\n const buffer = Buffer.isBuffer(audio) ? audio : Buffer.from(audio);\n const chunkSize = 4096;\n return (async function* () {\n for (let i = 0; i < buffer.length; i += chunkSize) {\n yield buffer.subarray(i, Math.min(i + chunkSize, buffer.length));\n }\n })();\n }\n\n /**\n * 创建流式迭代器(Qwen 专用)\n */\n private async *createQwenStreamIterable(audio: AudioStreamInput): AsyncIterable<ASRStreamChunk> {\n // 对于文件路径,检测采样率\n const sampleRate = this.isFilePath(audio)\n ? (detectSampleRate(audio) ?? this.sampleRate)\n : this.sampleRate;\n const audioStream = this.isFilePath(audio)\n ? this.fileToRawAudioStream(audio)\n : this.adaptQwenAudioInput(audio);\n yield* this.listenStream(audioStream, sampleRate);\n }\n\n /**\n * 收集非流式识别结果(Qwen 专用)\n */\n private async collectQwenResponse(\n audio: AudioStream,\n detectedSampleRate?: number\n ): Promise<ASRResponse> {\n const segments: ASRSegment[] = [];\n const textParts: string[] = [];\n\n for await (const chunk of this.listenStream(audio, detectedSampleRate)) {\n if (chunk.isFinal && chunk.text) {\n textParts.push(chunk.text);\n }\n if (chunk.segment) {\n segments.push(chunk.segment);\n }\n }\n\n return {\n text: textParts.join(''),\n segments: segments.length > 0 ? segments : undefined,\n };\n }\n}\n\n/**\n * Qwen ASR 连接实例\n * 通过 QwenASR.connect() 获取,持有已建立的 WebSocket 连接\n */\nclass QwenASRConnection implements ASRConnection {\n private _state: ASRConnectionState = 'connected';\n\n constructor(\n private ws: WebSocket,\n private provider: QwenASR\n ) {}\n\n get state(): ASRConnectionState {\n if (this.ws.readyState === WebSocket.CLOSED || this.ws.readyState === WebSocket.CLOSING) {\n return 'closed';\n }\n return this._state;\n }\n\n listen(\n audio: AudioStreamInput,\n options: ListenInstanceOptions & { stream: true }\n ): AsyncIterable<ASRStreamChunk>;\n\n listen(\n audio: AudioStreamInput,\n options?: ListenInstanceOptions & { stream?: false }\n ): Promise<ASRResponse>;\n\n listen(\n audio: AudioStreamInput,\n options?: ListenInstanceOptions\n ): Promise<ASRResponse> | AsyncIterable<ASRStreamChunk> {\n this.ensureConnected();\n\n const { audioStream, sampleRate } = this.adaptAudioInput(audio);\n\n if (options?.stream === true) {\n return this.streamOnConnection(audioStream, sampleRate);\n }\n return this.collectResponse(audioStream, sampleRate);\n }\n\n close(): void {\n if (this.ws.readyState === WebSocket.OPEN) {\n this.ws.close();\n }\n this._state = 'closed';\n }\n\n private ensureConnected(): void {\n if (this.state !== 'connected') {\n throw new Error('Connection is closed');\n }\n }\n\n private adaptAudioInput(audio: AudioStreamInput): {\n audioStream: AudioStream;\n sampleRate?: number;\n } {\n if (this.provider.isFilePath(audio)) {\n const sampleRate = detectSampleRate(audio) ?? this.provider.sampleRate;\n return {\n audioStream: this.provider.fileToRawAudioStream(audio),\n sampleRate,\n };\n }\n return {\n audioStream: this.provider.adaptQwenAudioInput(audio),\n sampleRate: this.provider.sampleRate,\n };\n }\n\n private async *streamOnConnection(\n audioStream: AudioStream,\n sampleRate?: number\n ): AsyncIterable<ASRStreamChunk> {\n yield* this.provider.listenStreamOnConnection(this.ws, audioStream, sampleRate);\n }\n\n private async collectResponse(\n audioStream: AudioStream,\n sampleRate?: number\n ): Promise<ASRResponse> {\n const segments: ASRSegment[] = [];\n const textParts: string[] = [];\n\n for await (const chunk of this.provider.listenStreamOnConnection(\n this.ws,\n audioStream,\n sampleRate\n )) {\n if (chunk.isFinal && chunk.text) {\n textParts.push(chunk.text);\n }\n if (chunk.segment) {\n segments.push(chunk.segment);\n }\n }\n\n return {\n text: textParts.join(''),\n segments: segments.length > 0 ? segments : undefined,\n };\n }\n}\n","import { Buffer } from 'node:buffer';\nimport WebSocket from 'ws';\nimport { BaseASR } from '@/asr/base';\nimport {\n buildAuthUrl,\n createFirstFrame,\n createLastFrame,\n createMiddleFrame,\n extractTextFromResult,\n hasResultPayload,\n isFinishedResponse,\n isSuccessResponse,\n parseResponse,\n type XfyunProtocolOptions,\n} from '@/asr/protocols/xfyun';\nimport type { ASRStreamChunk, AudioStream, XfyunASROptions } from '@/types/asr';\n\n/**\n * 科大讯飞 ASR 提供商\n * 基于讯飞开放平台 IAT(语音听写)WebSocket JSON API v2 实现语音识别\n *\n * 支持中英文及 202 种方言识别,音频时长不超过 60 秒\n */\nexport class XfyunASR extends BaseASR {\n name = 'xfyun';\n\n /** 讯飞 AppID */\n public appId: string;\n /** 讯飞 APISecret(用于 HMAC-SHA256 签名) */\n public apiSecret: string;\n\n /** 音频采样率 */\n public sampleRate: number;\n\n /** 识别领域 */\n public domain: string;\n /** 口音 */\n public accent: string;\n /** 静音超时时间(毫秒) */\n public eos: number;\n /** 动态修正控制 */\n public dwa?: string;\n /** 中英文筛选 */\n public ltc?: number;\n /** 会话热词 */\n public dhw?: string;\n /** 标点符号控制 */\n public ptt?: number;\n /** 语言区域 */\n public rlang?: string;\n /** 返回词级时间戳 */\n public vinfo?: number;\n /** 返回数值的阿拉伯数字格式 */\n public nunum?: number;\n /** 返回候选句子数量 */\n public nbest?: number;\n /** 自定义热词的权重信息 */\n public wbest?: number;\n /** 音频发送间隔(毫秒) */\n public sendInterval: number;\n\n constructor(options: XfyunASROptions) {\n super(options);\n this.appId = options.appId || '';\n this.apiSecret = options.apiSecret || '';\n\n // 音频配置:默认 PCM 16kHz\n this.sampleRate = options.sampleRate ?? 16000;\n\n // 识别配置\n this.domain = options.domain ?? 'iat';\n this.accent = options.accent ?? 'mandarin';\n this.eos = options.eos ?? 2000;\n this.dwa = options.dwa;\n this.ltc = options.ltc;\n this.dhw = options.dhw;\n this.ptt = options.ptt;\n this.rlang = options.rlang;\n this.vinfo = options.vinfo;\n this.nunum = options.nunum;\n this.nbest = options.nbest;\n this.wbest = options.wbest;\n this.sendInterval = options.sendInterval ?? 0;\n }\n\n /**\n * 将语言代码映射为科大讯飞格式\n * zh-CN -> zh_cn, en-US -> en_us\n */\n private mapLanguage(lang: string): string {\n const langMap: Record<string, string> = {\n 'zh-CN': 'zh_cn',\n 'zh-TW': 'zh_cn',\n 'zh-HK': 'zh_cn',\n 'en-US': 'en_us',\n 'en-GB': 'en_us',\n };\n return langMap[lang] || 'zh_cn';\n }\n\n /**\n * 将音频格式映射为科大讯飞编码格式\n * pcm -> raw, mp3 -> lame\n */\n private mapEncoding(format: string): string {\n const encodingMap: Record<string, string> = {\n pcm: 'raw',\n mp3: 'lame',\n };\n return encodingMap[format] || 'raw';\n }\n\n /**\n * 构建协议配置选项\n */\n private buildProtocolOptions(): XfyunProtocolOptions {\n return {\n appId: this.appId,\n apiKey: this.apiKey,\n apiSecret: this.apiSecret,\n encoding: this.mapEncoding(this.format),\n sampleRate: this.sampleRate,\n domain: this.domain,\n language: this.mapLanguage(this.language),\n accent: this.accent,\n eos: this.eos,\n dwa: this.dwa,\n ltc: this.ltc,\n dhw: this.dhw,\n ptt: this.ptt,\n rlang: this.rlang,\n vinfo: this.vinfo,\n nunum: this.nunum,\n nbest: this.nbest,\n wbest: this.wbest,\n };\n }\n\n /**\n * 创建响应队列\n */\n private createResponseQueue() {\n const queue: {\n items: ASRStreamChunk[];\n resolve: ((value: ASRStreamChunk | null) => void) | null;\n done: boolean;\n error: Error | null;\n } = {\n items: [],\n resolve: null,\n done: false,\n error: null,\n };\n\n return {\n push: (item: ASRStreamChunk) => {\n if (queue.resolve) {\n queue.resolve(item);\n queue.resolve = null;\n } else {\n queue.items.push(item);\n }\n },\n next: async (): Promise<ASRStreamChunk | null> => {\n if (queue.items.length > 0) {\n const item = queue.items.shift();\n return item ?? null;\n }\n if (queue.done) {\n return null;\n }\n return new Promise((resolve) => {\n queue.resolve = resolve;\n });\n },\n complete: () => {\n queue.done = true;\n if (queue.resolve) {\n queue.resolve(null);\n queue.resolve = null;\n }\n },\n error: (err: Error) => {\n queue.error = err;\n if (queue.resolve) {\n queue.resolve(null);\n queue.resolve = null;\n }\n },\n getError: () => queue.error,\n };\n }\n\n /**\n * 设置 WebSocket 消息处理器\n */\n private setupMessageHandler(ws: WebSocket, queue: ReturnType<typeof this.createResponseQueue>) {\n // 累积结果数组:以 sn 为索引存储每个片段的文本,支持动态修正\n const iatResult: (string | null)[] = [];\n\n const handleMessage = (data: WebSocket.RawData) => {\n try {\n const response = parseResponse(data);\n\n // 检查错误响应\n if (!isSuccessResponse(response)) {\n queue.error(new Error(`Xfyun ASR error: ${response.code} - ${response.message}`));\n return;\n }\n\n // 处理包含识别结果的响应\n if (hasResultPayload(response) && response.data?.result) {\n const result = response.data.result;\n\n // 动态修正:当 pgs==='rpl' 时,清除 rg 范围内的旧结果\n if (result.pgs === 'rpl' && result.rg) {\n for (let i = result.rg[0]; i <= result.rg[1]; i++) {\n iatResult[i] = null;\n }\n }\n\n // 存储当前片段文本\n const snippetText = extractTextFromResult(result);\n iatResult[result.sn] = snippetText;\n\n // 拼接完整累积文本\n const fullText = iatResult.filter((t) => t !== null).join('');\n\n const isFinal = isFinishedResponse(response) || result.ls === true;\n\n queue.push({\n text: fullText,\n isFinal,\n });\n }\n\n // 如果是最后一帧,标记队列完成\n if (isFinishedResponse(response)) {\n queue.complete();\n }\n } catch (err) {\n queue.error(err instanceof Error ? err : new Error(String(err)));\n }\n };\n\n const handleClose = () => {\n if (!queue.getError()) {\n queue.complete();\n }\n };\n\n const handleError = (err: Error) => {\n queue.error(err);\n };\n\n ws.on('message', handleMessage);\n ws.on('close', handleClose);\n ws.on('error', handleError);\n\n return () => {\n ws.off('message', handleMessage);\n ws.off('close', handleClose);\n ws.off('error', handleError);\n };\n }\n\n /**\n * 发送音频流\n * 按 1280 字节分块,以 sendInterval 毫秒间隔发送\n */\n private async sendAudioStream(\n ws: WebSocket,\n audio: AudioStream,\n protocolOptions: XfyunProtocolOptions\n ): Promise<void> {\n const CHUNK_SIZE = 1280;\n const SEND_INTERVAL = this.sendInterval;\n let isFirst = true;\n\n for await (const chunk of audio) {\n const data = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk as Uint8Array);\n\n // 按 CHUNK_SIZE 分块发送\n for (let offset = 0; offset < data.length; offset += CHUNK_SIZE) {\n const end = Math.min(offset + CHUNK_SIZE, data.length);\n const piece = data.subarray(offset, end);\n const audioBase64 = piece.toString('base64');\n\n if (isFirst) {\n const frame = createFirstFrame(protocolOptions, audioBase64);\n ws.send(frame);\n isFirst = false;\n } else {\n const frame = createMiddleFrame(protocolOptions, audioBase64);\n ws.send(frame);\n }\n\n // 发送间隔\n await new Promise((resolve) => setTimeout(resolve, SEND_INTERVAL));\n }\n }\n }\n\n /**\n * 流式输入识别方法\n */\n async *listenStream(audio: AudioStream): AsyncIterable<ASRStreamChunk> {\n // 验证凭据\n if (!this.appId) {\n throw new Error('appId is required for Xfyun ASR');\n }\n if (!this.apiKey) {\n throw new Error('apiKey is required for Xfyun ASR');\n }\n if (!this.apiSecret) {\n throw new Error('apiSecret is required for Xfyun ASR');\n }\n\n const protocolOptions = this.buildProtocolOptions();\n\n // 生成鉴权 URL(v2 基础版)\n const url = buildAuthUrl('iat-api.xfyun.cn', '/v2/iat', this.apiKey, this.apiSecret);\n\n // 建立 WebSocket 连接\n const ws = new WebSocket(url);\n\n try {\n // 等待连接建立\n await new Promise<void>((resolve, reject) => {\n ws.on('open', resolve);\n ws.on('error', reject);\n });\n\n // 创建响应队列\n const queue = this.createResponseQueue();\n\n // 设置消息处理器\n const cleanup = this.setupMessageHandler(ws, queue);\n\n try {\n // 后台发送音频流\n let sendPromise: Promise<void> = Promise.resolve();\n sendPromise = this.sendAudioStream(ws, audio, protocolOptions).then(async () => {\n // 发送末帧\n const lastFrame = createLastFrame();\n ws.send(lastFrame);\n });\n\n // 从队列 yield 响应,同时监控发送和队列错误\n while (true) {\n const chunk = await queue.next();\n if (chunk === null) break;\n yield chunk;\n }\n\n // 等待发送完成\n await sendPromise;\n\n // 检查是否有错误\n const queueError = queue.getError();\n if (queueError) {\n throw queueError;\n }\n } finally {\n cleanup();\n }\n } finally {\n ws.close();\n }\n }\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as ASROptions, B as BaseASR, g as ASRResponse } from './base-
|
|
1
|
+
import { c as ASROptions, B as BaseASR, g as ASRResponse } from './base-BH6BJnc0.js';
|
|
2
2
|
import { Buffer } from 'node:buffer';
|
|
3
3
|
|
|
4
4
|
declare function registerASRProvider(type: string, provider: new (options: any) => BaseASR): void;
|
package/dist/src/asr/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { A as ASRConnectOptions, a as ASRConnection, b as ASRConnectionState, c as ASROptions, d as ASRProvider, e as ASRProviderType, f as ASRRequest, g as ASRResponse, h as ASRSegment, i as ASRStreamChunk, j as AudioCodecFormat, k as AudioContainerFormat, l as AudioFormat, m as AudioStream, n as AudioStreamInput, B as BaseASR, o as BaseASROptions, D as DoubaoASROptions, G as GlmASROptions, L as ListenInstanceOptions, Q as QwenASROptions, X as XfyunASROptions } from '../../base-
|
|
2
|
-
export { C as CollectOptions, D as DEFAULT_SAMPLE_RATE, a as DecodeOpusStreamOptions, O as OggMuxer, b as OggMuxerOptions, S as SaveOptions, W as WavInfo, c as bufferToAudioStream, d as collectText, e as convertToWav, f as createASR, g as createEosPage, h as createOggMuxer, i as createOggMuxerWithEos, j as decodeOpusStream, k as getASRProviders, l as isWav, p as parseWavInfo, m as processAudio, r as readAudio, n as registerASRProvider, s as saveText, o as splitAudio } from '../../save-
|
|
3
|
-
export { D as DoubaoASR, G as GeminiASR, M as MinimaxASR, Q as QwenASR, W as WhisperASR, X as XfyunASR } from '../../xfyun-
|
|
1
|
+
export { A as ASRConnectOptions, a as ASRConnection, b as ASRConnectionState, c as ASROptions, d as ASRProvider, e as ASRProviderType, f as ASRRequest, g as ASRResponse, h as ASRSegment, i as ASRStreamChunk, j as AudioCodecFormat, k as AudioContainerFormat, l as AudioFormat, m as AudioStream, n as AudioStreamInput, B as BaseASR, o as BaseASROptions, D as DoubaoASROptions, G as GlmASROptions, L as ListenInstanceOptions, Q as QwenASROptions, X as XfyunASROptions } from '../../base-BH6BJnc0.js';
|
|
2
|
+
export { C as CollectOptions, D as DEFAULT_SAMPLE_RATE, a as DecodeOpusStreamOptions, O as OggMuxer, b as OggMuxerOptions, S as SaveOptions, W as WavInfo, c as bufferToAudioStream, d as collectText, e as convertToWav, f as createASR, g as createEosPage, h as createOggMuxer, i as createOggMuxerWithEos, j as decodeOpusStream, k as getASRProviders, l as isWav, p as parseWavInfo, m as processAudio, r as readAudio, n as registerASRProvider, s as saveText, o as splitAudio } from '../../save-CH5QtsBG.js';
|
|
3
|
+
export { D as DoubaoASR, G as GeminiASR, M as MinimaxASR, Q as QwenASR, W as WhisperASR, X as XfyunASR } from '../../xfyun-6REH-yLC.js';
|
|
4
4
|
import 'node:buffer';
|
|
5
5
|
import 'ws';
|
package/dist/src/asr/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { collectText, createEosPage, createOggMuxer, createOggMuxerWithEos, decodeOpusStream, saveText } from '../../chunk-F3GCENLN.js';
|
|
2
|
-
export { BaseASR, DEFAULT_SAMPLE_RATE, DoubaoASR, GeminiASR, MinimaxASR, QwenASR, WhisperASR, XfyunASR, bufferToAudioStream, convertToWav, createASR, getASRProviders, isWav, parseWavInfo, processAudio, readAudio, registerASRProvider, splitAudio } from '../../chunk-
|
|
2
|
+
export { BaseASR, DEFAULT_SAMPLE_RATE, DoubaoASR, GeminiASR, MinimaxASR, QwenASR, WhisperASR, XfyunASR, bufferToAudioStream, convertToWav, createASR, getASRProviders, isWav, parseWavInfo, processAudio, readAudio, registerASRProvider, splitAudio } from '../../chunk-5KBJXEBG.js';
|
|
3
3
|
import '../../chunk-6J7GHGDI.js';
|
|
4
4
|
import '../../chunk-7QVYU63E.js';
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { D as DoubaoASR, G as GeminiASR, M as MinimaxASR, Q as QwenASR, W as WhisperASR, X as XfyunASR } from '../../../xfyun-
|
|
2
|
-
import { B as BaseASR, G as GlmASROptions, n as AudioStreamInput, L as ListenInstanceOptions, i as ASRStreamChunk, g as ASRResponse, m as AudioStream } from '../../../base-
|
|
1
|
+
export { D as DoubaoASR, G as GeminiASR, M as MinimaxASR, Q as QwenASR, W as WhisperASR, X as XfyunASR } from '../../../xfyun-6REH-yLC.js';
|
|
2
|
+
import { B as BaseASR, G as GlmASROptions, n as AudioStreamInput, L as ListenInstanceOptions, i as ASRStreamChunk, g as ASRResponse, m as AudioStream } from '../../../base-BH6BJnc0.js';
|
|
3
3
|
import 'ws';
|
|
4
4
|
|
|
5
5
|
declare class GlmASR extends BaseASR {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { BaseASR, registerASRProvider, DoubaoASR, MinimaxASR, QwenASR, WhisperASR, GeminiASR, XfyunASR } from '../../../chunk-
|
|
2
|
-
export { DoubaoASR, GeminiASR, MinimaxASR, QwenASR, WhisperASR, XfyunASR } from '../../../chunk-
|
|
1
|
+
import { BaseASR, registerASRProvider, DoubaoASR, MinimaxASR, QwenASR, WhisperASR, GeminiASR, XfyunASR } from '../../../chunk-5KBJXEBG.js';
|
|
2
|
+
export { DoubaoASR, GeminiASR, MinimaxASR, QwenASR, WhisperASR, XfyunASR } from '../../../chunk-5KBJXEBG.js';
|
|
3
3
|
import '../../../chunk-6J7GHGDI.js';
|
|
4
4
|
import { __name } from '../../../chunk-7QVYU63E.js';
|
|
5
5
|
import { Buffer } from 'buffer';
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { A as ASRConnectOptions, a as ASRConnection, b as ASRConnectionState, c as ASROptions, d as ASRProvider, e as ASRProviderType, g as ASRResponse, h as ASRSegment, i as ASRStreamChunk, B as BaseASR, o as BaseASROptions, D as DoubaoASROptions, G as GlmASROptions, Q as QwenASROptions, X as XfyunASROptions } from '../base-
|
|
2
|
-
export { C as CollectOptions, D as DEFAULT_SAMPLE_RATE, a as DecodeOpusStreamOptions, O as OggMuxer, b as OggMuxerOptions, S as SaveOptions, W as WavInfo, c as bufferToAudioStream, d as collectText, e as convertToWav, f as createASR, g as createEosPage, h as createOggMuxer, i as createOggMuxerWithEos, j as decodeOpusStream, k as getASRProviders, l as isWav, p as parseWavInfo, m as processAudio, r as readAudio, n as registerASRProvider, s as saveText, o as splitAudio } from '../save-
|
|
1
|
+
export { A as ASRConnectOptions, a as ASRConnection, b as ASRConnectionState, c as ASROptions, d as ASRProvider, e as ASRProviderType, g as ASRResponse, h as ASRSegment, i as ASRStreamChunk, B as BaseASR, o as BaseASROptions, D as DoubaoASROptions, G as GlmASROptions, Q as QwenASROptions, X as XfyunASROptions } from '../base-BH6BJnc0.js';
|
|
2
|
+
export { C as CollectOptions, D as DEFAULT_SAMPLE_RATE, a as DecodeOpusStreamOptions, O as OggMuxer, b as OggMuxerOptions, S as SaveOptions, W as WavInfo, c as bufferToAudioStream, d as collectText, e as convertToWav, f as createASR, g as createEosPage, h as createOggMuxer, i as createOggMuxerWithEos, j as decodeOpusStream, k as getASRProviders, l as isWav, p as parseWavInfo, m as processAudio, r as readAudio, n as registerASRProvider, s as saveText, o as splitAudio } from '../save-CH5QtsBG.js';
|
|
3
3
|
export { B as BaseTTS, a as BaseTTSOptions, C as CosyVoiceV1Voice, n as CosyVoiceV2Voice, o as CosyVoiceV3FlashVoice, p as CosyVoiceV3PlusVoice, q as CosyVoiceVoice, r as DoubaoJupiterVoice, D as DoubaoTTSOptions, s as DoubaoV1Voice, t as DoubaoV2Voice, u as DoubaoVoice, M as MinimaxTTSOptions, v as MinimaxVoice, w as OpenAIChatCompletionChunk, x as OpenAIStream, b as QwenRealtimeTTSOptions, y as QwenRealtimeVoice, z as QwenTTSModel, c as QwenTTSOptions, T as TTSConnectOptions, d as TTSConnection, e as TTSConnectionState, f as TTSOptions, g as TTSProvider, h as TTSProviderType, i as TTSRequest, j as TTSResponse, k as TTSStreamChunk, l as TTSVoice, m as TextStream, X as XfyunTTSOptions } from '../base-BkzbacLb.js';
|
|
4
4
|
export { c as collectAudio, a as createTTS, g as getTTSProviders, p as playAudio, r as registerTTSProvider, s as saveAudio, b as saveTTSResponse, t as teeAudio } from '../tee-F-nBCt45.js';
|
|
5
5
|
import 'node:buffer';
|
package/dist/src/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { collectAudio, playAudio, saveAudio, saveTTSResponse, teeAudio } from '../chunk-6WSSFM2A.js';
|
|
2
2
|
export { collectText, createEosPage, createOggMuxer, createOggMuxerWithEos, decodeOpusStream, saveText } from '../chunk-F3GCENLN.js';
|
|
3
3
|
export { BaseTTS, createTTS, getTTSProviders, registerTTSProvider } from '../chunk-SES2F3ID.js';
|
|
4
|
-
export { BaseASR, DEFAULT_SAMPLE_RATE, bufferToAudioStream, convertToWav, createASR, getASRProviders, isWav, parseWavInfo, processAudio, readAudio, registerASRProvider, splitAudio } from '../chunk-
|
|
4
|
+
export { BaseASR, DEFAULT_SAMPLE_RATE, bufferToAudioStream, convertToWav, createASR, getASRProviders, isWav, parseWavInfo, processAudio, readAudio, registerASRProvider, splitAudio } from '../chunk-5KBJXEBG.js';
|
|
5
5
|
import '../chunk-6J7GHGDI.js';
|
|
6
6
|
import '../chunk-7QVYU63E.js';
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import WebSocket from 'ws';
|
|
2
|
-
import { B as BaseASR, D as DoubaoASROptions, m as AudioStream, i as ASRStreamChunk, A as ASRConnectOptions, a as ASRConnection, o as BaseASROptions, Q as QwenASROptions, n as AudioStreamInput, L as ListenInstanceOptions, g as ASRResponse, X as XfyunASROptions } from './base-
|
|
2
|
+
import { B as BaseASR, D as DoubaoASROptions, m as AudioStream, i as ASRStreamChunk, A as ASRConnectOptions, a as ASRConnection, o as BaseASROptions, Q as QwenASROptions, n as AudioStreamInput, L as ListenInstanceOptions, g as ASRResponse, X as XfyunASROptions } from './base-BH6BJnc0.js';
|
|
3
3
|
|
|
4
4
|
declare class DoubaoASR extends BaseASR {
|
|
5
5
|
name: string;
|
|
@@ -15,6 +15,10 @@ declare class DoubaoASR extends BaseASR {
|
|
|
15
15
|
enablePunc: boolean;
|
|
16
16
|
enableDdc: boolean;
|
|
17
17
|
showUtterances: boolean;
|
|
18
|
+
endWindowSize?: number;
|
|
19
|
+
enableNonstream?: boolean;
|
|
20
|
+
vadSegmentDuration?: number;
|
|
21
|
+
forceToSpeechTime?: number;
|
|
18
22
|
constructor(options: DoubaoASROptions);
|
|
19
23
|
private getWebSocketUrl;
|
|
20
24
|
private waitForConnection;
|