Skip to content

Commit 1e4ac57

Browse files
authored
Fix building errors (#2893)
This pull request addresses and resolves building errors by refactoring the OfflineTtsZipVoiceModelConfig across various language bindings. The core change involves renaming the pinyinDict parameter to lexicon to standardize terminology and improve clarity in text-to-speech configurations. Additionally, the Python example script for offline zero-shot TTS has been updated to align with these changes, including new model paths and example content, ensuring the examples remain functional and up-to-date.
1 parent 1b59efd commit 1e4ac57

14 files changed

Lines changed: 52 additions & 59 deletions

File tree

flutter/sherpa_onnx/lib/src/sherpa_onnx_bindings.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ final class SherpaOnnxOfflineTtsZipVoiceModelConfig extends Struct {
220220
external Pointer<Utf8> flowMatchingModel;
221221
external Pointer<Utf8> vocoder;
222222
external Pointer<Utf8> dataDir;
223-
external Pointer<Utf8> pinyinDict;
223+
external Pointer<Utf8> lexicon;
224224

225225
@Float()
226226
external double featScale;

flutter/sherpa_onnx/lib/src/tts.dart

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ class OfflineTtsZipVoiceModelConfig {
199199
this.flowMatchingModel = '',
200200
this.vocoder = '',
201201
this.dataDir = '',
202-
this.pinyinDict = '',
202+
this.lexicon = '',
203203
this.featScale = 0.1,
204204
this.tShift = 0.5,
205205
this.targetRms = 0.1,
@@ -213,7 +213,7 @@ class OfflineTtsZipVoiceModelConfig {
213213
flowMatchingModel: json['flowMatchingModel'] as String? ?? '',
214214
vocoder: json['vocoder'] as String? ?? '',
215215
dataDir: json['dataDir'] as String? ?? '',
216-
pinyinDict: json['pinyinDict'] as String? ?? '',
216+
lexicon: json['lexicon'] as String? ?? '',
217217
featScale: (json['featScale'] as num?)?.toDouble() ?? 0.1,
218218
tShift: (json['tShift'] as num?)?.toDouble() ?? 0.5,
219219
targetRms: (json['targetRms'] as num?)?.toDouble() ?? 0.1,
@@ -223,7 +223,7 @@ class OfflineTtsZipVoiceModelConfig {
223223

224224
@override
225225
String toString() {
226-
return 'OfflineTtsZipVoiceModelConfig(tokens: $tokens, textModel: $textModel, flowMatchingModel: $flowMatchingModel, vocoder: $vocoder, dataDir: $dataDir, pinyinDict: $pinyinDict, featScale: $featScale, tShift: $tShift, targetRms: $targetRms, guidanceScale: $guidanceScale)';
226+
return 'OfflineTtsZipVoiceModelConfig(tokens: $tokens, textModel: $textModel, flowMatchingModel: $flowMatchingModel, vocoder: $vocoder, dataDir: $dataDir, lexicon: $lexicon, featScale: $featScale, tShift: $tShift, targetRms: $targetRms, guidanceScale: $guidanceScale)';
227227
}
228228

229229
Map<String, dynamic> toJson() => {
@@ -232,7 +232,7 @@ class OfflineTtsZipVoiceModelConfig {
232232
'flowMatchingModel': flowMatchingModel,
233233
'vocoder': vocoder,
234234
'dataDir': dataDir,
235-
'pinyinDict': pinyinDict,
235+
'lexicon': lexicon,
236236
'featScale': featScale,
237237
'tShift': tShift,
238238
'targetRms': targetRms,
@@ -244,7 +244,7 @@ class OfflineTtsZipVoiceModelConfig {
244244
final String flowMatchingModel;
245245
final String vocoder;
246246
final String dataDir;
247-
final String pinyinDict;
247+
final String lexicon;
248248
final double featScale;
249249
final double tShift;
250250
final double targetRms;
@@ -406,7 +406,7 @@ class OfflineTts {
406406
c.ref.model.zipvoice.flowMatchingModel = config.model.zipvoice.flowMatchingModel.toNativeUtf8();
407407
c.ref.model.zipvoice.vocoder = config.model.zipvoice.vocoder.toNativeUtf8();
408408
c.ref.model.zipvoice.dataDir = config.model.zipvoice.dataDir.toNativeUtf8();
409-
c.ref.model.zipvoice.pinyinDict = config.model.zipvoice.pinyinDict.toNativeUtf8();
409+
c.ref.model.zipvoice.lexicon = config.model.zipvoice.lexicon.toNativeUtf8();
410410
c.ref.model.zipvoice.featScale = config.model.zipvoice.featScale;
411411
c.ref.model.zipvoice.tShift = config.model.zipvoice.tShift;
412412
c.ref.model.zipvoice.targetRms = config.model.zipvoice.targetRms;
@@ -427,7 +427,7 @@ class OfflineTts {
427427
calloc.free(c.ref.ruleFsts);
428428
calloc.free(c.ref.model.provider);
429429

430-
calloc.free(c.ref.model.zipvoice.pinyinDict);
430+
calloc.free(c.ref.model.zipvoice.lexicon);
431431
calloc.free(c.ref.model.zipvoice.dataDir);
432432
calloc.free(c.ref.model.zipvoice.vocoder);
433433
calloc.free(c.ref.model.zipvoice.flowMatchingModel);

python-api-examples/offline-zeroshot-tts.py

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,23 @@
1010
1111
Example (zipvoice)
1212
13-
wget https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/sherpa-onnx-zipvoice-distill-zh-en-emilia.tar.bz2
14-
tar xf sherpa-onnx-zipvoice-distill-zh-en-emilia.tar.bz2
13+
wget https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/sherpa-onnx-zipvoice-distill-int8-zh-en-emilia.tar.bz2
14+
tar xf sherpa-onnx-zipvoice-distill-int8-zh-en-emilia.tar.bz2
15+
16+
wget https://github.com/k2-fsa/sherpa-onnx/releases/download/vocoder-models/vocos_24khz.onnx
1517
1618
python3 ./python-api-examples/offline-zeroshot-tts.py \
17-
--zipvoice-flow-matching-model sherpa-onnx-zipvoice-distill-zh-en-emilia/fm_decoder.onnx \
18-
--zipvoice-text-model sherpa-onnx-zipvoice-distill-zh-en-emilia/text_encoder.onnx \
19-
--zipvoice-data-dir sherpa-onnx-zipvoice-distill-zh-en-emilia/espeak-ng-data \
20-
--zipvoice-pinyin-dict sherpa-onnx-zipvoice-distill-zh-en-emilia/pinyin.raw \
21-
--zipvoice-tokens sherpa-onnx-zipvoice-distill-zh-en-emilia/tokens.txt \
22-
--zipvoice-vocoder sherpa-onnx-zipvoice-distill-zh-en-emilia/vocos_24khz.onnx \
23-
--prompt-audio sherpa-onnx-zipvoice-distill-zh-en-emilia/prompt.wav \
19+
--zipvoice-flow-matching-model sherpa-onnx-zipvoice-distill-int8-zh-en-emilia/decoder.int8.onnx \
20+
--zipvoice-text-model sherpa-onnx-zipvoice-distill-int8-zh-en-emilia/encoder.int8.onnx \
21+
--zipvoice-data-dir sherpa-onnx-zipvoice-distill-int8-zh-en-emilia/espeak-ng-data \
22+
--zipvoice-lexicon sherpa-onnx-zipvoice-distill-int8-zh-en-emilia/lexicon.txt \
23+
--zipvoice-tokens sherpa-onnx-zipvoice-distill-int8-zh-en-emilia/tokens.txt \
24+
--zipvoice-vocoder vocos_24khz.onnx \
25+
--prompt-audio sherpa-onnx-zipvoice-distill-int8-zh-en-emilia/test_wavs/leijun-1.wav \
2426
--zipvoice-num-steps 4 \
2527
--num-threads 4 \
26-
--prompt-text "周日被我射熄火了,所以今天是周一。" \
27-
"我是中国人民的儿子,我爱我的祖国。我得祖国是一个伟大的国家,拥有五千年的文明史。"
28+
--prompt-text "那还是三十六年前, 一九八七年. 我呢考上了武汉大学的计算机系." \
29+
"小米的价值观是真诚, 热爱. 真诚,就是不欺人也不自欺. 热爱, 就是全心投入并享受其中."
2830
"""
2931

3032
import argparse
@@ -68,10 +70,10 @@ def add_zipvoice_args(parser):
6870
)
6971

7072
parser.add_argument(
71-
"--zipvoice-pinyin-dict",
73+
"--zipvoice-lexicon",
7274
type=str,
7375
default="",
74-
help="Path to the pinyin dictionary.",
76+
help="Path to the lexicon.txt",
7577
)
7678

7779
parser.add_argument(
@@ -236,7 +238,7 @@ def main():
236238
text_model=args.zipvoice_text_model,
237239
flow_matching_model=args.zipvoice_flow_matching_model,
238240
data_dir=args.zipvoice_data_dir,
239-
pinyin_dict=args.zipvoice_pinyin_dict,
241+
lexicon=args.zipvoice_lexicon,
240242
vocoder=args.zipvoice_vocoder,
241243
feat_scale=args.zipvoice_feat_scale,
242244
t_shift=args.zipvoice_t_shift,
@@ -268,9 +270,7 @@ def main():
268270
end = time.time()
269271

270272
if len(audio.samples) == 0:
271-
print(
272-
"Error in generating audios. Please read previous error messages."
273-
)
273+
print("Error in generating audios. Please read previous error messages.")
274274
return
275275

276276
elapsed_seconds = end - start
@@ -287,9 +287,7 @@ def main():
287287
print(f"The text is '{args.text}'")
288288
print(f"Elapsed seconds: {elapsed_seconds:.3f}")
289289
print(f"Audio duration in seconds: {audio_duration:.3f}")
290-
print(
291-
f"RTF: {elapsed_seconds:.3f}/{audio_duration:.3f} = {real_time_factor:.3f}"
292-
)
290+
print(f"RTF: {elapsed_seconds:.3f}/{audio_duration:.3f} = {real_time_factor:.3f}")
293291

294292

295293
if __name__ == "__main__":

scripts/go/sherpa_onnx.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,7 @@ type OfflineModelConfig struct {
484484
ZipformerCtc OfflineZipformerCtcModelConfig
485485
Canary OfflineCanaryModelConfig
486486
WenetCtc OfflineWenetCtcModelConfig
487-
Omnilingual OfflineOmnilingualAsrCtcModelConfig
487+
Omnilingual OfflineOmnilingualAsrCtcModelConfig
488488
Tokens string // Path to tokens.txt
489489

490490
// Number of threads to use for neural network computation
@@ -964,7 +964,7 @@ type OfflineTtsZipvoiceModelConfig struct {
964964
TextModel string // Path to text encoder (e.g. text_encoder.onnx)
965965
FlowMatchingModel string // Path to flow-matching decoder (e.g. fm_decoder.onnx)
966966
DataDir string // Path to espeak-ng-data
967-
PinyinDict string // Path to pinyin.raw (needed for zh)
967+
Lexicon string // Path to lexicon.txt (needed for zh)
968968
Vocoder string // Path to vocoder (e.g. vocos_24khz.onnx)
969969

970970
FeatScale float32 // Feature scale
@@ -1148,8 +1148,8 @@ func NewOfflineTts(config *OfflineTtsConfig) *OfflineTts {
11481148
c.model.zipvoice.data_dir = C.CString(config.Model.Zipvoice.DataDir)
11491149
defer C.free(unsafe.Pointer(c.model.zipvoice.data_dir))
11501150

1151-
c.model.zipvoice.pinyin_dict = C.CString(config.Model.Zipvoice.PinyinDict)
1152-
defer C.free(unsafe.Pointer(c.model.zipvoice.pinyin_dict))
1151+
c.model.zipvoice.lexicon = C.CString(config.Model.Zipvoice.Lexicon)
1152+
defer C.free(unsafe.Pointer(c.model.zipvoice.lexicon))
11531153

11541154
c.model.zipvoice.feat_scale = C.float(config.Model.Zipvoice.FeatScale)
11551155
c.model.zipvoice.t_shift = C.float(config.Model.Zipvoice.TShift)

sherpa-onnx/c-api/c-api.cc

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -703,9 +703,11 @@ const SherpaOnnxOfflineRecognizerResult *SherpaOnnxGetOfflineStreamResult(
703703
r->durations = nullptr;
704704
}
705705

706-
if (!result.ys_log_probs.empty() && result.ys_log_probs.size() == r->count) {
706+
if (!result.ys_log_probs.empty() &&
707+
result.ys_log_probs.size() == r->count) {
707708
r->ys_log_probs = new float[r->count];
708-
std::copy(result.ys_log_probs.begin(), result.ys_log_probs.end(), r->ys_log_probs);
709+
std::copy(result.ys_log_probs.begin(), result.ys_log_probs.end(),
710+
r->ys_log_probs);
709711
} else {
710712
r->ys_log_probs = nullptr;
711713
}
@@ -1248,8 +1250,8 @@ static sherpa_onnx::OfflineTtsConfig GetOfflineTtsConfig(
12481250
SHERPA_ONNX_OR(config->model.zipvoice.vocoder, "");
12491251
tts_config.model.zipvoice.data_dir =
12501252
SHERPA_ONNX_OR(config->model.zipvoice.data_dir, "");
1251-
tts_config.model.zipvoice.pinyin_dict =
1252-
SHERPA_ONNX_OR(config->model.zipvoice.pinyin_dict, "");
1253+
tts_config.model.zipvoice.lexicon =
1254+
SHERPA_ONNX_OR(config->model.zipvoice.lexicon, "");
12531255
tts_config.model.zipvoice.feat_scale =
12541256
SHERPA_ONNX_OR(config->model.zipvoice.feat_scale, 0.1f);
12551257
tts_config.model.zipvoice.t_shift =

sherpa-onnx/c-api/c-api.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1072,7 +1072,7 @@ SHERPA_ONNX_API typedef struct SherpaOnnxOfflineTtsZipvoiceModelConfig {
10721072
const char *flow_matching_model;
10731073
const char *vocoder;
10741074
const char *data_dir;
1075-
const char *pinyin_dict;
1075+
const char *lexicon;
10761076
float feat_scale;
10771077
float t_shift;
10781078
float target_rms;

sherpa-onnx/c-api/cxx-api.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,7 @@ OfflineTts OfflineTts::Create(const OfflineTtsConfig &config) {
419419
config.model.zipvoice.flow_matching_model.c_str();
420420
c.model.zipvoice.vocoder = config.model.zipvoice.vocoder.c_str();
421421
c.model.zipvoice.data_dir = config.model.zipvoice.data_dir.c_str();
422-
c.model.zipvoice.pinyin_dict = config.model.zipvoice.pinyin_dict.c_str();
422+
c.model.zipvoice.lexicon = config.model.zipvoice.lexicon.c_str();
423423
c.model.zipvoice.feat_scale = config.model.zipvoice.feat_scale;
424424
c.model.zipvoice.t_shift = config.model.zipvoice.t_shift;
425425
c.model.zipvoice.target_rms = config.model.zipvoice.target_rms;

sherpa-onnx/c-api/cxx-api.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -432,7 +432,7 @@ struct OfflineTtsZipvoiceModelConfig {
432432
std::string flow_matching_model;
433433
std::string vocoder;
434434
std::string data_dir;
435-
std::string pinyin_dict;
435+
std::string lexicon;
436436

437437
float feat_scale = 0.1;
438438
float t_shift = 0.5;

sherpa-onnx/csrc/offline-tts-zipvoice-model-config.cc

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,6 @@ void OfflineTtsZipvoiceModelConfig::Register(ParseOptions *po) {
1818
po->Register("zipvoice-data-dir", &data_dir,
1919
"Path to the directory containing dict for espeak-ng.");
2020
po->Register("zipvoice-lexicon", &lexicon, "Path to lexicon.txt for Chinese");
21-
po->Register("zipvoice-pinyin-dict", &pinyin_dict,
22-
"Path to the pinyin dictionary for cppinyin (i.e converting "
23-
"Chinese into phones).");
2421
po->Register("zipvoice-text-model", &text_model,
2522
"Path to zipvoice text model");
2623
po->Register("zipvoice-flow-matching-model", &flow_matching_model,

sherpa-onnx/csrc/offline-tts-zipvoice-model-config.h

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@ struct OfflineTtsZipvoiceModelConfig {
2121
std::string data_dir;
2222
std::string lexicon;
2323

24-
// Used for converting Chinese characters to pinyin
25-
std::string pinyin_dict;
26-
2724
float feat_scale = 0.1;
2825
float t_shift = 0.5;
2926
float target_rms = 0.1;
@@ -35,15 +32,14 @@ struct OfflineTtsZipvoiceModelConfig {
3532
const std::string &tokens, const std::string &text_model,
3633
const std::string &flow_matching_model, const std::string &vocoder,
3734
const std::string &data_dir, const std::string &lexicon,
38-
const std::string &pinyin_dict, float feat_scale = 0.1,
39-
float t_shift = 0.5, float target_rms = 0.1, float guidance_scale = 1.0)
35+
float feat_scale = 0.1, float t_shift = 0.5, float target_rms = 0.1,
36+
float guidance_scale = 1.0)
4037
: tokens(tokens),
4138
text_model(text_model),
4239
flow_matching_model(flow_matching_model),
4340
vocoder(vocoder),
4441
data_dir(data_dir),
4542
lexicon(lexicon),
46-
pinyin_dict(pinyin_dict),
4743
feat_scale(feat_scale),
4844
t_shift(t_shift),
4945
target_rms(target_rms),

0 commit comments

Comments
 (0)