Skip to content

Commit a6a36e8

Browse files
authored
Use a shorter name for Zipvoice models. (#2894)
1 parent 1e4ac57 commit a6a36e8

22 files changed

Lines changed: 256 additions & 239 deletions

flutter/sherpa_onnx/lib/src/sherpa_onnx_bindings.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,8 @@ final class SherpaOnnxOfflineTtsKittenModelConfig extends Struct {
216216

217217
final class SherpaOnnxOfflineTtsZipVoiceModelConfig extends Struct {
218218
external Pointer<Utf8> tokens;
219-
external Pointer<Utf8> textModel;
220-
external Pointer<Utf8> flowMatchingModel;
219+
external Pointer<Utf8> encoder;
220+
external Pointer<Utf8> decoder;
221221
external Pointer<Utf8> vocoder;
222222
external Pointer<Utf8> dataDir;
223223
external Pointer<Utf8> lexicon;

flutter/sherpa_onnx/lib/src/tts.dart

Lines changed: 111 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -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 {
195195
class 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

350356
class 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);

go-api-examples/non-streaming-tts/main.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,10 @@ func main() {
5050
flag.Float32Var(&config.Model.Kitten.LengthScale, "kitten-length-scale", 1.0, "length_scale for kitten. small -> faster; large -> slower")
5151

5252
flag.StringVar(&config.Model.Zipvoice.Tokens, "zipvoice-tokens", "", "Path to tokens.txt for ZipVoice")
53-
flag.StringVar(&config.Model.Zipvoice.TextModel, "zipvoice-text-model", "", "Path to ZipVoice text encoder model")
54-
flag.StringVar(&config.Model.Zipvoice.FlowMatchingModel, "zipvoice-flow-matching-model", "", "Path to ZipVoice flow-matching decoder")
53+
flag.StringVar(&config.Model.Zipvoice.Encoder, "zipvoice-encoder", "", "Path to ZipVoice text encoder model")
54+
flag.StringVar(&config.Model.Zipvoice.Decoder, "zipvoice-decoder", "", "Path to ZipVoice flow-matching decoder")
5555
flag.StringVar(&config.Model.Zipvoice.DataDir, "zipvoice-data-dir", "", "Path to espeak-ng-data")
56-
flag.StringVar(&config.Model.Zipvoice.PinyinDict, "zipvoice-pinyin-dict", "", "Path to pinyin.raw (for zh)")
56+
flag.StringVar(&config.Model.Zipvoice.Lexicon, "zipvoice-lexicon", "", "Path to lexicon.txt (for zh)")
5757
flag.StringVar(&config.Model.Zipvoice.Vocoder, "zipvoice-vocoder", "", "Path to vocoder (e.g., vocos_24khz.onnx)")
5858

5959
flag.Float32Var(&config.Model.Zipvoice.FeatScale, "zipvoice-feat-scale", 0.1, "Feature scale for ZipVoice")

0 commit comments

Comments
 (0)