whisper.rn 0.5.0-rc.1 → 0.5.0-rc.3
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/README.md +119 -50
- package/android/src/main/java/com/rnwhisper/RNWhisper.java +26 -0
- package/android/src/main/java/com/rnwhisper/WhisperContext.java +25 -0
- package/android/src/main/jni.cpp +81 -0
- package/android/src/newarch/java/com/rnwhisper/RNWhisperModule.java +5 -0
- package/android/src/oldarch/java/com/rnwhisper/RNWhisperModule.java +5 -0
- package/ios/RNWhisper.mm +11 -0
- package/ios/RNWhisperContext.h +1 -0
- package/ios/RNWhisperContext.mm +46 -0
- package/lib/commonjs/AudioSessionIos.js +2 -1
- package/lib/commonjs/AudioSessionIos.js.map +1 -1
- package/lib/commonjs/NativeRNWhisper.js.map +1 -1
- package/lib/commonjs/index.js +26 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/jest-mock.js +126 -0
- package/lib/commonjs/jest-mock.js.map +1 -0
- package/lib/commonjs/realtime-transcription/RealtimeTranscriber.js +831 -0
- package/lib/commonjs/realtime-transcription/RealtimeTranscriber.js.map +1 -0
- package/lib/commonjs/realtime-transcription/SliceManager.js +233 -0
- package/lib/commonjs/realtime-transcription/SliceManager.js.map +1 -0
- package/lib/commonjs/realtime-transcription/adapters/AudioPcmStreamAdapter.js +133 -0
- package/lib/commonjs/realtime-transcription/adapters/AudioPcmStreamAdapter.js.map +1 -0
- package/lib/commonjs/realtime-transcription/adapters/JestAudioStreamAdapter.js +201 -0
- package/lib/commonjs/realtime-transcription/adapters/JestAudioStreamAdapter.js.map +1 -0
- package/lib/commonjs/realtime-transcription/adapters/SimulateFileAudioStreamAdapter.js +309 -0
- package/lib/commonjs/realtime-transcription/adapters/SimulateFileAudioStreamAdapter.js.map +1 -0
- package/lib/commonjs/realtime-transcription/index.js +27 -0
- package/lib/commonjs/realtime-transcription/index.js.map +1 -0
- package/lib/commonjs/realtime-transcription/types.js +114 -0
- package/lib/commonjs/realtime-transcription/types.js.map +1 -0
- package/lib/commonjs/utils/WavFileReader.js +158 -0
- package/lib/commonjs/utils/WavFileReader.js.map +1 -0
- package/lib/commonjs/utils/WavFileWriter.js +181 -0
- package/lib/commonjs/utils/WavFileWriter.js.map +1 -0
- package/lib/commonjs/utils/common.js +25 -0
- package/lib/commonjs/utils/common.js.map +1 -0
- package/lib/module/AudioSessionIos.js +2 -1
- package/lib/module/AudioSessionIos.js.map +1 -1
- package/lib/module/NativeRNWhisper.js.map +1 -1
- package/lib/module/index.js +24 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/jest-mock.js +124 -0
- package/lib/module/jest-mock.js.map +1 -0
- package/lib/module/realtime-transcription/RealtimeTranscriber.js +825 -0
- package/lib/module/realtime-transcription/RealtimeTranscriber.js.map +1 -0
- package/lib/module/realtime-transcription/SliceManager.js +226 -0
- package/lib/module/realtime-transcription/SliceManager.js.map +1 -0
- package/lib/module/realtime-transcription/adapters/AudioPcmStreamAdapter.js +124 -0
- package/lib/module/realtime-transcription/adapters/AudioPcmStreamAdapter.js.map +1 -0
- package/lib/module/realtime-transcription/adapters/JestAudioStreamAdapter.js +194 -0
- package/lib/module/realtime-transcription/adapters/JestAudioStreamAdapter.js.map +1 -0
- package/lib/module/realtime-transcription/adapters/SimulateFileAudioStreamAdapter.js +302 -0
- package/lib/module/realtime-transcription/adapters/SimulateFileAudioStreamAdapter.js.map +1 -0
- package/lib/module/realtime-transcription/index.js +8 -0
- package/lib/module/realtime-transcription/index.js.map +1 -0
- package/lib/module/realtime-transcription/types.js +107 -0
- package/lib/module/realtime-transcription/types.js.map +1 -0
- package/lib/module/utils/WavFileReader.js +151 -0
- package/lib/module/utils/WavFileReader.js.map +1 -0
- package/lib/module/utils/WavFileWriter.js +174 -0
- package/lib/module/utils/WavFileWriter.js.map +1 -0
- package/lib/module/utils/common.js +18 -0
- package/lib/module/utils/common.js.map +1 -0
- package/lib/typescript/AudioSessionIos.d.ts +1 -1
- package/lib/typescript/AudioSessionIos.d.ts.map +1 -1
- package/lib/typescript/NativeRNWhisper.d.ts +1 -0
- package/lib/typescript/NativeRNWhisper.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +4 -0
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/jest-mock.d.ts +2 -0
- package/lib/typescript/jest-mock.d.ts.map +1 -0
- package/lib/typescript/realtime-transcription/RealtimeTranscriber.d.ts +165 -0
- package/lib/typescript/realtime-transcription/RealtimeTranscriber.d.ts.map +1 -0
- package/lib/typescript/realtime-transcription/SliceManager.d.ts +72 -0
- package/lib/typescript/realtime-transcription/SliceManager.d.ts.map +1 -0
- package/lib/typescript/realtime-transcription/adapters/AudioPcmStreamAdapter.d.ts +22 -0
- package/lib/typescript/realtime-transcription/adapters/AudioPcmStreamAdapter.d.ts.map +1 -0
- package/lib/typescript/realtime-transcription/adapters/JestAudioStreamAdapter.d.ts +44 -0
- package/lib/typescript/realtime-transcription/adapters/JestAudioStreamAdapter.d.ts.map +1 -0
- package/lib/typescript/realtime-transcription/adapters/SimulateFileAudioStreamAdapter.d.ts +75 -0
- package/lib/typescript/realtime-transcription/adapters/SimulateFileAudioStreamAdapter.d.ts.map +1 -0
- package/lib/typescript/realtime-transcription/index.d.ts +6 -0
- package/lib/typescript/realtime-transcription/index.d.ts.map +1 -0
- package/lib/typescript/realtime-transcription/types.d.ts +216 -0
- package/lib/typescript/realtime-transcription/types.d.ts.map +1 -0
- package/lib/typescript/utils/WavFileReader.d.ts +61 -0
- package/lib/typescript/utils/WavFileReader.d.ts.map +1 -0
- package/lib/typescript/utils/WavFileWriter.d.ts +57 -0
- package/lib/typescript/utils/WavFileWriter.d.ts.map +1 -0
- package/lib/typescript/utils/common.d.ts +9 -0
- package/lib/typescript/utils/common.d.ts.map +1 -0
- package/package.json +18 -6
- package/src/AudioSessionIos.ts +3 -2
- package/src/NativeRNWhisper.ts +2 -0
- package/src/index.ts +34 -0
- package/{jest/mock.js → src/jest-mock.ts} +2 -2
- package/src/realtime-transcription/RealtimeTranscriber.ts +983 -0
- package/src/realtime-transcription/SliceManager.ts +252 -0
- package/src/realtime-transcription/adapters/AudioPcmStreamAdapter.ts +143 -0
- package/src/realtime-transcription/adapters/JestAudioStreamAdapter.ts +251 -0
- package/src/realtime-transcription/adapters/SimulateFileAudioStreamAdapter.ts +378 -0
- package/src/realtime-transcription/index.ts +34 -0
- package/src/realtime-transcription/types.ts +277 -0
- package/src/utils/WavFileReader.ts +202 -0
- package/src/utils/WavFileWriter.ts +206 -0
- package/src/utils/common.ts +17 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { AudioStreamInterface, AudioStreamConfig, AudioStreamData } from '../types';
|
|
2
|
+
import { WavFileReaderFs } from '../../utils/WavFileReader';
|
|
3
|
+
export interface SimulateFileOptions {
|
|
4
|
+
fs: WavFileReaderFs;
|
|
5
|
+
filePath: string;
|
|
6
|
+
playbackSpeed?: number;
|
|
7
|
+
chunkDurationMs?: number;
|
|
8
|
+
loop?: boolean;
|
|
9
|
+
onEndOfFile?: () => void;
|
|
10
|
+
logger?: (message: string) => void;
|
|
11
|
+
}
|
|
12
|
+
export declare class SimulateFileAudioStreamAdapter implements AudioStreamInterface {
|
|
13
|
+
private fileReader;
|
|
14
|
+
private config;
|
|
15
|
+
private options;
|
|
16
|
+
private isInitialized;
|
|
17
|
+
private recording;
|
|
18
|
+
private dataCallback?;
|
|
19
|
+
private errorCallback?;
|
|
20
|
+
private statusCallback?;
|
|
21
|
+
private streamInterval?;
|
|
22
|
+
private currentBytePosition;
|
|
23
|
+
private startTime;
|
|
24
|
+
private pausedTime;
|
|
25
|
+
private hasReachedEnd;
|
|
26
|
+
constructor(options: SimulateFileOptions);
|
|
27
|
+
initialize(config: AudioStreamConfig): Promise<void>;
|
|
28
|
+
start(): Promise<void>;
|
|
29
|
+
stop(): Promise<void>;
|
|
30
|
+
isRecording(): boolean;
|
|
31
|
+
onData(callback: (data: AudioStreamData) => void): void;
|
|
32
|
+
onError(callback: (error: string) => void): void;
|
|
33
|
+
onStatusChange(callback: (isRecording: boolean) => void): void;
|
|
34
|
+
release(): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Start the streaming process
|
|
37
|
+
*/
|
|
38
|
+
private startStreaming;
|
|
39
|
+
/**
|
|
40
|
+
* Stream the next audio chunk
|
|
41
|
+
*/
|
|
42
|
+
private streamNextChunk;
|
|
43
|
+
/**
|
|
44
|
+
* Get current playback statistics
|
|
45
|
+
*/
|
|
46
|
+
getStatistics(): {
|
|
47
|
+
filePath: string;
|
|
48
|
+
isRecording: boolean;
|
|
49
|
+
currentTime: number;
|
|
50
|
+
totalDuration: number;
|
|
51
|
+
progress: number;
|
|
52
|
+
playbackSpeed: number | undefined;
|
|
53
|
+
currentBytePosition: number;
|
|
54
|
+
totalBytes: number;
|
|
55
|
+
hasReachedEnd: boolean;
|
|
56
|
+
header: import("../../utils/WavFileReader").WavFileHeader | null;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Seek to a specific time position
|
|
60
|
+
*/
|
|
61
|
+
seekToTime(timeSeconds: number): void;
|
|
62
|
+
/**
|
|
63
|
+
* Set playback speed
|
|
64
|
+
*/
|
|
65
|
+
setPlaybackSpeed(speed: number): void;
|
|
66
|
+
/**
|
|
67
|
+
* Reset file buffer to beginning
|
|
68
|
+
*/
|
|
69
|
+
resetBuffer(): void;
|
|
70
|
+
/**
|
|
71
|
+
* Logger function
|
|
72
|
+
*/
|
|
73
|
+
private log;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=SimulateFileAudioStreamAdapter.d.ts.map
|
package/lib/typescript/realtime-transcription/adapters/SimulateFileAudioStreamAdapter.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SimulateFileAudioStreamAdapter.d.ts","sourceRoot":"","sources":["../../../../src/realtime-transcription/adapters/SimulateFileAudioStreamAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EAChB,MAAM,UAAU,CAAA;AACjB,OAAO,EAAiB,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAE1E,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,eAAe,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC;AAED,qBAAa,8BAA+B,YAAW,oBAAoB;IACzE,OAAO,CAAC,UAAU,CAAe;IAEjC,OAAO,CAAC,MAAM,CAAiC;IAE/C,OAAO,CAAC,OAAO,CAAqB;IAEpC,OAAO,CAAC,aAAa,CAAQ;IAE7B,OAAO,CAAC,SAAS,CAAQ;IAEzB,OAAO,CAAC,YAAY,CAAC,CAAiC;IAEtD,OAAO,CAAC,aAAa,CAAC,CAAyB;IAE/C,OAAO,CAAC,cAAc,CAAC,CAAgC;IAEvD,OAAO,CAAC,cAAc,CAAC,CAAgC;IAEvD,OAAO,CAAC,mBAAmB,CAAI;IAE/B,OAAO,CAAC,SAAS,CAAI;IAErB,OAAO,CAAC,UAAU,CAAI;IAEtB,OAAO,CAAC,aAAa,CAAQ;gBAEjB,OAAO,EAAE,mBAAmB;IAWlC,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoDpD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB3B,WAAW,IAAI,OAAO;IAItB,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI;IAIvD,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIhD,cAAc,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IAIxD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B;;OAEG;IACH,OAAO,CAAC,cAAc;IAsCtB;;OAEG;IACH,OAAO,CAAC,eAAe;IA0DvB;;OAEG;IACH,aAAa;;;;;;;;;;;;IAkBb;;OAEG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAmBrC;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAiBrC;;OAEG;IACH,WAAW,IAAI,IAAI;IAmBnB;;OAEG;IACH,OAAO,CAAC,GAAG;CAGZ"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { RealtimeTranscriber } from './RealtimeTranscriber';
|
|
2
|
+
export { SliceManager } from './SliceManager';
|
|
3
|
+
export type { WavFileWriterFs } from '../utils/WavFileWriter';
|
|
4
|
+
export type { AudioStreamData, AudioStreamConfig, AudioStreamInterface, RealtimeVadEvent, RealtimeTranscribeEvent, RealtimeStatsEvent, RealtimeTranscriberDependencies, RealtimeOptions, RealtimeTranscriberCallbacks, AudioSlice, AudioSliceNoData, MemoryUsage, } from './types';
|
|
5
|
+
export { VAD_PRESETS } from './types';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/realtime-transcription/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAG3D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAG7D,YAAY,EAEV,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EAGpB,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,EAGlB,+BAA+B,EAC/B,eAAe,EACf,4BAA4B,EAG5B,UAAU,EACV,gBAAgB,EAChB,WAAW,GAEZ,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import type { TranscribeOptions, TranscribeResult, VadOptions } from '../index';
|
|
2
|
+
import type { WavFileWriterFs } from '../utils/WavFileWriter';
|
|
3
|
+
export interface AudioStreamData {
|
|
4
|
+
data: Uint8Array;
|
|
5
|
+
sampleRate: number;
|
|
6
|
+
channels: number;
|
|
7
|
+
timestamp: number;
|
|
8
|
+
}
|
|
9
|
+
export interface AudioStreamConfig {
|
|
10
|
+
sampleRate?: number;
|
|
11
|
+
channels?: number;
|
|
12
|
+
bitsPerSample?: number;
|
|
13
|
+
bufferSize?: number;
|
|
14
|
+
audioSource?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface AudioStreamInterface {
|
|
17
|
+
initialize(config: AudioStreamConfig): Promise<void>;
|
|
18
|
+
start(): Promise<void>;
|
|
19
|
+
stop(): Promise<void>;
|
|
20
|
+
isRecording(): boolean;
|
|
21
|
+
onData(callback: (data: AudioStreamData) => void): void;
|
|
22
|
+
onError(callback: (error: string) => void): void;
|
|
23
|
+
onStatusChange(callback: (isRecording: boolean) => void): void;
|
|
24
|
+
release(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* VAD Presets Overview:
|
|
28
|
+
*
|
|
29
|
+
* VAD Presets
|
|
30
|
+
* / | \
|
|
31
|
+
* Conservative Default Sensitive
|
|
32
|
+
* / | | \
|
|
33
|
+
* conservative very-conservative sensitive very-sensitive
|
|
34
|
+
* (0.7 thresh) (0.8 thresh) (0.3 thresh) (0.2 thresh)
|
|
35
|
+
* 500ms min 750ms min 100ms min 100ms min
|
|
36
|
+
* Clear speech Very clear Quiet env Catches whispers
|
|
37
|
+
*
|
|
38
|
+
* Specialized Presets
|
|
39
|
+
* / | \
|
|
40
|
+
* continuous meeting noisy
|
|
41
|
+
* (60s max) (45s max) (0.75 thresh)
|
|
42
|
+
* Lectures Multi-spk Strict for noise
|
|
43
|
+
*
|
|
44
|
+
* Key Parameters:
|
|
45
|
+
* - threshold: 0.0-1.0 (lower = more sensitive)
|
|
46
|
+
* - minSpeechDurationMs: Min duration to consider speech
|
|
47
|
+
* - minSilenceDurationMs: Min silence before ending speech
|
|
48
|
+
* - maxSpeechDurationS: Max continuous speech duration
|
|
49
|
+
* - speechPadMs: Padding around detected speech
|
|
50
|
+
* - samplesOverlap: Analysis window overlap (0.0-1.0)
|
|
51
|
+
*/
|
|
52
|
+
export declare const VAD_PRESETS: {
|
|
53
|
+
default: {
|
|
54
|
+
threshold: number;
|
|
55
|
+
minSpeechDurationMs: number;
|
|
56
|
+
minSilenceDurationMs: number;
|
|
57
|
+
maxSpeechDurationS: number;
|
|
58
|
+
speechPadMs: number;
|
|
59
|
+
samplesOverlap: number;
|
|
60
|
+
};
|
|
61
|
+
sensitive: {
|
|
62
|
+
threshold: number;
|
|
63
|
+
minSpeechDurationMs: number;
|
|
64
|
+
minSilenceDurationMs: number;
|
|
65
|
+
maxSpeechDurationS: number;
|
|
66
|
+
speechPadMs: number;
|
|
67
|
+
samplesOverlap: number;
|
|
68
|
+
};
|
|
69
|
+
'very-sensitive': {
|
|
70
|
+
threshold: number;
|
|
71
|
+
minSpeechDurationMs: number;
|
|
72
|
+
minSilenceDurationMs: number;
|
|
73
|
+
maxSpeechDurationS: number;
|
|
74
|
+
speechPadMs: number;
|
|
75
|
+
samplesOverlap: number;
|
|
76
|
+
};
|
|
77
|
+
conservative: {
|
|
78
|
+
threshold: number;
|
|
79
|
+
minSpeechDurationMs: number;
|
|
80
|
+
minSilenceDurationMs: number;
|
|
81
|
+
maxSpeechDurationS: number;
|
|
82
|
+
speechPadMs: number;
|
|
83
|
+
samplesOverlap: number;
|
|
84
|
+
};
|
|
85
|
+
'very-conservative': {
|
|
86
|
+
threshold: number;
|
|
87
|
+
minSpeechDurationMs: number;
|
|
88
|
+
minSilenceDurationMs: number;
|
|
89
|
+
maxSpeechDurationS: number;
|
|
90
|
+
speechPadMs: number;
|
|
91
|
+
samplesOverlap: number;
|
|
92
|
+
};
|
|
93
|
+
continuous: {
|
|
94
|
+
threshold: number;
|
|
95
|
+
minSpeechDurationMs: number;
|
|
96
|
+
minSilenceDurationMs: number;
|
|
97
|
+
maxSpeechDurationS: number;
|
|
98
|
+
speechPadMs: number;
|
|
99
|
+
samplesOverlap: number;
|
|
100
|
+
};
|
|
101
|
+
meeting: {
|
|
102
|
+
threshold: number;
|
|
103
|
+
minSpeechDurationMs: number;
|
|
104
|
+
minSilenceDurationMs: number;
|
|
105
|
+
maxSpeechDurationS: number;
|
|
106
|
+
speechPadMs: number;
|
|
107
|
+
samplesOverlap: number;
|
|
108
|
+
};
|
|
109
|
+
noisy: {
|
|
110
|
+
threshold: number;
|
|
111
|
+
minSpeechDurationMs: number;
|
|
112
|
+
minSilenceDurationMs: number;
|
|
113
|
+
maxSpeechDurationS: number;
|
|
114
|
+
speechPadMs: number;
|
|
115
|
+
samplesOverlap: number;
|
|
116
|
+
};
|
|
117
|
+
};
|
|
118
|
+
export interface RealtimeVadEvent {
|
|
119
|
+
type: 'speech_start' | 'speech_end' | 'speech_continue' | 'silence';
|
|
120
|
+
timestamp: number;
|
|
121
|
+
lastSpeechDetectedTime: number;
|
|
122
|
+
confidence: number;
|
|
123
|
+
duration: number;
|
|
124
|
+
sliceIndex: number;
|
|
125
|
+
analysis?: {
|
|
126
|
+
averageAmplitude: number;
|
|
127
|
+
peakAmplitude: number;
|
|
128
|
+
spectralCentroid?: number;
|
|
129
|
+
zeroCrossingRate?: number;
|
|
130
|
+
};
|
|
131
|
+
currentThreshold?: number;
|
|
132
|
+
environmentNoise?: number;
|
|
133
|
+
}
|
|
134
|
+
export interface RealtimeTranscribeEvent {
|
|
135
|
+
type: 'start' | 'transcribe' | 'end' | 'error';
|
|
136
|
+
sliceIndex: number;
|
|
137
|
+
data?: TranscribeResult;
|
|
138
|
+
isCapturing: boolean;
|
|
139
|
+
processTime: number;
|
|
140
|
+
recordingTime: number;
|
|
141
|
+
memoryUsage?: {
|
|
142
|
+
slicesInMemory: number;
|
|
143
|
+
totalSamples: number;
|
|
144
|
+
estimatedMB: number;
|
|
145
|
+
};
|
|
146
|
+
vadEvent?: RealtimeVadEvent;
|
|
147
|
+
}
|
|
148
|
+
export interface RealtimeOptions {
|
|
149
|
+
audioSliceSec?: number;
|
|
150
|
+
audioMinSec?: number;
|
|
151
|
+
maxSlicesInMemory?: number;
|
|
152
|
+
vadOptions?: VadOptions;
|
|
153
|
+
vadPreset?: keyof typeof VAD_PRESETS;
|
|
154
|
+
autoSliceOnSpeechEnd?: boolean;
|
|
155
|
+
autoSliceThreshold?: number;
|
|
156
|
+
transcribeOptions?: TranscribeOptions;
|
|
157
|
+
initialPrompt?: string;
|
|
158
|
+
promptPreviousSlices?: boolean;
|
|
159
|
+
audioOutputPath?: string;
|
|
160
|
+
audioStreamConfig?: AudioStreamConfig;
|
|
161
|
+
logger?: (message: string) => void;
|
|
162
|
+
}
|
|
163
|
+
export interface AudioSlice {
|
|
164
|
+
index: number;
|
|
165
|
+
data: Uint8Array;
|
|
166
|
+
sampleCount: number;
|
|
167
|
+
startTime: number;
|
|
168
|
+
endTime: number;
|
|
169
|
+
isProcessed: boolean;
|
|
170
|
+
isReleased: boolean;
|
|
171
|
+
}
|
|
172
|
+
export interface AudioSliceNoData extends Omit<AudioSlice, 'data'> {
|
|
173
|
+
}
|
|
174
|
+
export interface MemoryUsage {
|
|
175
|
+
slicesInMemory: number;
|
|
176
|
+
totalSamples: number;
|
|
177
|
+
estimatedMB: number;
|
|
178
|
+
}
|
|
179
|
+
export interface RealtimeStatsEvent {
|
|
180
|
+
timestamp: number;
|
|
181
|
+
type: 'slice_processed' | 'vad_change' | 'memory_change' | 'status_change';
|
|
182
|
+
data: {
|
|
183
|
+
isActive: boolean;
|
|
184
|
+
isTranscribing: boolean;
|
|
185
|
+
vadEnabled: boolean;
|
|
186
|
+
audioStats: any;
|
|
187
|
+
vadStats: any;
|
|
188
|
+
sliceStats: any;
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
export interface RealtimeTranscriberCallbacks {
|
|
192
|
+
onTranscribe?: (event: RealtimeTranscribeEvent) => void;
|
|
193
|
+
onVad?: (event: RealtimeVadEvent) => void;
|
|
194
|
+
onError?: (error: string) => void;
|
|
195
|
+
onStatusChange?: (isActive: boolean) => void;
|
|
196
|
+
onStatsUpdate?: (event: RealtimeStatsEvent) => void;
|
|
197
|
+
}
|
|
198
|
+
export type WhisperContextLike = {
|
|
199
|
+
transcribeData: (data: SharedArrayBuffer, options: TranscribeOptions) => {
|
|
200
|
+
stop: () => Promise<void>;
|
|
201
|
+
promise: Promise<TranscribeResult>;
|
|
202
|
+
};
|
|
203
|
+
};
|
|
204
|
+
export type WhisperVadContextLike = {
|
|
205
|
+
detectSpeechData: (data: SharedArrayBuffer, options: VadOptions) => Promise<Array<{
|
|
206
|
+
t0: number;
|
|
207
|
+
t1: number;
|
|
208
|
+
}>>;
|
|
209
|
+
};
|
|
210
|
+
export interface RealtimeTranscriberDependencies {
|
|
211
|
+
whisperContext: WhisperContextLike;
|
|
212
|
+
vadContext?: WhisperVadContextLike;
|
|
213
|
+
audioStream: AudioStreamInterface;
|
|
214
|
+
fs?: WavFileWriterFs;
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/realtime-transcription/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export interface WavFileReaderFs {
|
|
2
|
+
readFile: (filePath: string, encoding: string) => Promise<string>;
|
|
3
|
+
exists: (filePath: string) => Promise<boolean>;
|
|
4
|
+
unlink: (filePath: string) => Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
export interface WavFileHeader {
|
|
7
|
+
sampleRate: number;
|
|
8
|
+
channels: number;
|
|
9
|
+
bitsPerSample: number;
|
|
10
|
+
dataSize: number;
|
|
11
|
+
duration: number;
|
|
12
|
+
}
|
|
13
|
+
export declare class WavFileReader {
|
|
14
|
+
private filePath;
|
|
15
|
+
private header;
|
|
16
|
+
private audioData;
|
|
17
|
+
private fs;
|
|
18
|
+
constructor(fs: {
|
|
19
|
+
exists: (filePath: string) => Promise<boolean>;
|
|
20
|
+
readFile: (filePath: string, encoding: string) => Promise<string>;
|
|
21
|
+
}, filePath: string);
|
|
22
|
+
/**
|
|
23
|
+
* Read and parse the WAV file
|
|
24
|
+
*/
|
|
25
|
+
initialize(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Parse WAV file header
|
|
28
|
+
*/
|
|
29
|
+
private static parseWavHeader;
|
|
30
|
+
/**
|
|
31
|
+
* Get audio data slice
|
|
32
|
+
*/
|
|
33
|
+
getAudioSlice(startByte: number, lengthBytes: number): Uint8Array | null;
|
|
34
|
+
getAudioData(): Uint8Array | null;
|
|
35
|
+
/**
|
|
36
|
+
* Get WAV file header information
|
|
37
|
+
*/
|
|
38
|
+
getHeader(): WavFileHeader | null;
|
|
39
|
+
/**
|
|
40
|
+
* Get total audio data size
|
|
41
|
+
*/
|
|
42
|
+
getTotalDataSize(): number;
|
|
43
|
+
/**
|
|
44
|
+
* Convert byte position to time in seconds
|
|
45
|
+
*/
|
|
46
|
+
byteToTime(bytePosition: number): number;
|
|
47
|
+
/**
|
|
48
|
+
* Convert time in seconds to byte position
|
|
49
|
+
*/
|
|
50
|
+
timeToByte(timeSeconds: number): number;
|
|
51
|
+
/**
|
|
52
|
+
* Get file statistics
|
|
53
|
+
*/
|
|
54
|
+
getStatistics(): {
|
|
55
|
+
filePath: string;
|
|
56
|
+
header: WavFileHeader | null;
|
|
57
|
+
totalDataSize: number;
|
|
58
|
+
isInitialized: boolean;
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=WavFileReader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WavFileReader.d.ts","sourceRoot":"","sources":["../../../src/utils/WavFileReader.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IACjE,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC9C,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5C;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAQ;IAExB,OAAO,CAAC,MAAM,CAA6B;IAE3C,OAAO,CAAC,SAAS,CAA0B;IAE3C,OAAO,CAAC,EAAE,CAGT;gBAEW,EAAE,EAAE;QACd,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;QAC9C,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;KAClE,EAAE,QAAQ,EAAE,MAAM;IAKnB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IA0D7B;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAexE,YAAY,IAAI,UAAU,GAAG,IAAI;IAIjC;;OAEG;IACH,SAAS,IAAI,aAAa,GAAG,IAAI;IAIjC;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAUxC;;OAEG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAUvC;;OAEG;IACH,aAAa;;;;;;CAQd"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export interface WavFileConfig {
|
|
2
|
+
sampleRate: number;
|
|
3
|
+
channels: number;
|
|
4
|
+
bitsPerSample: number;
|
|
5
|
+
}
|
|
6
|
+
export interface WavFileWriterFs {
|
|
7
|
+
writeFile: (filePath: string, data: string, encoding: string) => Promise<void>;
|
|
8
|
+
appendFile: (filePath: string, data: string, encoding: string) => Promise<void>;
|
|
9
|
+
readFile: (filePath: string, encoding: string) => Promise<string>;
|
|
10
|
+
exists: (filePath: string) => Promise<boolean>;
|
|
11
|
+
unlink: (filePath: string) => Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export declare class WavFileWriter {
|
|
14
|
+
private fs;
|
|
15
|
+
private filePath;
|
|
16
|
+
private config;
|
|
17
|
+
private dataSize;
|
|
18
|
+
private isWriting;
|
|
19
|
+
private writeQueue;
|
|
20
|
+
constructor(fs: WavFileWriterFs, filePath: string, config: WavFileConfig);
|
|
21
|
+
/**
|
|
22
|
+
* Initialize the WAV file with headers
|
|
23
|
+
*/
|
|
24
|
+
initialize(): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Append PCM audio data to the WAV file
|
|
27
|
+
*/
|
|
28
|
+
appendAudioData(audioData: Uint8Array): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Process the write queue to avoid blocking
|
|
31
|
+
*/
|
|
32
|
+
private processWriteQueue;
|
|
33
|
+
/**
|
|
34
|
+
* Finalize the WAV file by updating the header with correct sizes
|
|
35
|
+
*/
|
|
36
|
+
finalize(): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Create WAV file header
|
|
39
|
+
*/
|
|
40
|
+
private createWavHeader;
|
|
41
|
+
/**
|
|
42
|
+
* Cancel writing and cleanup
|
|
43
|
+
*/
|
|
44
|
+
cancel(): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Get current file statistics
|
|
47
|
+
*/
|
|
48
|
+
getStatistics(): {
|
|
49
|
+
filePath: string;
|
|
50
|
+
dataSize: number;
|
|
51
|
+
durationSec: number;
|
|
52
|
+
isWriting: boolean;
|
|
53
|
+
queuedChunks: number;
|
|
54
|
+
estimatedFileSizeMB: number;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=WavFileWriter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WavFileWriter.d.ts","sourceRoot":"","sources":["../../../src/utils/WavFileWriter.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9E,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/E,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IACjE,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC9C,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5C;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAAiB;IAE3B,OAAO,CAAC,QAAQ,CAAQ;IAExB,OAAO,CAAC,MAAM,CAAe;IAE7B,OAAO,CAAC,QAAQ,CAAI;IAEpB,OAAO,CAAC,SAAS,CAAQ;IAEzB,OAAO,CAAC,UAAU,CAAmB;gBAEzB,EAAE,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa;IAMxE;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBjC;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB3D;;OAEG;YACW,iBAAiB;IA+B/B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B/B;;OAEG;IACH,OAAO,CAAC,eAAe;IA0BvB;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAe7B;;OAEG;IACH,aAAa;;;;;;;;CAYd"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert base64 string to Uint8Array
|
|
3
|
+
*/
|
|
4
|
+
export declare function base64ToUint8Array(base64: string): Uint8Array;
|
|
5
|
+
/**
|
|
6
|
+
* Convert Uint8Array to base64 string
|
|
7
|
+
*/
|
|
8
|
+
export declare function uint8ArrayToBase64(buffer: Uint8Array): string;
|
|
9
|
+
//# sourceMappingURL=common.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../src/utils/common.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAG7D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAG7D"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "whisper.rn",
|
|
3
|
-
"version": "0.5.0-rc.
|
|
3
|
+
"version": "0.5.0-rc.3",
|
|
4
4
|
"description": "React Native binding of whisper.cpp",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
|
7
7
|
"types": "lib/typescript/index.d.ts",
|
|
8
8
|
"react-native": "src/index",
|
|
9
9
|
"source": "src/index",
|
|
10
|
+
"exports": {
|
|
11
|
+
"./*": {
|
|
12
|
+
"import": "./lib/module/*",
|
|
13
|
+
"require": "./lib/commonjs/*",
|
|
14
|
+
"types": "./lib/typescript/*",
|
|
15
|
+
"react-native": "src/*"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
10
18
|
"files": [
|
|
11
19
|
"src",
|
|
12
20
|
"lib",
|
|
@@ -29,7 +37,7 @@
|
|
|
29
37
|
],
|
|
30
38
|
"scripts": {
|
|
31
39
|
"bootstrap": "./scripts/bootstrap.sh",
|
|
32
|
-
"docgen": "typedoc src/index.ts --plugin typedoc-plugin-markdown --excludePrivate --readme none --out docs/API",
|
|
40
|
+
"docgen": "typedoc src/index.ts src/realtime-transcription/index.ts --plugin typedoc-plugin-markdown --excludePrivate --readme none --out docs/API",
|
|
33
41
|
"lint": "eslint \"**/*.{js,ts,tsx}\"",
|
|
34
42
|
"typecheck": "tsc --noEmit",
|
|
35
43
|
"build": "bob build",
|
|
@@ -62,6 +70,7 @@
|
|
|
62
70
|
"@commitlint/config-conventional": "^17.0.2",
|
|
63
71
|
"@evilmartians/lefthook": "^1.2.2",
|
|
64
72
|
"@fugood/eslint-config-react": "^0.5.0",
|
|
73
|
+
"@fugood/react-native-audio-pcm-stream": "^1.1.4",
|
|
65
74
|
"@react-native/babel-preset": "0.76.9",
|
|
66
75
|
"@react-native/metro-config": "0.76.9",
|
|
67
76
|
"@release-it/conventional-changelog": "^5.0.0",
|
|
@@ -83,13 +92,13 @@
|
|
|
83
92
|
"typedoc-plugin-markdown": "^3.15.3",
|
|
84
93
|
"typescript": "^4.9.5"
|
|
85
94
|
},
|
|
86
|
-
"resolutions": {
|
|
87
|
-
"@types/react": "17.0.21"
|
|
88
|
-
},
|
|
89
95
|
"peerDependencies": {
|
|
90
96
|
"react": "*",
|
|
91
97
|
"react-native": "*"
|
|
92
98
|
},
|
|
99
|
+
"resolutions": {
|
|
100
|
+
"@types/react": "17.0.21"
|
|
101
|
+
},
|
|
93
102
|
"engines": {
|
|
94
103
|
"node": ">=18"
|
|
95
104
|
},
|
|
@@ -146,5 +155,8 @@
|
|
|
146
155
|
"type": "all",
|
|
147
156
|
"jsSrcsDir": "./src/"
|
|
148
157
|
},
|
|
149
|
-
"packageManager": "yarn@1.22.22"
|
|
158
|
+
"packageManager": "yarn@1.22.22",
|
|
159
|
+
"dependencies": {
|
|
160
|
+
"safe-buffer": "^5.2.1"
|
|
161
|
+
}
|
|
150
162
|
}
|
package/src/AudioSessionIos.ts
CHANGED
|
@@ -42,10 +42,11 @@ export enum AudioSessionModeIos {
|
|
|
42
42
|
|
|
43
43
|
const checkPlatform = () => {
|
|
44
44
|
if (Platform.OS !== 'ios') throw new Error('Only supported on iOS')
|
|
45
|
+
console.warn('AudioSessionIos is deprecated. To use whisper.rn for realtime transcription, use the new RealtimeTranscriber instead.')
|
|
45
46
|
}
|
|
46
47
|
|
|
47
48
|
/**
|
|
48
|
-
* AudioSession Utility, iOS only.
|
|
49
|
+
* [Deprecated] AudioSession Utility, iOS only.
|
|
49
50
|
*/
|
|
50
51
|
export default {
|
|
51
52
|
Category: AudioSessionCategoryIos,
|
|
@@ -63,7 +64,7 @@ export default {
|
|
|
63
64
|
options: result.options?.map((option: string) => (option.replace('AVAudioSessionCategoryOption', '') as AudioSessionCategoryOptionIos)),
|
|
64
65
|
}
|
|
65
66
|
},
|
|
66
|
-
|
|
67
|
+
|
|
67
68
|
getCurrentMode: async (): Promise<AudioSessionModeIos> => {
|
|
68
69
|
checkPlatform()
|
|
69
70
|
const mode = await RNWhisper.getAudioSessionCurrentMode()
|
package/src/NativeRNWhisper.ts
CHANGED
package/src/index.ts
CHANGED
|
@@ -82,10 +82,25 @@ export type {
|
|
|
82
82
|
|
|
83
83
|
const EVENT_ON_TRANSCRIBE_PROGRESS = '@RNWhisper_onTranscribeProgress'
|
|
84
84
|
const EVENT_ON_TRANSCRIBE_NEW_SEGMENTS = '@RNWhisper_onTranscribeNewSegments'
|
|
85
|
+
const EVENT_ON_NATIVE_LOG = '@RNWhisper_onNativeLog'
|
|
85
86
|
|
|
86
87
|
const EVENT_ON_REALTIME_TRANSCRIBE = '@RNWhisper_onRealtimeTranscribe'
|
|
87
88
|
const EVENT_ON_REALTIME_TRANSCRIBE_END = '@RNWhisper_onRealtimeTranscribeEnd'
|
|
88
89
|
|
|
90
|
+
const logListeners: Array<(level: string, text: string) => void> = []
|
|
91
|
+
|
|
92
|
+
// @ts-ignore
|
|
93
|
+
if (EventEmitter) {
|
|
94
|
+
EventEmitter.addListener(
|
|
95
|
+
EVENT_ON_NATIVE_LOG,
|
|
96
|
+
(evt: { level: string; text: string }) => {
|
|
97
|
+
logListeners.forEach((listener) => listener(evt.level, evt.text))
|
|
98
|
+
},
|
|
99
|
+
)
|
|
100
|
+
// Trigger unset to use default log callback
|
|
101
|
+
RNWhisper?.toggleNativeLog?.(false)?.catch?.(() => {})
|
|
102
|
+
}
|
|
103
|
+
|
|
89
104
|
export type TranscribeNewSegmentsResult = {
|
|
90
105
|
nNew: number
|
|
91
106
|
totalNNew: number
|
|
@@ -444,6 +459,10 @@ export class WhisperContext {
|
|
|
444
459
|
/** Subscribe to realtime transcribe events */
|
|
445
460
|
subscribe: (callback: (event: TranscribeRealtimeEvent) => void) => void
|
|
446
461
|
}> {
|
|
462
|
+
console.warn(
|
|
463
|
+
'`transcribeRealtime` is deprecated, use `RealtimeTranscriber` instead',
|
|
464
|
+
)
|
|
465
|
+
|
|
447
466
|
let lastTranscribePayload: TranscribeRealtimeNativePayload
|
|
448
467
|
|
|
449
468
|
const slices: TranscribeRealtimeNativePayload[] = []
|
|
@@ -842,3 +861,18 @@ export async function initWhisperVad({
|
|
|
842
861
|
export async function releaseAllWhisperVad(): Promise<void> {
|
|
843
862
|
return RNWhisper.releaseAllVadContexts()
|
|
844
863
|
}
|
|
864
|
+
|
|
865
|
+
export async function toggleNativeLog(enabled: boolean): Promise<void> {
|
|
866
|
+
return RNWhisper.toggleNativeLog(enabled)
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
export function addNativeLogListener(
|
|
870
|
+
listener: (level: string, text: string) => void,
|
|
871
|
+
): { remove: () => void } {
|
|
872
|
+
logListeners.push(listener)
|
|
873
|
+
return {
|
|
874
|
+
remove: () => {
|
|
875
|
+
logListeners.splice(logListeners.indexOf(listener), 1)
|
|
876
|
+
},
|
|
877
|
+
}
|
|
878
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import { NativeModules, DeviceEventEmitter } from 'react-native'
|
|
2
2
|
|
|
3
3
|
if (!NativeModules.RNWhisper) {
|
|
4
4
|
NativeModules.RNWhisper = {
|
|
@@ -97,4 +97,4 @@ if (!NativeModules.RNWhisper) {
|
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
module.exports = jest.requireActual('whisper.rn')
|
|
100
|
+
module.exports = jest.requireActual('whisper.rn/index')
|