3
3
// Copyright (c) 2024 Xiaomi Corporation
4
4
#include < sstream>
5
5
6
- #include " napi.h" // NOLINT
6
+ #include " macros.h" // NOLINT
7
+ #include " napi.h" // NOLINT
7
8
#include " sherpa-onnx/c-api/c-api.h"
8
9
9
10
// defined in ./streaming-asr.cc
10
11
SherpaOnnxFeatureConfig GetFeatureConfig (Napi::Object obj);
11
12
12
13
static SherpaOnnxOfflineTransducerModelConfig GetOfflineTransducerModelConfig (
13
14
Napi::Object obj) {
14
- SherpaOnnxOfflineTransducerModelConfig config ;
15
- memset (&config , 0 , sizeof (config ));
15
+ SherpaOnnxOfflineTransducerModelConfig c ;
16
+ memset (&c , 0 , sizeof (c ));
16
17
17
18
if (!obj.Has (" transducer" ) || !obj.Get (" transducer" ).IsObject ()) {
18
- return config ;
19
+ return c ;
19
20
}
20
21
21
22
Napi::Object o = obj.Get (" transducer" ).As <Napi::Object>();
22
23
23
- if (o.Has (" encoder" ) && o.Get (" encoder" ).IsString ()) {
24
- Napi::String encoder = o.Get (" encoder" ).As <Napi::String>();
25
- std::string s = encoder.Utf8Value ();
26
- char *p = new char [s.size () + 1 ];
27
- std::copy (s.begin (), s.end (), p);
28
- p[s.size ()] = 0 ;
29
-
30
- config.encoder = p;
31
- }
32
-
33
- if (o.Has (" decoder" ) && o.Get (" decoder" ).IsString ()) {
34
- Napi::String decoder = o.Get (" decoder" ).As <Napi::String>();
35
- std::string s = decoder.Utf8Value ();
36
- char *p = new char [s.size () + 1 ];
37
- std::copy (s.begin (), s.end (), p);
38
- p[s.size ()] = 0 ;
39
-
40
- config.decoder = p;
41
- }
42
-
43
- if (o.Has (" joiner" ) && o.Get (" joiner" ).IsString ()) {
44
- Napi::String joiner = o.Get (" joiner" ).As <Napi::String>();
45
- std::string s = joiner.Utf8Value ();
46
- char *p = new char [s.size () + 1 ];
47
- std::copy (s.begin (), s.end (), p);
48
- p[s.size ()] = 0 ;
24
+ SHERPA_ONNX_ASSIGN_ATTR_STR (encoder, encoder);
25
+ SHERPA_ONNX_ASSIGN_ATTR_STR (decoder, decoder);
26
+ SHERPA_ONNX_ASSIGN_ATTR_STR (joiner, joiner);
49
27
50
- config.joiner = p;
51
- }
52
-
53
- return config;
28
+ return c;
54
29
}
55
30
56
31
static SherpaOnnxOfflineParaformerModelConfig GetOfflineParaformerModelConfig (
57
32
Napi::Object obj) {
58
- SherpaOnnxOfflineParaformerModelConfig config ;
59
- memset (&config , 0 , sizeof (config ));
33
+ SherpaOnnxOfflineParaformerModelConfig c ;
34
+ memset (&c , 0 , sizeof (c ));
60
35
61
36
if (!obj.Has (" paraformer" ) || !obj.Get (" paraformer" ).IsObject ()) {
62
- return config ;
37
+ return c ;
63
38
}
64
39
65
40
Napi::Object o = obj.Get (" paraformer" ).As <Napi::Object>();
66
41
67
- if (o.Has (" model" ) && o.Get (" model" ).IsString ()) {
68
- Napi::String model = o.Get (" model" ).As <Napi::String>();
69
- std::string s = model.Utf8Value ();
70
- char *p = new char [s.size () + 1 ];
71
- std::copy (s.begin (), s.end (), p);
72
- p[s.size ()] = 0 ;
73
-
74
- config.model = p;
75
- }
42
+ SHERPA_ONNX_ASSIGN_ATTR_STR (model, model);
76
43
77
- return config ;
44
+ return c ;
78
45
}
79
46
80
47
static SherpaOnnxOfflineNemoEncDecCtcModelConfig GetOfflineNeMoCtcModelConfig (
81
48
Napi::Object obj) {
82
- SherpaOnnxOfflineNemoEncDecCtcModelConfig config ;
83
- memset (&config , 0 , sizeof (config ));
49
+ SherpaOnnxOfflineNemoEncDecCtcModelConfig c ;
50
+ memset (&c , 0 , sizeof (c ));
84
51
85
52
if (!obj.Has (" nemoCtc" ) || !obj.Get (" nemoCtc" ).IsObject ()) {
86
- return config ;
53
+ return c ;
87
54
}
88
55
89
56
Napi::Object o = obj.Get (" nemoCtc" ).As <Napi::Object>();
90
57
91
- if (o.Has (" model" ) && o.Get (" model" ).IsString ()) {
92
- Napi::String model = o.Get (" model" ).As <Napi::String>();
93
- std::string s = model.Utf8Value ();
94
- char *p = new char [s.size () + 1 ];
95
- std::copy (s.begin (), s.end (), p);
96
- p[s.size ()] = 0 ;
97
-
98
- config.model = p;
99
- }
58
+ SHERPA_ONNX_ASSIGN_ATTR_STR (model, model);
100
59
101
- return config ;
60
+ return c ;
102
61
}
103
62
104
63
static SherpaOnnxOfflineWhisperModelConfig GetOfflineWhisperModelConfig (
105
64
Napi::Object obj) {
106
- SherpaOnnxOfflineWhisperModelConfig config ;
107
- memset (&config , 0 , sizeof (config ));
65
+ SherpaOnnxOfflineWhisperModelConfig c ;
66
+ memset (&c , 0 , sizeof (c ));
108
67
109
68
if (!obj.Has (" whisper" ) || !obj.Get (" whisper" ).IsObject ()) {
110
- return config ;
69
+ return c ;
111
70
}
112
71
113
72
Napi::Object o = obj.Get (" whisper" ).As <Napi::Object>();
114
73
115
- if (o.Has (" encoder" ) && o.Get (" encoder" ).IsString ()) {
116
- Napi::String encoder = o.Get (" encoder" ).As <Napi::String>();
117
- std::string s = encoder.Utf8Value ();
118
- char *p = new char [s.size () + 1 ];
119
- std::copy (s.begin (), s.end (), p);
120
- p[s.size ()] = 0 ;
121
-
122
- config.encoder = p;
123
- }
124
-
125
- if (o.Has (" decoder" ) && o.Get (" decoder" ).IsString ()) {
126
- Napi::String decoder = o.Get (" decoder" ).As <Napi::String>();
127
- std::string s = decoder.Utf8Value ();
128
- char *p = new char [s.size () + 1 ];
129
- std::copy (s.begin (), s.end (), p);
130
- p[s.size ()] = 0 ;
131
-
132
- config.decoder = p;
133
- }
134
-
135
- if (o.Has (" language" ) && o.Get (" language" ).IsString ()) {
136
- Napi::String language = o.Get (" language" ).As <Napi::String>();
137
- std::string s = language.Utf8Value ();
138
- char *p = new char [s.size () + 1 ];
139
- std::copy (s.begin (), s.end (), p);
140
- p[s.size ()] = 0 ;
141
-
142
- config.language = p;
143
- }
144
-
145
- if (o.Has (" task" ) && o.Get (" task" ).IsString ()) {
146
- Napi::String task = o.Get (" task" ).As <Napi::String>();
147
- std::string s = task.Utf8Value ();
148
- char *p = new char [s.size () + 1 ];
149
- std::copy (s.begin (), s.end (), p);
150
- p[s.size ()] = 0 ;
151
-
152
- config.task = p;
153
- }
74
+ SHERPA_ONNX_ASSIGN_ATTR_STR (encoder, encoder);
75
+ SHERPA_ONNX_ASSIGN_ATTR_STR (decoder, decoder);
76
+ SHERPA_ONNX_ASSIGN_ATTR_STR (language, language);
77
+ SHERPA_ONNX_ASSIGN_ATTR_STR (task, languagek);
154
78
155
- return config ;
79
+ return c ;
156
80
}
157
81
158
82
static SherpaOnnxOfflineTdnnModelConfig GetOfflineTdnnModelConfig (
159
83
Napi::Object obj) {
160
- SherpaOnnxOfflineTdnnModelConfig config ;
161
- memset (&config , 0 , sizeof (config ));
84
+ SherpaOnnxOfflineTdnnModelConfig c ;
85
+ memset (&c , 0 , sizeof (c ));
162
86
163
87
if (!obj.Has (" tdnn" ) || !obj.Get (" tdnn" ).IsObject ()) {
164
- return config ;
88
+ return c ;
165
89
}
166
90
167
91
Napi::Object o = obj.Get (" tdnn" ).As <Napi::Object>();
168
92
169
- if (o.Has (" model" ) && o.Get (" model" ).IsString ()) {
170
- Napi::String model = o.Get (" model" ).As <Napi::String>();
171
- std::string s = model.Utf8Value ();
172
- char *p = new char [s.size () + 1 ];
173
- std::copy (s.begin (), s.end (), p);
174
- p[s.size ()] = 0 ;
175
-
176
- config.model = p;
177
- }
93
+ SHERPA_ONNX_ASSIGN_ATTR_STR (model, model);
178
94
179
- return config ;
95
+ return c ;
180
96
}
181
97
182
98
static SherpaOnnxOfflineModelConfig GetOfflineModelConfig (Napi::Object obj) {
@@ -195,19 +111,8 @@ static SherpaOnnxOfflineModelConfig GetOfflineModelConfig(Napi::Object obj) {
195
111
c.whisper = GetOfflineWhisperModelConfig (o);
196
112
c.tdnn = GetOfflineTdnnModelConfig (o);
197
113
198
- if (o.Has (" tokens" ) && o.Get (" tokens" ).IsString ()) {
199
- Napi::String tokens = o.Get (" tokens" ).As <Napi::String>();
200
- std::string s = tokens.Utf8Value ();
201
- char *p = new char [s.size () + 1 ];
202
- std::copy (s.begin (), s.end (), p);
203
- p[s.size ()] = 0 ;
204
-
205
- c.tokens = p;
206
- }
207
-
208
- if (o.Has (" numThreads" ) && o.Get (" numThreads" ).IsNumber ()) {
209
- c.num_threads = o.Get (" numThreads" ).As <Napi::Number>().Int32Value ();
210
- }
114
+ SHERPA_ONNX_ASSIGN_ATTR_STR (tokens, tokens);
115
+ SHERPA_ONNX_ASSIGN_ATTR_INT32 (num_threads, numThreads);
211
116
212
117
if (o.Has (" debug" ) &&
213
118
(o.Get (" debug" ).IsNumber () || o.Get (" debug" ).IsBoolean ())) {
@@ -218,25 +123,8 @@ static SherpaOnnxOfflineModelConfig GetOfflineModelConfig(Napi::Object obj) {
218
123
}
219
124
}
220
125
221
- if (o.Has (" provider" ) && o.Get (" provider" ).IsString ()) {
222
- Napi::String provider = o.Get (" provider" ).As <Napi::String>();
223
- std::string s = provider.Utf8Value ();
224
- char *p = new char [s.size () + 1 ];
225
- std::copy (s.begin (), s.end (), p);
226
- p[s.size ()] = 0 ;
227
-
228
- c.provider = p;
229
- }
230
-
231
- if (o.Has (" modelType" ) && o.Get (" modelType" ).IsString ()) {
232
- Napi::String model_type = o.Get (" modelType" ).As <Napi::String>();
233
- std::string s = model_type.Utf8Value ();
234
- char *p = new char [s.size () + 1 ];
235
- std::copy (s.begin (), s.end (), p);
236
- p[s.size ()] = 0 ;
237
-
238
- c.model_type = p;
239
- }
126
+ SHERPA_ONNX_ASSIGN_ATTR_STR (provider, provider);
127
+ SHERPA_ONNX_ASSIGN_ATTR_STR (model_type, modelType);
240
128
241
129
return c;
242
130
}
@@ -251,19 +139,8 @@ static SherpaOnnxOfflineLMConfig GetOfflineLMConfig(Napi::Object obj) {
251
139
252
140
Napi::Object o = obj.Get (" lmConfig" ).As <Napi::Object>();
253
141
254
- if (o.Has (" model" ) && o.Get (" model" ).IsString ()) {
255
- Napi::String model = o.Get (" model" ).As <Napi::String>();
256
- std::string s = model.Utf8Value ();
257
- char *p = new char [s.size () + 1 ];
258
- std::copy (s.begin (), s.end (), p);
259
- p[s.size ()] = 0 ;
260
-
261
- c.model = p;
262
- }
263
-
264
- if (o.Has (" scale" ) && o.Get (" scale" ).IsNumber ()) {
265
- c.scale = o.Get (" scale" ).As <Napi::Number>().FloatValue ();
266
- }
142
+ SHERPA_ONNX_ASSIGN_ATTR_STR (model, model);
143
+ SHERPA_ONNX_ASSIGN_ATTR_FLOAT (scale, scale);
267
144
268
145
return c;
269
146
}
@@ -295,34 +172,10 @@ CreateOfflineRecognizerWrapper(const Napi::CallbackInfo &info) {
295
172
c.model_config = GetOfflineModelConfig (o);
296
173
c.lm_config = GetOfflineLMConfig (o);
297
174
298
- if (o.Has (" decodingMethod" ) && o.Get (" decodingMethod" ).IsString ()) {
299
- Napi::String decoding_method = o.Get (" decodingMethod" ).As <Napi::String>();
300
- std::string s = decoding_method.Utf8Value ();
301
- char *p = new char [s.size () + 1 ];
302
- std::copy (s.begin (), s.end (), p);
303
- p[s.size ()] = 0 ;
304
-
305
- c.decoding_method = p;
306
- }
307
-
308
- if (o.Has (" maxActivePaths" ) && o.Get (" maxActivePaths" ).IsNumber ()) {
309
- c.max_active_paths =
310
- o.Get (" maxActivePaths" ).As <Napi::Number>().Int32Value ();
311
- }
312
-
313
- if (o.Has (" hotwordsFile" ) && o.Get (" hotwordsFile" ).IsString ()) {
314
- Napi::String hotwords_file = o.Get (" hotwordsFile" ).As <Napi::String>();
315
- std::string s = hotwords_file.Utf8Value ();
316
- char *p = new char [s.size () + 1 ];
317
- std::copy (s.begin (), s.end (), p);
318
- p[s.size ()] = 0 ;
319
-
320
- c.hotwords_file = p;
321
- }
322
-
323
- if (o.Has (" hotwordsScore" ) && o.Get (" hotwordsScore" ).IsNumber ()) {
324
- c.hotwords_score = o.Get (" hotwordsScore" ).As <Napi::Number>().FloatValue ();
325
- }
175
+ SHERPA_ONNX_ASSIGN_ATTR_STR (decoding_method, decodingMethod);
176
+ SHERPA_ONNX_ASSIGN_ATTR_INT32 (max_active_paths, maxActivePaths);
177
+ SHERPA_ONNX_ASSIGN_ATTR_STR (hotwords_file, hotwordsFile);
178
+ SHERPA_ONNX_ASSIGN_ATTR_FLOAT (hotwords_score, hotwordsScore);
326
179
327
180
SherpaOnnxOfflineRecognizer *recognizer = CreateOfflineRecognizer (&c);
328
181
0 commit comments