From 912efe27600d695cec6a691a032a626c919b0717 Mon Sep 17 00:00:00 2001 From: Fangjun Kuang Date: Thu, 11 Dec 2025 19:10:19 +0800 Subject: [PATCH] Fix building errors --- .../lib/src/sherpa_onnx_bindings.dart | 2 +- flutter/sherpa_onnx/lib/src/tts.dart | 14 +++---- python-api-examples/offline-zeroshot-tts.py | 38 +++++++++---------- scripts/go/sherpa_onnx.go | 8 ++-- sherpa-onnx/c-api/c-api.cc | 10 +++-- sherpa-onnx/c-api/c-api.h | 2 +- sherpa-onnx/c-api/cxx-api.cc | 2 +- sherpa-onnx/c-api/cxx-api.h | 2 +- .../csrc/offline-tts-zipvoice-model-config.cc | 3 -- .../csrc/offline-tts-zipvoice-model-config.h | 8 +--- .../csrc/offline-tts-zipvoice-model-config.cc | 4 +- swift-api-examples/SherpaOnnx.swift | 4 +- wasm/tts/sherpa-onnx-tts.js | 12 +++--- wasm/tts/sherpa-onnx-wasm-main-tts.cc | 2 +- 14 files changed, 52 insertions(+), 59 deletions(-) diff --git a/flutter/sherpa_onnx/lib/src/sherpa_onnx_bindings.dart b/flutter/sherpa_onnx/lib/src/sherpa_onnx_bindings.dart index 8ce7779719..2ad7c6b2d3 100644 --- a/flutter/sherpa_onnx/lib/src/sherpa_onnx_bindings.dart +++ b/flutter/sherpa_onnx/lib/src/sherpa_onnx_bindings.dart @@ -220,7 +220,7 @@ final class SherpaOnnxOfflineTtsZipVoiceModelConfig extends Struct { external Pointer flowMatchingModel; external Pointer vocoder; external Pointer dataDir; - external Pointer pinyinDict; + external Pointer lexicon; @Float() external double featScale; diff --git a/flutter/sherpa_onnx/lib/src/tts.dart b/flutter/sherpa_onnx/lib/src/tts.dart index be3fce655d..dc1b1a8a3f 100644 --- a/flutter/sherpa_onnx/lib/src/tts.dart +++ b/flutter/sherpa_onnx/lib/src/tts.dart @@ -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, @@ -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, @@ -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 toJson() => { @@ -232,7 +232,7 @@ class OfflineTtsZipVoiceModelConfig { 'flowMatchingModel': flowMatchingModel, 'vocoder': vocoder, 'dataDir': dataDir, - 'pinyinDict': pinyinDict, + 'lexicon': lexicon, 'featScale': featScale, 'tShift': tShift, 'targetRms': targetRms, @@ -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; @@ -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; @@ -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); diff --git a/python-api-examples/offline-zeroshot-tts.py b/python-api-examples/offline-zeroshot-tts.py index 805f06fe27..746fbb3da1 100755 --- a/python-api-examples/offline-zeroshot-tts.py +++ b/python-api-examples/offline-zeroshot-tts.py @@ -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 @@ -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( @@ -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, @@ -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 @@ -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__": diff --git a/scripts/go/sherpa_onnx.go b/scripts/go/sherpa_onnx.go index 721db85774..e91fa835f2 100644 --- a/scripts/go/sherpa_onnx.go +++ b/scripts/go/sherpa_onnx.go @@ -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 @@ -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 @@ -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) diff --git a/sherpa-onnx/c-api/c-api.cc b/sherpa-onnx/c-api/c-api.cc index 99422a06a4..bfb303550c 100644 --- a/sherpa-onnx/c-api/c-api.cc +++ b/sherpa-onnx/c-api/c-api.cc @@ -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; } @@ -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 = diff --git a/sherpa-onnx/c-api/c-api.h b/sherpa-onnx/c-api/c-api.h index e3f7e016cf..38d99c5ac3 100644 --- a/sherpa-onnx/c-api/c-api.h +++ b/sherpa-onnx/c-api/c-api.h @@ -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; diff --git a/sherpa-onnx/c-api/cxx-api.cc b/sherpa-onnx/c-api/cxx-api.cc index a7e35c5599..f1f2feec20 100644 --- a/sherpa-onnx/c-api/cxx-api.cc +++ b/sherpa-onnx/c-api/cxx-api.cc @@ -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; diff --git a/sherpa-onnx/c-api/cxx-api.h b/sherpa-onnx/c-api/cxx-api.h index 77401e670b..f7144c5083 100644 --- a/sherpa-onnx/c-api/cxx-api.h +++ b/sherpa-onnx/c-api/cxx-api.h @@ -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; diff --git a/sherpa-onnx/csrc/offline-tts-zipvoice-model-config.cc b/sherpa-onnx/csrc/offline-tts-zipvoice-model-config.cc index 1226adf858..70de86679d 100644 --- a/sherpa-onnx/csrc/offline-tts-zipvoice-model-config.cc +++ b/sherpa-onnx/csrc/offline-tts-zipvoice-model-config.cc @@ -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, diff --git a/sherpa-onnx/csrc/offline-tts-zipvoice-model-config.h b/sherpa-onnx/csrc/offline-tts-zipvoice-model-config.h index 5b5d0c24b7..702760d08f 100644 --- a/sherpa-onnx/csrc/offline-tts-zipvoice-model-config.h +++ b/sherpa-onnx/csrc/offline-tts-zipvoice-model-config.h @@ -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; @@ -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), diff --git a/sherpa-onnx/python/csrc/offline-tts-zipvoice-model-config.cc b/sherpa-onnx/python/csrc/offline-tts-zipvoice-model-config.cc index 53451077ad..dc6e8fb2ee 100644 --- a/sherpa-onnx/python/csrc/offline-tts-zipvoice-model-config.cc +++ b/sherpa-onnx/python/csrc/offline-tts-zipvoice-model-config.cc @@ -21,7 +21,7 @@ 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) @@ -29,7 +29,7 @@ void PybindOfflineTtsZipvoiceModelConfig(py::module *m) { .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) diff --git a/swift-api-examples/SherpaOnnx.swift b/swift-api-examples/SherpaOnnx.swift index b18b8e1a1d..ee40fbde90 100644 --- a/swift-api-examples/SherpaOnnx.swift +++ b/swift-api-examples/SherpaOnnx.swift @@ -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, @@ -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, diff --git a/wasm/tts/sherpa-onnx-tts.js b/wasm/tts/sherpa-onnx-tts.js index e24bbc3f18..2c1b0c36b4 100644 --- a/wasm/tts/sherpa-onnx-tts.js +++ b/wasm/tts/sherpa-onnx-tts.js @@ -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); @@ -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*'); @@ -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'); @@ -381,7 +381,7 @@ function initSherpaOnnxOfflineTtsModelConfig(config, Module) { flowMatchingModel: '', vocoder: '', dataDir: '', - pinyinDict: '', + lexicon: '', featScale: 0.1, tShift: 0.5, targetRMS: 0.1, diff --git a/wasm/tts/sherpa-onnx-wasm-main-tts.cc b/wasm/tts/sherpa-onnx-wasm-main-tts.cc index e6707135c8..99deb46c76 100644 --- a/wasm/tts/sherpa-onnx-wasm-main-tts.cc +++ b/wasm/tts/sherpa-onnx-wasm-main-tts.cc @@ -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);