Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion flutter/sherpa_onnx/lib/src/sherpa_onnx_bindings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ final class SherpaOnnxOfflineTtsZipVoiceModelConfig extends Struct {
external Pointer<Utf8> flowMatchingModel;
external Pointer<Utf8> vocoder;
external Pointer<Utf8> dataDir;
external Pointer<Utf8> pinyinDict;
external Pointer<Utf8> lexicon;

@Float()
external double featScale;
Expand Down
14 changes: 7 additions & 7 deletions flutter/sherpa_onnx/lib/src/tts.dart
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ class OfflineTtsZipVoiceModelConfig {
this.flowMatchingModel = '',
this.vocoder = '',
this.dataDir = '',
this.pinyinDict = '',
this.lexicon = '',
this.featScale = 0.1,
this.tShift = 0.5,
this.targetRms = 0.1,
Expand All @@ -213,7 +213,7 @@ class OfflineTtsZipVoiceModelConfig {
flowMatchingModel: json['flowMatchingModel'] as String? ?? '',
vocoder: json['vocoder'] as String? ?? '',
dataDir: json['dataDir'] as String? ?? '',
pinyinDict: json['pinyinDict'] as String? ?? '',
lexicon: json['lexicon'] as String? ?? '',
featScale: (json['featScale'] as num?)?.toDouble() ?? 0.1,
tShift: (json['tShift'] as num?)?.toDouble() ?? 0.5,
targetRms: (json['targetRms'] as num?)?.toDouble() ?? 0.1,
Expand All @@ -223,7 +223,7 @@ class OfflineTtsZipVoiceModelConfig {

@override
String toString() {
return 'OfflineTtsZipVoiceModelConfig(tokens: $tokens, textModel: $textModel, flowMatchingModel: $flowMatchingModel, vocoder: $vocoder, dataDir: $dataDir, pinyinDict: $pinyinDict, featScale: $featScale, tShift: $tShift, targetRms: $targetRms, guidanceScale: $guidanceScale)';
return 'OfflineTtsZipVoiceModelConfig(tokens: $tokens, textModel: $textModel, flowMatchingModel: $flowMatchingModel, vocoder: $vocoder, dataDir: $dataDir, lexicon: $lexicon, featScale: $featScale, tShift: $tShift, targetRms: $targetRms, guidanceScale: $guidanceScale)';
}

Map<String, dynamic> toJson() => {
Expand All @@ -232,7 +232,7 @@ class OfflineTtsZipVoiceModelConfig {
'flowMatchingModel': flowMatchingModel,
'vocoder': vocoder,
'dataDir': dataDir,
'pinyinDict': pinyinDict,
'lexicon': lexicon,
'featScale': featScale,
'tShift': tShift,
'targetRms': targetRms,
Expand All @@ -244,7 +244,7 @@ class OfflineTtsZipVoiceModelConfig {
final String flowMatchingModel;
final String vocoder;
final String dataDir;
final String pinyinDict;
final String lexicon;
final double featScale;
final double tShift;
final double targetRms;
Expand Down Expand Up @@ -406,7 +406,7 @@ class OfflineTts {
c.ref.model.zipvoice.flowMatchingModel = config.model.zipvoice.flowMatchingModel.toNativeUtf8();
c.ref.model.zipvoice.vocoder = config.model.zipvoice.vocoder.toNativeUtf8();
c.ref.model.zipvoice.dataDir = config.model.zipvoice.dataDir.toNativeUtf8();
c.ref.model.zipvoice.pinyinDict = config.model.zipvoice.pinyinDict.toNativeUtf8();
c.ref.model.zipvoice.lexicon = config.model.zipvoice.lexicon.toNativeUtf8();
c.ref.model.zipvoice.featScale = config.model.zipvoice.featScale;
c.ref.model.zipvoice.tShift = config.model.zipvoice.tShift;
c.ref.model.zipvoice.targetRms = config.model.zipvoice.targetRms;
Expand All @@ -427,7 +427,7 @@ class OfflineTts {
calloc.free(c.ref.ruleFsts);
calloc.free(c.ref.model.provider);

calloc.free(c.ref.model.zipvoice.pinyinDict);
calloc.free(c.ref.model.zipvoice.lexicon);
calloc.free(c.ref.model.zipvoice.dataDir);
calloc.free(c.ref.model.zipvoice.vocoder);
calloc.free(c.ref.model.zipvoice.flowMatchingModel);
Expand Down
38 changes: 18 additions & 20 deletions python-api-examples/offline-zeroshot-tts.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,23 @@

Example (zipvoice)

wget https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/sherpa-onnx-zipvoice-distill-zh-en-emilia.tar.bz2
tar xf sherpa-onnx-zipvoice-distill-zh-en-emilia.tar.bz2
wget https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/sherpa-onnx-zipvoice-distill-int8-zh-en-emilia.tar.bz2
tar xf sherpa-onnx-zipvoice-distill-int8-zh-en-emilia.tar.bz2

wget https://github.com/k2-fsa/sherpa-onnx/releases/download/vocoder-models/vocos_24khz.onnx

python3 ./python-api-examples/offline-zeroshot-tts.py \
--zipvoice-flow-matching-model sherpa-onnx-zipvoice-distill-zh-en-emilia/fm_decoder.onnx \
--zipvoice-text-model sherpa-onnx-zipvoice-distill-zh-en-emilia/text_encoder.onnx \
--zipvoice-data-dir sherpa-onnx-zipvoice-distill-zh-en-emilia/espeak-ng-data \
--zipvoice-pinyin-dict sherpa-onnx-zipvoice-distill-zh-en-emilia/pinyin.raw \
--zipvoice-tokens sherpa-onnx-zipvoice-distill-zh-en-emilia/tokens.txt \
--zipvoice-vocoder sherpa-onnx-zipvoice-distill-zh-en-emilia/vocos_24khz.onnx \
--prompt-audio sherpa-onnx-zipvoice-distill-zh-en-emilia/prompt.wav \
--zipvoice-flow-matching-model sherpa-onnx-zipvoice-distill-int8-zh-en-emilia/decoder.int8.onnx \
--zipvoice-text-model sherpa-onnx-zipvoice-distill-int8-zh-en-emilia/encoder.int8.onnx \
--zipvoice-data-dir sherpa-onnx-zipvoice-distill-int8-zh-en-emilia/espeak-ng-data \
--zipvoice-lexicon sherpa-onnx-zipvoice-distill-int8-zh-en-emilia/lexicon.txt \
--zipvoice-tokens sherpa-onnx-zipvoice-distill-int8-zh-en-emilia/tokens.txt \
--zipvoice-vocoder vocos_24khz.onnx \
--prompt-audio sherpa-onnx-zipvoice-distill-int8-zh-en-emilia/test_wavs/leijun-1.wav \
--zipvoice-num-steps 4 \
--num-threads 4 \
--prompt-text "周日被我射熄火了,所以今天是周一。" \
"我是中国人民的儿子,我爱我的祖国。我得祖国是一个伟大的国家,拥有五千年的文明史。"
--prompt-text "那还是三十六年前, 一九八七年. 我呢考上了武汉大学的计算机系." \
"小米的价值观是真诚, 热爱. 真诚,就是不欺人也不自欺. 热爱, 就是全心投入并享受其中."
"""

import argparse
Expand Down Expand Up @@ -68,10 +70,10 @@ def add_zipvoice_args(parser):
)

parser.add_argument(
"--zipvoice-pinyin-dict",
"--zipvoice-lexicon",
type=str,
default="",
help="Path to the pinyin dictionary.",
help="Path to the lexicon.txt",
)

parser.add_argument(
Expand Down Expand Up @@ -236,7 +238,7 @@ def main():
text_model=args.zipvoice_text_model,
flow_matching_model=args.zipvoice_flow_matching_model,
data_dir=args.zipvoice_data_dir,
pinyin_dict=args.zipvoice_pinyin_dict,
lexicon=args.zipvoice_lexicon,
vocoder=args.zipvoice_vocoder,
feat_scale=args.zipvoice_feat_scale,
t_shift=args.zipvoice_t_shift,
Expand Down Expand Up @@ -268,9 +270,7 @@ def main():
end = time.time()

if len(audio.samples) == 0:
print(
"Error in generating audios. Please read previous error messages."
)
print("Error in generating audios. Please read previous error messages.")
return

elapsed_seconds = end - start
Expand All @@ -287,9 +287,7 @@ def main():
print(f"The text is '{args.text}'")
print(f"Elapsed seconds: {elapsed_seconds:.3f}")
print(f"Audio duration in seconds: {audio_duration:.3f}")
print(
f"RTF: {elapsed_seconds:.3f}/{audio_duration:.3f} = {real_time_factor:.3f}"
)
print(f"RTF: {elapsed_seconds:.3f}/{audio_duration:.3f} = {real_time_factor:.3f}")


if __name__ == "__main__":
Expand Down
8 changes: 4 additions & 4 deletions scripts/go/sherpa_onnx.go
Original file line number Diff line number Diff line change
Expand Up @@ -484,7 +484,7 @@ type OfflineModelConfig struct {
ZipformerCtc OfflineZipformerCtcModelConfig
Canary OfflineCanaryModelConfig
WenetCtc OfflineWenetCtcModelConfig
Omnilingual OfflineOmnilingualAsrCtcModelConfig
Omnilingual OfflineOmnilingualAsrCtcModelConfig
Tokens string // Path to tokens.txt

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

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

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

c.model.zipvoice.feat_scale = C.float(config.Model.Zipvoice.FeatScale)
c.model.zipvoice.t_shift = C.float(config.Model.Zipvoice.TShift)
Expand Down
10 changes: 6 additions & 4 deletions sherpa-onnx/c-api/c-api.cc
Original file line number Diff line number Diff line change
Expand Up @@ -703,9 +703,11 @@ const SherpaOnnxOfflineRecognizerResult *SherpaOnnxGetOfflineStreamResult(
r->durations = nullptr;
}

if (!result.ys_log_probs.empty() && result.ys_log_probs.size() == r->count) {
if (!result.ys_log_probs.empty() &&
result.ys_log_probs.size() == r->count) {
r->ys_log_probs = new float[r->count];
std::copy(result.ys_log_probs.begin(), result.ys_log_probs.end(), r->ys_log_probs);
std::copy(result.ys_log_probs.begin(), result.ys_log_probs.end(),
r->ys_log_probs);
} else {
r->ys_log_probs = nullptr;
}
Expand Down Expand Up @@ -1248,8 +1250,8 @@ static sherpa_onnx::OfflineTtsConfig GetOfflineTtsConfig(
SHERPA_ONNX_OR(config->model.zipvoice.vocoder, "");
tts_config.model.zipvoice.data_dir =
SHERPA_ONNX_OR(config->model.zipvoice.data_dir, "");
tts_config.model.zipvoice.pinyin_dict =
SHERPA_ONNX_OR(config->model.zipvoice.pinyin_dict, "");
tts_config.model.zipvoice.lexicon =
SHERPA_ONNX_OR(config->model.zipvoice.lexicon, "");
tts_config.model.zipvoice.feat_scale =
SHERPA_ONNX_OR(config->model.zipvoice.feat_scale, 0.1f);
tts_config.model.zipvoice.t_shift =
Expand Down
2 changes: 1 addition & 1 deletion sherpa-onnx/c-api/c-api.h
Original file line number Diff line number Diff line change
Expand Up @@ -1072,7 +1072,7 @@ SHERPA_ONNX_API typedef struct SherpaOnnxOfflineTtsZipvoiceModelConfig {
const char *flow_matching_model;
const char *vocoder;
const char *data_dir;
const char *pinyin_dict;
const char *lexicon;
float feat_scale;
float t_shift;
float target_rms;
Expand Down
2 changes: 1 addition & 1 deletion sherpa-onnx/c-api/cxx-api.cc
Original file line number Diff line number Diff line change
Expand Up @@ -419,7 +419,7 @@ OfflineTts OfflineTts::Create(const OfflineTtsConfig &config) {
config.model.zipvoice.flow_matching_model.c_str();
c.model.zipvoice.vocoder = config.model.zipvoice.vocoder.c_str();
c.model.zipvoice.data_dir = config.model.zipvoice.data_dir.c_str();
c.model.zipvoice.pinyin_dict = config.model.zipvoice.pinyin_dict.c_str();
c.model.zipvoice.lexicon = config.model.zipvoice.lexicon.c_str();
c.model.zipvoice.feat_scale = config.model.zipvoice.feat_scale;
c.model.zipvoice.t_shift = config.model.zipvoice.t_shift;
c.model.zipvoice.target_rms = config.model.zipvoice.target_rms;
Expand Down
2 changes: 1 addition & 1 deletion sherpa-onnx/c-api/cxx-api.h
Original file line number Diff line number Diff line change
Expand Up @@ -432,7 +432,7 @@ struct OfflineTtsZipvoiceModelConfig {
std::string flow_matching_model;
std::string vocoder;
std::string data_dir;
std::string pinyin_dict;
std::string lexicon;

float feat_scale = 0.1;
float t_shift = 0.5;
Expand Down
3 changes: 0 additions & 3 deletions sherpa-onnx/csrc/offline-tts-zipvoice-model-config.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,6 @@ void OfflineTtsZipvoiceModelConfig::Register(ParseOptions *po) {
po->Register("zipvoice-data-dir", &data_dir,
"Path to the directory containing dict for espeak-ng.");
po->Register("zipvoice-lexicon", &lexicon, "Path to lexicon.txt for Chinese");
po->Register("zipvoice-pinyin-dict", &pinyin_dict,
"Path to the pinyin dictionary for cppinyin (i.e converting "
"Chinese into phones).");
po->Register("zipvoice-text-model", &text_model,
"Path to zipvoice text model");
po->Register("zipvoice-flow-matching-model", &flow_matching_model,
Expand Down
8 changes: 2 additions & 6 deletions sherpa-onnx/csrc/offline-tts-zipvoice-model-config.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,6 @@ struct OfflineTtsZipvoiceModelConfig {
std::string data_dir;
std::string lexicon;

// Used for converting Chinese characters to pinyin
std::string pinyin_dict;

float feat_scale = 0.1;
float t_shift = 0.5;
float target_rms = 0.1;
Expand All @@ -35,15 +32,14 @@ struct OfflineTtsZipvoiceModelConfig {
const std::string &tokens, const std::string &text_model,
const std::string &flow_matching_model, const std::string &vocoder,
const std::string &data_dir, const std::string &lexicon,
const std::string &pinyin_dict, float feat_scale = 0.1,
float t_shift = 0.5, float target_rms = 0.1, float guidance_scale = 1.0)
float feat_scale = 0.1, float t_shift = 0.5, float target_rms = 0.1,
float guidance_scale = 1.0)
: tokens(tokens),
text_model(text_model),
flow_matching_model(flow_matching_model),
vocoder(vocoder),
data_dir(data_dir),
lexicon(lexicon),
pinyin_dict(pinyin_dict),
feat_scale(feat_scale),
t_shift(t_shift),
target_rms(target_rms),
Expand Down
4 changes: 2 additions & 2 deletions sherpa-onnx/python/csrc/offline-tts-zipvoice-model-config.cc
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,15 @@ void PybindOfflineTtsZipvoiceModelConfig(py::module *m) {
float, float>(),
py::arg("tokens"), py::arg("text_model"),
py::arg("flow_matching_model"), py::arg("vocoder"),
py::arg("data_dir") = "", py::arg("pinyin_dict") = "",
py::arg("data_dir") = "", py::arg("lexicon") = "",
py::arg("feat_scale") = 0.1, py::arg("t_shift") = 0.5,
py::arg("target_rms") = 0.1, py::arg("guidance_scale") = 1.0)
.def_readwrite("tokens", &PyClass::tokens)
.def_readwrite("text_model", &PyClass::text_model)
.def_readwrite("flow_matching_model", &PyClass::flow_matching_model)
.def_readwrite("vocoder", &PyClass::vocoder)
.def_readwrite("data_dir", &PyClass::data_dir)
.def_readwrite("pinyin_dict", &PyClass::pinyin_dict)
.def_readwrite("lexicon", &PyClass::lexicon)
.def_readwrite("feat_scale", &PyClass::feat_scale)
.def_readwrite("t_shift", &PyClass::t_shift)
.def_readwrite("target_rms", &PyClass::target_rms)
Expand Down
4 changes: 2 additions & 2 deletions swift-api-examples/SherpaOnnx.swift
Original file line number Diff line number Diff line change
Expand Up @@ -933,7 +933,7 @@ func sherpaOnnxOfflineTtsZipvoiceModelConfig(
flowMatchingModel: String = "",
vocoder: String = "",
dataDir: String = "",
pinyinDict: String = "",
lexicon: String = "",
featScale: Float = 0.1,
tShift: Float = 0.5,
targetRms: Float = 0.1,
Expand All @@ -945,7 +945,7 @@ func sherpaOnnxOfflineTtsZipvoiceModelConfig(
flow_matching_model: toCPointer(flowMatchingModel),
vocoder: toCPointer(vocoder),
data_dir: toCPointer(dataDir),
pinyin_dict: toCPointer(pinyinDict),
lexicon: toCPointer(lexicon),
feat_scale: featScale,
t_shift: tShift,
target_rms: targetRms,
Expand Down
12 changes: 6 additions & 6 deletions wasm/tts/sherpa-onnx-tts.js
Original file line number Diff line number Diff line change
Expand Up @@ -269,10 +269,10 @@ function initSherpaOnnxOfflineTtsZipVoiceModelConfig(config, Module) {
Module.lengthBytesUTF8(config.flowMatchingModel || '') + 1;
const vocoderLen = Module.lengthBytesUTF8(config.vocoder || '') + 1;
const dataDirLen = Module.lengthBytesUTF8(config.dataDir || '') + 1;
const pinyinDictLen = Module.lengthBytesUTF8(config.pinyinDict || '') + 1;
const lexiconLen = Module.lengthBytesUTF8(config.lexicon || '') + 1;

const n = tokensLen + textModelLen + flowMatchingModelLen + vocoderLen +
dataDirLen + pinyinDictLen;
dataDirLen + lexiconLen;

const buffer = Module._malloc(n);

Expand All @@ -296,8 +296,8 @@ function initSherpaOnnxOfflineTtsZipVoiceModelConfig(config, Module) {
Module.stringToUTF8(config.dataDir || '', buffer + offset, dataDirLen);
offset += dataDirLen;

Module.stringToUTF8(config.pinyinDict || '', buffer + offset, pinyinDictLen);
offset += pinyinDictLen;
Module.stringToUTF8(config.lexicon || '', buffer + offset, lexiconLen);
offset += lexiconLen;

offset = 0;
Module.setValue(ptr, buffer + offset, 'i8*');
Expand All @@ -316,7 +316,7 @@ function initSherpaOnnxOfflineTtsZipVoiceModelConfig(config, Module) {
offset += dataDirLen;

Module.setValue(ptr + 20, buffer + offset, 'i8*');
offset += pinyinDictLen;
offset += lexiconLen;

Module.setValue(ptr + 24, config.featScale || 0.1, 'float');
Module.setValue(ptr + 28, config.tShift || 0.5, 'float');
Expand Down Expand Up @@ -381,7 +381,7 @@ function initSherpaOnnxOfflineTtsModelConfig(config, Module) {
flowMatchingModel: '',
vocoder: '',
dataDir: '',
pinyinDict: '',
lexicon: '',
featScale: 0.1,
tShift: 0.5,
targetRMS: 0.1,
Expand Down
2 changes: 1 addition & 1 deletion wasm/tts/sherpa-onnx-wasm-main-tts.cc
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ void MyPrint(SherpaOnnxOfflineTtsConfig *tts_config) {
fprintf(stdout, "flow_matching_model: %s\n", zipvoice->flow_matching_model);
fprintf(stdout, "vocoder: %s\n", zipvoice->vocoder);
fprintf(stdout, "data_dir: %s\n", zipvoice->data_dir);
fprintf(stdout, "pinyin_dict: %s\n", zipvoice->pinyin_dict);
fprintf(stdout, "lexicon: %s\n", zipvoice->lexicon);
fprintf(stdout, "feat scale: %.3f\n", zipvoice->feat_scale);
fprintf(stdout, "t_shift: %.3f\n", zipvoice->t_shift);
fprintf(stdout, "target_rms: %.3f\n", zipvoice->target_rms);
Expand Down
Loading