@@ -36,14 +36,14 @@ class OfflineTtsVitsModelConfig {
3636 }
3737
3838 Map <String , dynamic > toJson () => {
39- 'model' : model,
40- 'lexicon' : lexicon,
41- 'tokens' : tokens,
42- 'dataDir' : dataDir,
43- 'noiseScale' : noiseScale,
44- 'noiseScaleW' : noiseScaleW,
45- 'lengthScale' : lengthScale,
46- };
39+ 'model' : model,
40+ 'lexicon' : lexicon,
41+ 'tokens' : tokens,
42+ 'dataDir' : dataDir,
43+ 'noiseScale' : noiseScale,
44+ 'noiseScaleW' : noiseScaleW,
45+ 'lengthScale' : lengthScale,
46+ };
4747
4848 final String model;
4949 final String lexicon;
@@ -85,14 +85,14 @@ class OfflineTtsMatchaModelConfig {
8585 }
8686
8787 Map <String , dynamic > toJson () => {
88- 'acousticModel' : acousticModel,
89- 'vocoder' : vocoder,
90- 'lexicon' : lexicon,
91- 'tokens' : tokens,
92- 'dataDir' : dataDir,
93- 'noiseScale' : noiseScale,
94- 'lengthScale' : lengthScale,
95- };
88+ 'acousticModel' : acousticModel,
89+ 'vocoder' : vocoder,
90+ 'lexicon' : lexicon,
91+ 'tokens' : tokens,
92+ 'dataDir' : dataDir,
93+ 'noiseScale' : noiseScale,
94+ 'lengthScale' : lengthScale,
95+ };
9696
9797 final String acousticModel;
9898 final String vocoder;
@@ -134,14 +134,14 @@ class OfflineTtsKokoroModelConfig {
134134 }
135135
136136 Map <String , dynamic > toJson () => {
137- 'model' : model,
138- 'voices' : voices,
139- 'tokens' : tokens,
140- 'dataDir' : dataDir,
141- 'lengthScale' : lengthScale,
142- 'lexicon' : lexicon,
143- 'lang' : lang,
144- };
137+ 'model' : model,
138+ 'voices' : voices,
139+ 'tokens' : tokens,
140+ 'dataDir' : dataDir,
141+ 'lengthScale' : lengthScale,
142+ 'lexicon' : lexicon,
143+ 'lang' : lang,
144+ };
145145
146146 final String model;
147147 final String voices;
@@ -178,12 +178,12 @@ class OfflineTtsKittenModelConfig {
178178 }
179179
180180 Map <String , dynamic > toJson () => {
181- 'model' : model,
182- 'voices' : voices,
183- 'tokens' : tokens,
184- 'dataDir' : dataDir,
185- 'lengthScale' : lengthScale,
186- };
181+ 'model' : model,
182+ 'voices' : voices,
183+ 'tokens' : tokens,
184+ 'dataDir' : dataDir,
185+ 'lengthScale' : lengthScale,
186+ };
187187
188188 final String model;
189189 final String voices;
@@ -195,8 +195,8 @@ class OfflineTtsKittenModelConfig {
195195class OfflineTtsZipVoiceModelConfig {
196196 const OfflineTtsZipVoiceModelConfig ({
197197 this .tokens = '' ,
198- this .textModel = '' ,
199- this .flowMatchingModel = '' ,
198+ this .encoder = '' ,
199+ this .decoder = '' ,
200200 this .vocoder = '' ,
201201 this .dataDir = '' ,
202202 this .lexicon = '' ,
@@ -209,8 +209,8 @@ class OfflineTtsZipVoiceModelConfig {
209209 factory OfflineTtsZipVoiceModelConfig .fromJson (Map <String , dynamic > json) {
210210 return OfflineTtsZipVoiceModelConfig (
211211 tokens: json['tokens' ] as String ? ?? '' ,
212- textModel : json['textModel ' ] as String ? ?? '' ,
213- flowMatchingModel : json['flowMatchingModel ' ] as String ? ?? '' ,
212+ encoder : json['encoder ' ] as String ? ?? '' ,
213+ decoder : json['decoder ' ] as String ? ?? '' ,
214214 vocoder: json['vocoder' ] as String ? ?? '' ,
215215 dataDir: json['dataDir' ] as String ? ?? '' ,
216216 lexicon: json['lexicon' ] as String ? ?? '' ,
@@ -223,25 +223,25 @@ class OfflineTtsZipVoiceModelConfig {
223223
224224 @override
225225 String toString () {
226- return 'OfflineTtsZipVoiceModelConfig(tokens: $tokens , textModel : $textModel , flowMatchingModel : $flowMatchingModel , vocoder: $vocoder , dataDir: $dataDir , lexicon: $lexicon , featScale: $featScale , tShift: $tShift , targetRms: $targetRms , guidanceScale: $guidanceScale )' ;
226+ return 'OfflineTtsZipVoiceModelConfig(tokens: $tokens , encoder : $encoder , decoder : $decoder , vocoder: $vocoder , dataDir: $dataDir , lexicon: $lexicon , featScale: $featScale , tShift: $tShift , targetRms: $targetRms , guidanceScale: $guidanceScale )' ;
227227 }
228228
229229 Map <String , dynamic > toJson () => {
230- 'tokens' : tokens,
231- 'textModel ': textModel ,
232- 'flowMatchingModel ': flowMatchingModel ,
233- 'vocoder' : vocoder,
234- 'dataDir' : dataDir,
235- 'lexicon' : lexicon,
236- 'featScale' : featScale,
237- 'tShift' : tShift,
238- 'targetRms' : targetRms,
239- 'guidanceScale' : guidanceScale,
240- };
230+ 'tokens' : tokens,
231+ 'encoder ': encoder ,
232+ 'decoder ': decoder ,
233+ 'vocoder' : vocoder,
234+ 'dataDir' : dataDir,
235+ 'lexicon' : lexicon,
236+ 'featScale' : featScale,
237+ 'tShift' : tShift,
238+ 'targetRms' : targetRms,
239+ 'guidanceScale' : guidanceScale,
240+ };
241241
242242 final String tokens;
243- final String textModel ;
244- final String flowMatchingModel ;
243+ final String encoder ;
244+ final String decoder ;
245245 final String vocoder;
246246 final String dataDir;
247247 final String lexicon;
@@ -266,15 +266,20 @@ class OfflineTtsModelConfig {
266266 factory OfflineTtsModelConfig .fromJson (Map <String , dynamic > json) {
267267 return OfflineTtsModelConfig (
268268 vits: OfflineTtsVitsModelConfig .fromJson (
269- json['vits' ] as Map <String , dynamic >? ?? const {}),
269+ json['vits' ] as Map <String , dynamic >? ?? const {},
270+ ),
270271 matcha: OfflineTtsMatchaModelConfig .fromJson (
271- json['matcha' ] as Map <String , dynamic >? ?? const {}),
272+ json['matcha' ] as Map <String , dynamic >? ?? const {},
273+ ),
272274 kokoro: OfflineTtsKokoroModelConfig .fromJson (
273- json['kokoro' ] as Map <String , dynamic >? ?? const {}),
275+ json['kokoro' ] as Map <String , dynamic >? ?? const {},
276+ ),
274277 kitten: OfflineTtsKittenModelConfig .fromJson (
275- json['kitten' ] as Map <String , dynamic >? ?? const {}),
278+ json['kitten' ] as Map <String , dynamic >? ?? const {},
279+ ),
276280 zipvoice: OfflineTtsZipVoiceModelConfig .fromJson (
277- json['zipvoice' ] as Map <String , dynamic >? ?? const {}),
281+ json['zipvoice' ] as Map <String , dynamic >? ?? const {},
282+ ),
278283 numThreads: json['numThreads' ] as int ? ?? 1 ,
279284 debug: json['debug' ] as bool ? ?? true ,
280285 provider: json['provider' ] as String ? ?? 'cpu' ,
@@ -287,15 +292,15 @@ class OfflineTtsModelConfig {
287292 }
288293
289294 Map <String , dynamic > toJson () => {
290- 'vits' : vits.toJson (),
291- 'matcha' : matcha.toJson (),
292- 'kokoro' : kokoro.toJson (),
293- 'kitten' : kitten.toJson (),
294- 'zipvoice' : zipvoice.toJson (),
295- 'numThreads' : numThreads,
296- 'debug' : debug,
297- 'provider' : provider,
298- };
295+ 'vits' : vits.toJson (),
296+ 'matcha' : matcha.toJson (),
297+ 'kokoro' : kokoro.toJson (),
298+ 'kitten' : kitten.toJson (),
299+ 'zipvoice' : zipvoice.toJson (),
300+ 'numThreads' : numThreads,
301+ 'debug' : debug,
302+ 'provider' : provider,
303+ };
299304
300305 final OfflineTtsVitsModelConfig vits;
301306 final OfflineTtsMatchaModelConfig matcha;
@@ -318,8 +323,9 @@ class OfflineTtsConfig {
318323
319324 factory OfflineTtsConfig .fromJson (Map <String , dynamic > json) {
320325 return OfflineTtsConfig (
321- model:
322- OfflineTtsModelConfig .fromJson (json['model' ] as Map <String , dynamic >),
326+ model: OfflineTtsModelConfig .fromJson (
327+ json['model' ] as Map <String , dynamic >,
328+ ),
323329 ruleFsts: json['ruleFsts' ] as String ? ?? '' ,
324330 maxNumSenetences: json['maxNumSenetences' ] as int ? ?? 1 ,
325331 ruleFars: json['ruleFars' ] as String ? ?? '' ,
@@ -333,12 +339,12 @@ class OfflineTtsConfig {
333339 }
334340
335341 Map <String , dynamic > toJson () => {
336- 'model' : model.toJson (),
337- 'ruleFsts' : ruleFsts,
338- 'maxNumSenetences' : maxNumSenetences,
339- 'ruleFars' : ruleFars,
340- 'silenceScale' : silenceScale,
341- };
342+ 'model' : model.toJson (),
343+ 'ruleFsts' : ruleFsts,
344+ 'maxNumSenetences' : maxNumSenetences,
345+ 'ruleFars' : ruleFars,
346+ 'silenceScale' : silenceScale,
347+ };
342348
343349 final OfflineTtsModelConfig model;
344350 final String ruleFsts;
@@ -348,10 +354,7 @@ class OfflineTtsConfig {
348354}
349355
350356class GeneratedAudio {
351- GeneratedAudio ({
352- required this .samples,
353- required this .sampleRate,
354- });
357+ GeneratedAudio ({required this .samples, required this .sampleRate});
355358
356359 final Float32List samples;
357360 final int sampleRate;
@@ -378,8 +381,8 @@ class OfflineTts {
378381 c.ref.model.vits.noiseScaleW = config.model.vits.noiseScaleW;
379382 c.ref.model.vits.lengthScale = config.model.vits.lengthScale;
380383
381- c.ref.model.matcha.acousticModel =
382- config.model.matcha.acousticModel .toNativeUtf8 ();
384+ c.ref.model.matcha.acousticModel = config.model.matcha.acousticModel
385+ .toNativeUtf8 ();
383386 c.ref.model.matcha.vocoder = config.model.matcha.vocoder.toNativeUtf8 ();
384387 c.ref.model.matcha.lexicon = config.model.matcha.lexicon.toNativeUtf8 ();
385388 c.ref.model.matcha.tokens = config.model.matcha.tokens.toNativeUtf8 ();
@@ -402,8 +405,8 @@ class OfflineTts {
402405 c.ref.model.kitten.lengthScale = config.model.kitten.lengthScale;
403406
404407 c.ref.model.zipvoice.tokens = config.model.zipvoice.tokens.toNativeUtf8 ();
405- c.ref.model.zipvoice.textModel = config.model.zipvoice.textModel .toNativeUtf8 ();
406- c.ref.model.zipvoice.flowMatchingModel = config.model.zipvoice.flowMatchingModel .toNativeUtf8 ();
408+ c.ref.model.zipvoice.encoder = config.model.zipvoice.encoder .toNativeUtf8 ();
409+ c.ref.model.zipvoice.decoder = config.model.zipvoice.decoder .toNativeUtf8 ();
407410 c.ref.model.zipvoice.vocoder = config.model.zipvoice.vocoder.toNativeUtf8 ();
408411 c.ref.model.zipvoice.dataDir = config.model.zipvoice.dataDir.toNativeUtf8 ();
409412 c.ref.model.zipvoice.lexicon = config.model.zipvoice.lexicon.toNativeUtf8 ();
@@ -430,8 +433,8 @@ class OfflineTts {
430433 calloc.free (c.ref.model.zipvoice.lexicon);
431434 calloc.free (c.ref.model.zipvoice.dataDir);
432435 calloc.free (c.ref.model.zipvoice.vocoder);
433- calloc.free (c.ref.model.zipvoice.flowMatchingModel );
434- calloc.free (c.ref.model.zipvoice.textModel );
436+ calloc.free (c.ref.model.zipvoice.decoder );
437+ calloc.free (c.ref.model.zipvoice.encoder );
435438 calloc.free (c.ref.model.zipvoice.tokens);
436439
437440 calloc.free (c.ref.model.kitten.dataDir);
@@ -470,12 +473,15 @@ class OfflineTts {
470473 ptr = nullptr;
471474 }
472475
473- GeneratedAudio generate (
474- {required String text, int sid = 0 , double speed = 1.0 }) {
476+ GeneratedAudio generate ({
477+ required String text,
478+ int sid = 0 ,
479+ double speed = 1.0 ,
480+ }) {
475481 final Pointer <Utf8 > textPtr = text.toNativeUtf8 ();
476482 final p =
477483 SherpaOnnxBindings .offlineTtsGenerate? .call (ptr, textPtr, sid, speed) ??
478- nullptr;
484+ nullptr;
479485 calloc.free (textPtr);
480486
481487 if (p == nullptr) {
@@ -491,26 +497,35 @@ class OfflineTts {
491497 return GeneratedAudio (samples: newSamples, sampleRate: sampleRate);
492498 }
493499
494- GeneratedAudio generateWithCallback (
495- {required String text,
496- int sid = 0 ,
497- double speed = 1.0 ,
498- required int Function (Float32List samples) callback}) {
500+ GeneratedAudio generateWithCallback ({
501+ required String text,
502+ int sid = 0 ,
503+ double speed = 1.0 ,
504+ required int Function (Float32List samples) callback,
505+ }) {
499506 // see
500507 // https://github.com/dart-lang/sdk/issues/54276#issuecomment-1846109285
501508 // https://stackoverflow.com/questions/69537440/callbacks-in-dart-dartffi-only-supports-calling-static-dart-functions-from-nat
502509 // https://github.com/dart-lang/sdk/blob/main/tests/ffi/isolate_local_function_callbacks_test.dart#L46
503510 final wrapper =
504- NativeCallable <SherpaOnnxGeneratedAudioCallbackNative >.isolateLocal (
505- (Pointer <Float > samples, int n) {
506- final s = samples.asTypedList (n);
507- final newSamples = Float32List .fromList (s);
508- return callback (newSamples);
509- }, exceptionalReturn: 0 );
511+ NativeCallable <SherpaOnnxGeneratedAudioCallbackNative >.isolateLocal ((
512+ Pointer <Float > samples,
513+ int n,
514+ ) {
515+ final s = samples.asTypedList (n);
516+ final newSamples = Float32List .fromList (s);
517+ return callback (newSamples);
518+ }, exceptionalReturn: 0 );
510519
511520 final Pointer <Utf8 > textPtr = text.toNativeUtf8 ();
512- final p = SherpaOnnxBindings .offlineTtsGenerateWithCallback
513- ? .call (ptr, textPtr, sid, speed, wrapper.nativeFunction) ??
521+ final p =
522+ SherpaOnnxBindings .offlineTtsGenerateWithCallback? .call (
523+ ptr,
524+ textPtr,
525+ sid,
526+ speed,
527+ wrapper.nativeFunction,
528+ ) ??
514529 nullptr;
515530
516531 calloc.free (textPtr);
0 commit comments