Repository navigation
Add C API for KittenTTS #2467
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add C API for KittenTTS #2467
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,83 @@ | ||
| // c-api-examples/kitten-tts-en-c-api.c | ||
| // | ||
| // Copyright (c) 2025 Xiaomi Corporation | ||
|
|
||
| // This file shows how to use sherpa-onnx C API | ||
| // for English TTS with Kitten. | ||
| // | ||
| // clang-format off | ||
| /* | ||
| Usage | ||
|
|
||
| wget https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/kitten-nano-en-v0_1-fp16.tar.bz2 | ||
| tar xf kitten-nano-en-v0_1-fp16.tar.bz2 | ||
| rm kitten-nano-en-v0_1-fp16.tar.bz2 | ||
|
|
||
| ./kitten-tts-en-c-api | ||
|
|
||
| */ | ||
| // clang-format on | ||
|
|
||
| #include <stdio.h> | ||
| #include <stdlib.h> | ||
| #include <string.h> | ||
|
|
||
| #include "sherpa-onnx/c-api/c-api.h" | ||
|
|
||
| static int32_t ProgressCallback(const float *samples, int32_t num_samples, | ||
| float progress) { | ||
| fprintf(stderr, "Progress: %.3f%%\n", progress * 100); | ||
| // return 1 to continue generating | ||
| // return 0 to stop generating | ||
| return 1; | ||
| } | ||
|
|
||
| int32_t main(int32_t argc, char *argv[]) { | ||
| SherpaOnnxOfflineTtsConfig config; | ||
| memset(&config, 0, sizeof(config)); | ||
| config.model.kitten.model = "./kitten-nano-en-v0_1-fp16/model.fp16.onnx"; | ||
| config.model.kitten.voices = "./kitten-nano-en-v0_1-fp16/voices.bin"; | ||
| config.model.kitten.tokens = "./kitten-nano-en-v0_1-fp16/tokens.txt"; | ||
| config.model.kitten.data_dir = "./kitten-nano-en-v0_1-fp16/espeak-ng-data"; | ||
|
|
||
| config.model.num_threads = 2; | ||
|
|
||
| // If you don't want to see debug messages, please set it to 0 | ||
| config.model.debug = 1; | ||
|
|
||
|
coderabbitai[bot] marked this conversation as resolved.
|
||
| const char *filename = "./generated-kitten-en.wav"; | ||
| const char *text = | ||
| "Today as always, men fall into two groups: slaves and free men. Whoever " | ||
| "does not have two-thirds of his day for himself, is a slave, whatever " | ||
| "he may be: a statesman, a businessman, an official, or a scholar. " | ||
| "Friends fell out often because life was changing so fast. The easiest " | ||
| "thing in the world was to lose touch with someone."; | ||
|
|
||
| const SherpaOnnxOfflineTts *tts = SherpaOnnxCreateOfflineTts(&config); | ||
| // mapping of sid to voice name | ||
| // 0->af, 1->af_bella, 2->af_nicole, 3->af_sarah, 4->af_sky, 5->am_adam | ||
| // 6->am_michael, 7->bf_emma, 8->bf_isabella, 9->bm_george, 10->bm_lewis | ||
| int32_t sid = 0; | ||
| float speed = 1.0; // larger -> faster in speech speed | ||
|
|
||
| #if 0 | ||
| // If you don't want to use a callback, then please enable this branch | ||
| const SherpaOnnxGeneratedAudio *audio = | ||
| SherpaOnnxOfflineTtsGenerate(tts, text, sid, speed); | ||
| #else | ||
| const SherpaOnnxGeneratedAudio *audio = | ||
| SherpaOnnxOfflineTtsGenerateWithProgressCallback(tts, text, sid, speed, | ||
| ProgressCallback); | ||
| #endif | ||
|
|
||
| SherpaOnnxWriteWave(audio->samples, audio->n, audio->sample_rate, filename); | ||
|
|
||
| SherpaOnnxDestroyOfflineTtsGeneratedAudio(audio); | ||
| SherpaOnnxDestroyOfflineTts(tts); | ||
|
|
||
| fprintf(stderr, "Input text is: %s\n", text); | ||
| fprintf(stderr, "Speaker ID is: %d\n", sid); | ||
| fprintf(stderr, "Saved to: %s\n", filename); | ||
|
|
||
| return 0; | ||
| } | ||
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -1207,6 +1207,18 @@ static sherpa_onnx::OfflineTtsConfig GetOfflineTtsConfig( | |||||
| SHERPA_ONNX_OR(config->model.kokoro.lexicon, ""); | ||||||
| tts_config.model.kokoro.lang = SHERPA_ONNX_OR(config->model.kokoro.lang, ""); | ||||||
|
|
||||||
| // kitten | ||||||
| tts_config.model.kitten.model = | ||||||
| SHERPA_ONNX_OR(config->model.kitten.model, ""); | ||||||
| tts_config.model.kitten.voices = | ||||||
| SHERPA_ONNX_OR(config->model.kitten.voices, ""); | ||||||
| tts_config.model.kitten.tokens = | ||||||
| SHERPA_ONNX_OR(config->model.kitten.tokens, ""); | ||||||
| tts_config.model.kitten.data_dir = | ||||||
| SHERPA_ONNX_OR(config->model.kitten.data_dir, ""); | ||||||
| tts_config.model.kitten.length_scale = | ||||||
| SHERPA_ONNX_OR(config->model.kitten.length_scale, 1.0); | ||||||
|
||||||
| SHERPA_ONNX_OR(config->model.kitten.length_scale, 1.0); | |
| (config->model.kitten.length_scale != 0.0 ? config->model.kitten.length_scale : 1.0); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Verification agent
❓ Verification inconclusive
Harden the KittenTTS CI step (fail fast, robust downloads, rpath, artifact existence)
set -euo pipefailso failures propagate.curl -fSLto fail on HTTP errors.Apply this diff within the step:
- name: Test KittenTTS shell: bash run: | - name=kitten-tts-en-c-api + set -euo pipefail + name=kitten-tts-en-c-api gcc -o $name ./c-api-examples/$name.c \ -I ./build/install/include \ -L ./build/install/lib/ \ - -l sherpa-onnx-c-api \ - -l onnxruntime + -l sherpa-onnx-c-api \ + -l onnxruntime \ + -Wl,-rpath,'$ORIGIN/build/install/lib' ls -lh $name if [[ ${{ matrix.os }} == ubuntu-latest || ${{ matrix.os }} == ubuntu-22.04-arm ]]; then ldd ./$name echo "----" readelf -d ./$name fi - curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/kitten-nano-en-v0_1-fp16.tar.bz2 + curl -fSL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/kitten-nano-en-v0_1-fp16.tar.bz2 tar xf kitten-nano-en-v0_1-fp16.tar.bz2 rm kitten-nano-en-v0_1-fp16.tar.bz2 export LD_LIBRARY_PATH=$PWD/build/install/lib:$LD_LIBRARY_PATH export DYLD_LIBRARY_PATH=$PWD/build/install/lib:$DYLD_LIBRARY_PATH ./$name + test -f generated-kitten-en.wav rm $name rm -rf kitten-nano-en-v0_1-fp16Note: If macOS fails due to
$ORIGIN, replace it with@loader_pathin the rpath flag for Darwin.Harden the “Test KittenTTS” Bash step
Introduce early‐exit, strict shell flags, robust download checks, embedded rpath, and artifact validation:
set -euo pipefailat the top of therun:block to fail fast on any error or unset variable.curl -SLtocurl -fSLso HTTP errors abort the script.-Wl,-rpath,'$ORIGIN/build/install/lib'to thegcccommand line (use@loader_pathon macOS) to avoid relying onLD_LIBRARY_PATH/DYLD_LIBRARY_PATH.test -f generated-kitten-en.wavbefore uploading.- name: Test KittenTTS shell: bash run: | + set -euo pipefail name=kitten-tts-en-c-api gcc -o $name ./c-api-examples/$name.c \ -I ./build/install/include \ -L ./build/install/lib/ \ - -l sherpa-onnx-c-api \ - -l onnxruntime + -l sherpa-onnx-c-api \ + -l onnxruntime \ + -Wl,-rpath,'$ORIGIN/build/install/lib' ls -lh $name if [[ ${{ matrix.os }} == ubuntu-latest || ${{ matrix.os }} == ubuntu-22.04-arm ]]; then ldd ./$name echo "----" readelf -d ./$name fi - curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/kitten-nano-en-v0_1-fp16.tar.bz2 + curl -fSL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/kitten-nano-en-v0_1-fp16.tar.bz2 tar xf kitten-nano-en-v0_1-fp16.tar.bz2 rm kitten-nano-en-v0_1-fp16.tar.bz2 export LD_LIBRARY_PATH=$PWD/build/install/lib:$LD_LIBRARY_PATH export DYLD_LIBRARY_PATH=$PWD/build/install/lib:$DYLD_LIBRARY_PATH ./$name + test -f generated-kitten-en.wav rm $name rm -rf kitten-nano-en-v0_1-fp16Note: On Darwin replace
$ORIGINwith@loader_pathin the rpath flag.📝 Committable suggestion
🤖 Prompt for AI Agents