whisper.rn 0.2.0 → 0.2.1
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 +1 -1
- package/android/src/main/java/com/rnwhisper/WhisperContext.java +73 -45
- package/android/src/main/jni/whisper/jni.cpp +2 -1
- package/ios/RNWhisperContext.h +2 -0
- package/ios/RNWhisperContext.mm +60 -37
- package/jest/mock.js +6 -1
- package/lib/commonjs/index.js +5 -9
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/index.js +5 -9
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/index.d.ts +2 -0
- package/lib/typescript/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/index.tsx +12 -9
package/README.md
CHANGED
|
@@ -57,7 +57,7 @@ const { result } = await promise
|
|
|
57
57
|
Use realtime transcribe:
|
|
58
58
|
|
|
59
59
|
```js
|
|
60
|
-
const { stop, subscribe } = whisperContext.transcribeRealtime(options)
|
|
60
|
+
const { stop, subscribe } = await whisperContext.transcribeRealtime(options)
|
|
61
61
|
|
|
62
62
|
subscribe(evt => {
|
|
63
63
|
const { isCapturing, data, processTime, recordingTime } = evt
|
|
@@ -49,9 +49,12 @@ public class WhisperContext {
|
|
|
49
49
|
private int bufferSize;
|
|
50
50
|
private short[] buffer16;
|
|
51
51
|
private int nSamples = 0;
|
|
52
|
+
private int nSamplesTranscribing = 0;
|
|
52
53
|
private boolean isCapturing = false;
|
|
54
|
+
private boolean isStoppedByAction = false;
|
|
53
55
|
private boolean isTranscribing = false;
|
|
54
56
|
private boolean isRealtime = false;
|
|
57
|
+
private Thread fullHandler = null;
|
|
55
58
|
|
|
56
59
|
public WhisperContext(int id, ReactApplicationContext reactContext, long context) {
|
|
57
60
|
this.id = id;
|
|
@@ -81,8 +84,11 @@ public class WhisperContext {
|
|
|
81
84
|
|
|
82
85
|
this.jobId = jobId;
|
|
83
86
|
isCapturing = true;
|
|
87
|
+
isStoppedByAction = false;
|
|
84
88
|
isRealtime = true;
|
|
85
89
|
nSamples = 0;
|
|
90
|
+
nSamplesTranscribing = 0;
|
|
91
|
+
fullHandler = null;
|
|
86
92
|
|
|
87
93
|
recorder.startRecording();
|
|
88
94
|
|
|
@@ -91,68 +97,38 @@ public class WhisperContext {
|
|
|
91
97
|
public void run() {
|
|
92
98
|
try {
|
|
93
99
|
short[] buffer = new short[bufferSize];
|
|
94
|
-
Thread fullHandler = null;
|
|
95
100
|
while (isCapturing) {
|
|
96
101
|
try {
|
|
97
102
|
int n = recorder.read(buffer, 0, bufferSize);
|
|
98
103
|
if (n == 0) continue;
|
|
99
104
|
|
|
100
105
|
if (nSamples + n > maxAudioSec * SAMPLE_RATE) {
|
|
101
|
-
// Full,
|
|
106
|
+
// Full, stop capturing
|
|
102
107
|
isCapturing = false;
|
|
103
|
-
if (!isTranscribing)
|
|
108
|
+
if (!isTranscribing && nSamples == nSamplesTranscribing) {
|
|
104
109
|
emitTranscribeEvent("@RNWhisper_onRealtimeTranscribeEnd", Arguments.createMap());
|
|
110
|
+
} else {
|
|
111
|
+
// wait previous handler to finish
|
|
112
|
+
fullHandler.join();
|
|
113
|
+
fullTranscribeSamples(options, true);
|
|
114
|
+
}
|
|
105
115
|
break;
|
|
106
116
|
}
|
|
117
|
+
|
|
118
|
+
// Append to buffer
|
|
107
119
|
nSamples += n;
|
|
108
120
|
for (int i = 0; i < n; i++) {
|
|
109
121
|
buffer16[nSamples + i] = buffer[i];
|
|
110
122
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
Log.d(NAME, "Start transcribing realtime: " + nSamples);
|
|
114
|
-
fullHandler = new Thread(new Runnable() {
|
|
115
|
-
@Override
|
|
116
|
-
public void run() {
|
|
117
|
-
if (!isCapturing) return;
|
|
118
|
-
|
|
119
|
-
// convert I16 to F32
|
|
120
|
-
float[] nSamplesBuffer32 = new float[nSamples];
|
|
121
|
-
for (int i = 0; i < nSamples; i++) {
|
|
122
|
-
nSamplesBuffer32[i] = buffer16[i] / 32768.0f;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
int timeStart = (int) System.currentTimeMillis();
|
|
126
|
-
int code = full(jobId, options, nSamplesBuffer32, nSamples);
|
|
127
|
-
int timeEnd = (int) System.currentTimeMillis();
|
|
128
|
-
int timeRecording = (int) (nSamples / SAMPLE_RATE * 1000);
|
|
129
|
-
|
|
130
|
-
WritableMap payload = Arguments.createMap();
|
|
131
|
-
payload.putBoolean("isCapturing", isCapturing);
|
|
132
|
-
payload.putInt("code", code);
|
|
133
|
-
payload.putInt("processTime", timeEnd - timeStart);
|
|
134
|
-
payload.putInt("recordingTime", timeRecording);
|
|
135
|
-
|
|
136
|
-
if (code == 0) {
|
|
137
|
-
payload.putMap("data", getTextSegments());
|
|
138
|
-
emitTranscribeEvent("@RNWhisper_onRealtimeTranscribe", payload);
|
|
139
|
-
} else {
|
|
140
|
-
payload.putString("error", "Transcribe failed with code " + code);
|
|
141
|
-
emitTranscribeEvent("@RNWhisper_onRealtimeTranscribe", payload);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
if (!isCapturing) {
|
|
145
|
-
emitTranscribeEvent("@RNWhisper_onRealtimeTranscribeEnd", Arguments.createMap());
|
|
146
|
-
}
|
|
147
|
-
isTranscribing = false;
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
fullHandler.start();
|
|
151
|
-
}
|
|
123
|
+
|
|
124
|
+
fullTranscribeSamples(options, false);
|
|
152
125
|
} catch (Exception e) {
|
|
153
126
|
Log.e(NAME, "Error transcribing realtime: " + e.getMessage());
|
|
154
127
|
}
|
|
155
128
|
}
|
|
129
|
+
if (!isTranscribing) {
|
|
130
|
+
emitTranscribeEvent("@RNWhisper_onRealtimeTranscribeEnd", Arguments.createMap());
|
|
131
|
+
}
|
|
156
132
|
if (fullHandler != null) {
|
|
157
133
|
fullHandler.join(); // Wait for full transcribe to finish
|
|
158
134
|
}
|
|
@@ -165,10 +141,61 @@ public class WhisperContext {
|
|
|
165
141
|
}
|
|
166
142
|
}
|
|
167
143
|
}).start();
|
|
168
|
-
|
|
169
144
|
return state;
|
|
170
145
|
}
|
|
171
146
|
|
|
147
|
+
private void fullTranscribeSamples(ReadableMap options, boolean skipCapturingCheck) {
|
|
148
|
+
if (!isTranscribing && nSamples > SAMPLE_RATE / 2) {
|
|
149
|
+
isTranscribing = true;
|
|
150
|
+
fullHandler = new Thread(new Runnable() {
|
|
151
|
+
@Override
|
|
152
|
+
public void run() {
|
|
153
|
+
if (!isCapturing && !skipCapturingCheck) return;
|
|
154
|
+
|
|
155
|
+
nSamplesTranscribing = nSamples;
|
|
156
|
+
|
|
157
|
+
// convert I16 to F32
|
|
158
|
+
float[] nSamplesBuffer32 = new float[nSamplesTranscribing];
|
|
159
|
+
for (int i = 0; i < nSamplesTranscribing; i++) {
|
|
160
|
+
nSamplesBuffer32[i] = buffer16[i] / 32768.0f;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
Log.d(NAME, "Start transcribing realtime: " + nSamplesTranscribing);
|
|
164
|
+
|
|
165
|
+
int timeStart = (int) System.currentTimeMillis();
|
|
166
|
+
int code = full(jobId, options, nSamplesBuffer32, nSamplesTranscribing);
|
|
167
|
+
int timeEnd = (int) System.currentTimeMillis();
|
|
168
|
+
int timeRecording = (int) (nSamplesTranscribing / SAMPLE_RATE * 1000);
|
|
169
|
+
|
|
170
|
+
WritableMap payload = Arguments.createMap();
|
|
171
|
+
payload.putInt("code", code);
|
|
172
|
+
payload.putInt("processTime", timeEnd - timeStart);
|
|
173
|
+
payload.putInt("recordingTime", timeRecording);
|
|
174
|
+
|
|
175
|
+
if (code == 0) {
|
|
176
|
+
payload.putMap("data", getTextSegments());
|
|
177
|
+
} else {
|
|
178
|
+
payload.putString("error", "Transcribe failed with code " + code);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (isStoppedByAction || !isCapturing && nSamplesTranscribing == nSamples) {
|
|
182
|
+
payload.putBoolean("isCapturing", false);
|
|
183
|
+
payload.putBoolean("isStoppedByAction", isStoppedByAction);
|
|
184
|
+
emitTranscribeEvent("@RNWhisper_onRealtimeTranscribeEnd", payload);
|
|
185
|
+
} else if (code == 0) {
|
|
186
|
+
payload.putBoolean("isCapturing", true);
|
|
187
|
+
emitTranscribeEvent("@RNWhisper_onRealtimeTranscribe", payload);
|
|
188
|
+
} else {
|
|
189
|
+
payload.putBoolean("isCapturing", true);
|
|
190
|
+
emitTranscribeEvent("@RNWhisper_onRealtimeTranscribe", payload);
|
|
191
|
+
}
|
|
192
|
+
isTranscribing = false;
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
fullHandler.start();
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
172
199
|
private void emitTranscribeEvent(final String eventName, final WritableMap payload) {
|
|
173
200
|
WritableMap event = Arguments.createMap();
|
|
174
201
|
event.putInt("contextId", WhisperContext.this.id);
|
|
@@ -269,6 +296,7 @@ public class WhisperContext {
|
|
|
269
296
|
abortTranscribe(jobId);
|
|
270
297
|
isCapturing = false;
|
|
271
298
|
isTranscribing = false;
|
|
299
|
+
isStoppedByAction = true;
|
|
272
300
|
}
|
|
273
301
|
|
|
274
302
|
public void stopCurrentTranscribe() {
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
#include <cstdlib>
|
|
6
6
|
#include <sys/sysinfo.h>
|
|
7
7
|
#include <string>
|
|
8
|
+
#include <thread>
|
|
8
9
|
#include "whisper.h"
|
|
9
10
|
#include "rn-whisper.h"
|
|
10
11
|
#include "ggml.h"
|
|
@@ -61,7 +62,7 @@ Java_com_rnwhisper_WhisperContext_fullTranscribe(
|
|
|
61
62
|
struct whisper_context *context = reinterpret_cast<struct whisper_context *>(context_ptr);
|
|
62
63
|
jfloat *audio_data_arr = env->GetFloatArrayElements(audio_data, nullptr);
|
|
63
64
|
|
|
64
|
-
int max_threads = min(4,
|
|
65
|
+
int max_threads = min(4, std::thread::hardware_concurrency());
|
|
65
66
|
|
|
66
67
|
LOGI("About to create params");
|
|
67
68
|
|
package/ios/RNWhisperContext.h
CHANGED
package/ios/RNWhisperContext.mm
CHANGED
|
@@ -53,6 +53,9 @@ void AudioInputCallback(void * inUserData,
|
|
|
53
53
|
|
|
54
54
|
if (!state->isCapturing) {
|
|
55
55
|
NSLog(@"[RNWhisper] Not capturing, ignoring audio");
|
|
56
|
+
if (!state->isTranscribing) {
|
|
57
|
+
state->transcribeHandler(state->jobId, @"end", @{});
|
|
58
|
+
}
|
|
56
59
|
return;
|
|
57
60
|
}
|
|
58
61
|
|
|
@@ -60,12 +63,17 @@ void AudioInputCallback(void * inUserData,
|
|
|
60
63
|
NSLog(@"[RNWhisper] Captured %d new samples", n);
|
|
61
64
|
|
|
62
65
|
if (state->nSamples + n > state->maxAudioSec * WHISPER_SAMPLE_RATE) {
|
|
63
|
-
NSLog(@"[RNWhisper] Audio buffer is full,
|
|
66
|
+
NSLog(@"[RNWhisper] Audio buffer is full, stop capturing");
|
|
64
67
|
state->isCapturing = false;
|
|
65
|
-
|
|
68
|
+
[state->mSelf stopAudio];
|
|
69
|
+
if (!state->isTranscribing && state->nSamples == state->nSamplesTranscribing) {
|
|
66
70
|
state->transcribeHandler(state->jobId, @"end", @{});
|
|
71
|
+
} else if (!state->isTranscribing && state->nSamples != state->nSamplesTranscribing) {
|
|
72
|
+
state->isTranscribing = true;
|
|
73
|
+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
74
|
+
[state->mSelf fullTranscribeSamples:state];
|
|
75
|
+
});
|
|
67
76
|
}
|
|
68
|
-
[state->mSelf stopAudio];
|
|
69
77
|
return;
|
|
70
78
|
}
|
|
71
79
|
|
|
@@ -79,44 +87,58 @@ void AudioInputCallback(void * inUserData,
|
|
|
79
87
|
if (!state->isTranscribing) {
|
|
80
88
|
state->isTranscribing = true;
|
|
81
89
|
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
82
|
-
|
|
83
|
-
// convert I16 to F32
|
|
84
|
-
for (int i = 0; i < state->nSamples; i++) {
|
|
85
|
-
state->audioBufferF32[i] = (float)state->audioBufferI16[i] / 32768.0f;
|
|
86
|
-
}
|
|
87
|
-
CFTimeInterval timeStart = CACurrentMediaTime();
|
|
88
|
-
|
|
89
|
-
int code = [state->mSelf fullTranscribe:state->jobId audioData:state->audioBufferF32 audioDataCount:state->nSamples options:state->options];
|
|
90
|
-
|
|
91
|
-
CFTimeInterval timeEnd = CACurrentMediaTime();
|
|
92
|
-
const float timeRecording = (float) state->nSamples / (float) state->dataFormat.mSampleRate;
|
|
93
|
-
if (code == 0) {
|
|
94
|
-
state->transcribeHandler(state->jobId, @"transcribe", @{
|
|
95
|
-
@"isCapturing": @(state->isCapturing),
|
|
96
|
-
@"code": [NSNumber numberWithInt:code],
|
|
97
|
-
@"data": [state->mSelf getTextSegments],
|
|
98
|
-
@"processTime": [NSNumber numberWithInt:(timeEnd - timeStart) * 1E3],
|
|
99
|
-
@"recordingTime": [NSNumber numberWithInt:timeRecording * 1E3],
|
|
100
|
-
});
|
|
101
|
-
state->isTranscribing = false;
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
state->transcribeHandler(state->jobId, @"transcribe", @{
|
|
105
|
-
@"isCapturing": @(state->isCapturing),
|
|
106
|
-
@"code": [NSNumber numberWithInt:code],
|
|
107
|
-
@"error": [NSString stringWithFormat:@"Transcribe failed with code %d", code],
|
|
108
|
-
@"processTime": [NSNumber numberWithDouble:timeEnd - timeStart],
|
|
109
|
-
@"recordingTime": [NSNumber numberWithFloat:timeRecording],
|
|
110
|
-
});
|
|
111
|
-
if (!state->isCapturing) {
|
|
112
|
-
NSLog(@"[RNWhisper] Transcribe end");
|
|
113
|
-
state->transcribeHandler(state->jobId, @"end", @{});
|
|
114
|
-
}
|
|
115
|
-
state->isTranscribing = false;
|
|
90
|
+
[state->mSelf fullTranscribeSamples:state];
|
|
116
91
|
});
|
|
117
92
|
}
|
|
118
93
|
}
|
|
119
94
|
|
|
95
|
+
- (void)fullTranscribeSamples:(RNWhisperContextRecordState*) state {
|
|
96
|
+
state->nSamplesTranscribing = state->nSamples;
|
|
97
|
+
NSLog(@"[RNWhisper] Transcribing %d samples", state->nSamplesTranscribing);
|
|
98
|
+
|
|
99
|
+
// convert I16 to F32
|
|
100
|
+
for (int i = 0; i < state->nSamplesTranscribing; i++) {
|
|
101
|
+
state->audioBufferF32[i] = (float)state->audioBufferI16[i] / 32768.0f;
|
|
102
|
+
}
|
|
103
|
+
CFTimeInterval timeStart = CACurrentMediaTime();
|
|
104
|
+
int code = [state->mSelf fullTranscribe:state->jobId audioData:state->audioBufferF32 audioDataCount:state->nSamplesTranscribing options:state->options];
|
|
105
|
+
CFTimeInterval timeEnd = CACurrentMediaTime();
|
|
106
|
+
const float timeRecording = (float) state->nSamplesTranscribing / (float) state->dataFormat.mSampleRate;
|
|
107
|
+
|
|
108
|
+
NSDictionary* base = @{
|
|
109
|
+
@"code": [NSNumber numberWithInt:code],
|
|
110
|
+
@"processTime": [NSNumber numberWithInt:(timeEnd - timeStart) * 1E3],
|
|
111
|
+
@"recordingTime": [NSNumber numberWithInt:timeRecording * 1E3],
|
|
112
|
+
};
|
|
113
|
+
NSMutableDictionary* result = [base mutableCopy];
|
|
114
|
+
|
|
115
|
+
if (code == 0) {
|
|
116
|
+
result[@"data"] = [state->mSelf getTextSegments];
|
|
117
|
+
} else {
|
|
118
|
+
result[@"error"] = [NSString stringWithFormat:@"Transcribe failed with code %d", code];
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (state->isStoppedByAction || (!state->isCapturing && state->nSamplesTranscribing == state->nSamples)) {
|
|
122
|
+
NSLog(@"[RNWhisper] Transcribe end");
|
|
123
|
+
result[@"isStoppedByAction"] = @(state->isStoppedByAction);
|
|
124
|
+
result[@"isCapturing"] = @(false);
|
|
125
|
+
state->transcribeHandler(state->jobId, @"end", result);
|
|
126
|
+
} else if (code == 0) {
|
|
127
|
+
result[@"isCapturing"] = @(true);
|
|
128
|
+
state->transcribeHandler(state->jobId, @"transcribe", result);
|
|
129
|
+
} else {
|
|
130
|
+
result[@"isCapturing"] = @(true);
|
|
131
|
+
state->transcribeHandler(state->jobId, @"transcribe", result);
|
|
132
|
+
}
|
|
133
|
+
state->isTranscribing = false;
|
|
134
|
+
|
|
135
|
+
if (!state->isCapturing && state->nSamplesTranscribing != state->nSamples) {
|
|
136
|
+
state->isTranscribing = true;
|
|
137
|
+
// Finish transcribing the rest of the samples
|
|
138
|
+
[self fullTranscribeSamples:state];
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
120
142
|
- (bool)isCapturing {
|
|
121
143
|
return self->recordState.isCapturing;
|
|
122
144
|
}
|
|
@@ -184,6 +206,7 @@ void AudioInputCallback(void * inUserData,
|
|
|
184
206
|
return;
|
|
185
207
|
}
|
|
186
208
|
self->recordState.isCapturing = false;
|
|
209
|
+
self->recordState.isStoppedByAction = true;
|
|
187
210
|
[self stopAudio];
|
|
188
211
|
}
|
|
189
212
|
|
package/jest/mock.js
CHANGED
|
@@ -23,7 +23,6 @@ if (!NativeModules.RNWhisper) {
|
|
|
23
23
|
recordingTime: 1000,
|
|
24
24
|
},
|
|
25
25
|
})
|
|
26
|
-
// End
|
|
27
26
|
DeviceEventEmitter.emit('@RNWhisper_onRealtimeTranscribe', {
|
|
28
27
|
contextId,
|
|
29
28
|
jobId,
|
|
@@ -37,6 +36,12 @@ if (!NativeModules.RNWhisper) {
|
|
|
37
36
|
recordingTime: 2000,
|
|
38
37
|
},
|
|
39
38
|
})
|
|
39
|
+
// End event
|
|
40
|
+
DeviceEventEmitter.emit('@RNWhisper_onRealtimeTranscribeEnd', {
|
|
41
|
+
contextId,
|
|
42
|
+
jobId,
|
|
43
|
+
payload: {},
|
|
44
|
+
})
|
|
40
45
|
})
|
|
41
46
|
}),
|
|
42
47
|
releaseContext: jest.fn(() => Promise.resolve()),
|
package/lib/commonjs/index.js
CHANGED
|
@@ -44,8 +44,6 @@ class WhisperContext {
|
|
|
44
44
|
let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
45
45
|
const jobId = Math.floor(Math.random() * 10000);
|
|
46
46
|
await RNWhisper.startRealtimeTranscribe(this.id, jobId, options);
|
|
47
|
-
let removeTranscribe;
|
|
48
|
-
let removeEnd;
|
|
49
47
|
let lastTranscribePayload;
|
|
50
48
|
return {
|
|
51
49
|
stop: () => RNWhisper.abortTranscribe(this.id, jobId),
|
|
@@ -62,25 +60,23 @@ class WhisperContext {
|
|
|
62
60
|
jobId: evt.jobId,
|
|
63
61
|
...payload
|
|
64
62
|
});
|
|
65
|
-
if (!payload.isCapturing) removeTranscribe();
|
|
66
63
|
});
|
|
67
|
-
removeTranscribe = transcribeListener.remove;
|
|
68
64
|
const endListener = EventEmitter.addListener(EVENT_ON_REALTIME_TRANSCRIBE_END, evt => {
|
|
69
|
-
var _removeTranscribe;
|
|
70
65
|
const {
|
|
71
|
-
contextId
|
|
66
|
+
contextId,
|
|
67
|
+
payload
|
|
72
68
|
} = evt;
|
|
73
69
|
if (contextId !== this.id || evt.jobId !== jobId) return;
|
|
74
70
|
callback({
|
|
75
71
|
contextId,
|
|
76
72
|
jobId: evt.jobId,
|
|
77
73
|
...lastTranscribePayload,
|
|
74
|
+
...payload,
|
|
78
75
|
isCapturing: false
|
|
79
76
|
});
|
|
80
|
-
(
|
|
81
|
-
|
|
77
|
+
transcribeListener.remove();
|
|
78
|
+
endListener.remove();
|
|
82
79
|
});
|
|
83
|
-
removeEnd = endListener.remove;
|
|
84
80
|
}
|
|
85
81
|
};
|
|
86
82
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","LINKING_ERROR","Platform","select","ios","default","RNWhisper","NativeModules","Proxy","get","Error","EventEmitter","OS","NativeEventEmitter","DeviceEventEmitter","EVENT_ON_REALTIME_TRANSCRIBE","EVENT_ON_REALTIME_TRANSCRIBE_END","WhisperContext","constructor","id","transcribe","path","options","arguments","length","undefined","jobId","Math","floor","random","stop","abortTranscribe","promise","transcribeFile","transcribeRealtime","startRealtimeTranscribe","
|
|
1
|
+
{"version":3,"names":["_reactNative","require","LINKING_ERROR","Platform","select","ios","default","RNWhisper","NativeModules","Proxy","get","Error","EventEmitter","OS","NativeEventEmitter","DeviceEventEmitter","EVENT_ON_REALTIME_TRANSCRIBE","EVENT_ON_REALTIME_TRANSCRIBE_END","WhisperContext","constructor","id","transcribe","path","options","arguments","length","undefined","jobId","Math","floor","random","stop","abortTranscribe","promise","transcribeFile","transcribeRealtime","startRealtimeTranscribe","lastTranscribePayload","subscribe","callback","transcribeListener","addListener","evt","contextId","payload","endListener","isCapturing","remove","release","releaseContext","initWhisper","filePath","initContext","releaseAllWhisper","releaseAllContexts"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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"}
|
package/lib/module/index.js
CHANGED
|
@@ -37,8 +37,6 @@ class WhisperContext {
|
|
|
37
37
|
let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
38
38
|
const jobId = Math.floor(Math.random() * 10000);
|
|
39
39
|
await RNWhisper.startRealtimeTranscribe(this.id, jobId, options);
|
|
40
|
-
let removeTranscribe;
|
|
41
|
-
let removeEnd;
|
|
42
40
|
let lastTranscribePayload;
|
|
43
41
|
return {
|
|
44
42
|
stop: () => RNWhisper.abortTranscribe(this.id, jobId),
|
|
@@ -55,25 +53,23 @@ class WhisperContext {
|
|
|
55
53
|
jobId: evt.jobId,
|
|
56
54
|
...payload
|
|
57
55
|
});
|
|
58
|
-
if (!payload.isCapturing) removeTranscribe();
|
|
59
56
|
});
|
|
60
|
-
removeTranscribe = transcribeListener.remove;
|
|
61
57
|
const endListener = EventEmitter.addListener(EVENT_ON_REALTIME_TRANSCRIBE_END, evt => {
|
|
62
|
-
var _removeTranscribe;
|
|
63
58
|
const {
|
|
64
|
-
contextId
|
|
59
|
+
contextId,
|
|
60
|
+
payload
|
|
65
61
|
} = evt;
|
|
66
62
|
if (contextId !== this.id || evt.jobId !== jobId) return;
|
|
67
63
|
callback({
|
|
68
64
|
contextId,
|
|
69
65
|
jobId: evt.jobId,
|
|
70
66
|
...lastTranscribePayload,
|
|
67
|
+
...payload,
|
|
71
68
|
isCapturing: false
|
|
72
69
|
});
|
|
73
|
-
(
|
|
74
|
-
|
|
70
|
+
transcribeListener.remove();
|
|
71
|
+
endListener.remove();
|
|
75
72
|
});
|
|
76
|
-
removeEnd = endListener.remove;
|
|
77
73
|
}
|
|
78
74
|
};
|
|
79
75
|
}
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeEventEmitter","DeviceEventEmitter","NativeModules","Platform","LINKING_ERROR","select","ios","default","RNWhisper","Proxy","get","Error","EventEmitter","OS","EVENT_ON_REALTIME_TRANSCRIBE","EVENT_ON_REALTIME_TRANSCRIBE_END","WhisperContext","constructor","id","transcribe","path","options","arguments","length","undefined","jobId","Math","floor","random","stop","abortTranscribe","promise","transcribeFile","transcribeRealtime","startRealtimeTranscribe","
|
|
1
|
+
{"version":3,"names":["NativeEventEmitter","DeviceEventEmitter","NativeModules","Platform","LINKING_ERROR","select","ios","default","RNWhisper","Proxy","get","Error","EventEmitter","OS","EVENT_ON_REALTIME_TRANSCRIBE","EVENT_ON_REALTIME_TRANSCRIBE_END","WhisperContext","constructor","id","transcribe","path","options","arguments","length","undefined","jobId","Math","floor","random","stop","abortTranscribe","promise","transcribeFile","transcribeRealtime","startRealtimeTranscribe","lastTranscribePayload","subscribe","callback","transcribeListener","addListener","evt","contextId","payload","endListener","isCapturing","remove","release","releaseContext","initWhisper","filePath","initContext","releaseAllWhisper","releaseAllContexts"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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"}
|
|
@@ -50,6 +50,7 @@ export type TranscribeRealtimeEvent = {
|
|
|
50
50
|
jobId: number;
|
|
51
51
|
/** Is capturing audio, when false, the event is the final result */
|
|
52
52
|
isCapturing: boolean;
|
|
53
|
+
isStoppedByAction?: boolean;
|
|
53
54
|
code: number;
|
|
54
55
|
processTime: number;
|
|
55
56
|
recordingTime: number;
|
|
@@ -62,6 +63,7 @@ export type TranscribeRealtimeNativeEvent = {
|
|
|
62
63
|
payload: {
|
|
63
64
|
/** Is capturing audio, when false, the event is the final result */
|
|
64
65
|
isCapturing: boolean;
|
|
66
|
+
isStoppedByAction?: boolean;
|
|
65
67
|
code: number;
|
|
66
68
|
processTime: number;
|
|
67
69
|
recordingTime: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAkCA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,qBAAqB;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG,iBAAiB,GAAG;IAC1D;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC,CAAC;CACJ,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE;QACP,oEAAoE;QACpE,WAAW,EAAE,OAAO,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,IAAI,CAAC,EAAE,gBAAgB,CAAC;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAA;AAED,cAAM,cAAc;IAClB,EAAE,EAAE,MAAM,CAAA;gBAEE,EAAE,EAAE,MAAM;IAItB,4BAA4B;IAC5B,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG;QACzD,0BAA0B;QAC1B,IAAI,EAAE,MAAM,IAAI,CAAC;QACjB,gCAAgC;QAChC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;KACpC;IAQD,yFAAyF;IACnF,kBAAkB,CAAC,OAAO,GAAE,yBAA8B,GAAG,OAAO,CAAC;QACzE,mCAAmC;QACnC,IAAI,EAAE,MAAM,IAAI,CAAC;QACjB,8CAA8C;QAC9C,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,KAAK,IAAI,CAAC;KACzE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.tsx
CHANGED
|
@@ -87,6 +87,7 @@ export type TranscribeRealtimeEvent = {
|
|
|
87
87
|
jobId: number,
|
|
88
88
|
/** Is capturing audio, when false, the event is the final result */
|
|
89
89
|
isCapturing: boolean,
|
|
90
|
+
isStoppedByAction?: boolean,
|
|
90
91
|
code: number,
|
|
91
92
|
processTime: number,
|
|
92
93
|
recordingTime: number,
|
|
@@ -100,6 +101,7 @@ export type TranscribeRealtimeNativeEvent = {
|
|
|
100
101
|
payload: {
|
|
101
102
|
/** Is capturing audio, when false, the event is the final result */
|
|
102
103
|
isCapturing: boolean,
|
|
104
|
+
isStoppedByAction?: boolean,
|
|
103
105
|
code: number,
|
|
104
106
|
processTime: number,
|
|
105
107
|
recordingTime: number,
|
|
@@ -138,8 +140,6 @@ class WhisperContext {
|
|
|
138
140
|
}> {
|
|
139
141
|
const jobId: number = Math.floor(Math.random() * 10000)
|
|
140
142
|
await RNWhisper.startRealtimeTranscribe(this.id, jobId, options)
|
|
141
|
-
let removeTranscribe: () => void
|
|
142
|
-
let removeEnd: () => void
|
|
143
143
|
let lastTranscribePayload: TranscribeRealtimeNativeEvent['payload']
|
|
144
144
|
return {
|
|
145
145
|
stop: () => RNWhisper.abortTranscribe(this.id, jobId),
|
|
@@ -151,21 +151,24 @@ class WhisperContext {
|
|
|
151
151
|
if (contextId !== this.id || evt.jobId !== jobId) return
|
|
152
152
|
lastTranscribePayload = payload
|
|
153
153
|
callback({ contextId, jobId: evt.jobId, ...payload })
|
|
154
|
-
if (!payload.isCapturing) removeTranscribe()
|
|
155
154
|
}
|
|
156
155
|
)
|
|
157
|
-
removeTranscribe = transcribeListener.remove
|
|
158
156
|
const endListener = EventEmitter.addListener(
|
|
159
157
|
EVENT_ON_REALTIME_TRANSCRIBE_END,
|
|
160
158
|
(evt: TranscribeRealtimeNativeEvent) => {
|
|
161
|
-
const { contextId } = evt
|
|
159
|
+
const { contextId, payload } = evt
|
|
162
160
|
if (contextId !== this.id || evt.jobId !== jobId) return
|
|
163
|
-
callback({
|
|
164
|
-
|
|
165
|
-
|
|
161
|
+
callback({
|
|
162
|
+
contextId,
|
|
163
|
+
jobId: evt.jobId,
|
|
164
|
+
...lastTranscribePayload,
|
|
165
|
+
...payload,
|
|
166
|
+
isCapturing: false
|
|
167
|
+
})
|
|
168
|
+
transcribeListener.remove()
|
|
169
|
+
endListener.remove()
|
|
166
170
|
}
|
|
167
171
|
)
|
|
168
|
-
removeEnd = endListener.remove
|
|
169
172
|
},
|
|
170
173
|
}
|
|
171
174
|
}
|