Fangjun Kuang
Committed by GitHub

Add Flutter example for Kokoro TTS (#1776)

@@ -24,13 +24,14 @@ Future<sherpa_onnx.OfflineTts> createOfflineTts() async { @@ -24,13 +24,14 @@ Future<sherpa_onnx.OfflineTts> createOfflineTts() async {
24 24
25 String modelDir = ''; 25 String modelDir = '';
26 String modelName = ''; 26 String modelName = '';
  27 + String voices = ''; // for Kokoro only
27 String ruleFsts = ''; 28 String ruleFsts = '';
28 String ruleFars = ''; 29 String ruleFars = '';
29 String lexicon = ''; 30 String lexicon = '';
30 String dataDir = ''; 31 String dataDir = '';
31 String dictDir = ''; 32 String dictDir = '';
32 33
33 - // You can select an example below and change it according to match your 34 + // You can select an example below and change it accordingly to match your
34 // selected tts model 35 // selected tts model
35 36
36 // ============================================================ 37 // ============================================================
@@ -84,6 +85,13 @@ Future<sherpa_onnx.OfflineTts> createOfflineTts() async { @@ -84,6 +85,13 @@ Future<sherpa_onnx.OfflineTts> createOfflineTts() async {
84 // lexicon = 'lexicon.txt'; 85 // lexicon = 'lexicon.txt';
85 // dictDir = 'vits-melo-tts-zh_en/dict'; 86 // dictDir = 'vits-melo-tts-zh_en/dict';
86 87
  88 + // Example 8
  89 + // https://k2-fsa.github.io/sherpa/onnx/tts/pretrained_models/kokoro.html#kokoro-en-v0-19-english-11-speakers
  90 + // modelDir = 'kokoro-en-v0_19';
  91 + // modelName = 'model.onnx';
  92 + // voices = 'voices.bin';
  93 + // dataDir = 'kokoro-en-v0_19/espeak-ng-data';
  94 +
87 // ============================================================ 95 // ============================================================
88 // Please don't change the remaining part of this function 96 // Please don't change the remaining part of this function
89 // ============================================================ 97 // ============================================================
@@ -126,8 +134,23 @@ Future<sherpa_onnx.OfflineTts> createOfflineTts() async { @@ -126,8 +134,23 @@ Future<sherpa_onnx.OfflineTts> createOfflineTts() async {
126 } 134 }
127 135
128 final tokens = p.join(directory.path, modelDir, 'tokens.txt'); 136 final tokens = p.join(directory.path, modelDir, 'tokens.txt');
  137 + if (voices != '') {
  138 + voices = p.join(directory.path, modelDir, voices);
  139 + }
129 140
130 - final vits = sherpa_onnx.OfflineTtsVitsModelConfig( 141 + late final sherpa_onnx.OfflineTtsVitsModelConfig vits;
  142 + late final sherpa_onnx.OfflineTtsKokoroModelConfig kokoro;
  143 +
  144 + if (voices != '') {
  145 + vits = sherpa_onnx.OfflineTtsVitsModelConfig();
  146 + kokoro = sherpa_onnx.OfflineTtsKokoroModelConfig(
  147 + model: modelName,
  148 + voices: voices,
  149 + tokens: tokens,
  150 + dataDir: dataDir,
  151 + );
  152 + } else {
  153 + vits = sherpa_onnx.OfflineTtsVitsModelConfig(
131 model: modelName, 154 model: modelName,
132 lexicon: lexicon, 155 lexicon: lexicon,
133 tokens: tokens, 156 tokens: tokens,
@@ -135,8 +158,12 @@ Future<sherpa_onnx.OfflineTts> createOfflineTts() async { @@ -135,8 +158,12 @@ Future<sherpa_onnx.OfflineTts> createOfflineTts() async {
135 dictDir: dictDir, 158 dictDir: dictDir,
136 ); 159 );
137 160
  161 + kokoro = sherpa_onnx.OfflineTtsKokoroModelConfig();
  162 + }
  163 +
138 final modelConfig = sherpa_onnx.OfflineTtsModelConfig( 164 final modelConfig = sherpa_onnx.OfflineTtsModelConfig(
139 vits: vits, 165 vits: vits,
  166 + kokoro: kokoro,
140 numThreads: 2, 167 numThreads: 2,
141 debug: true, 168 debug: true,
142 provider: 'cpu', 169 provider: 'cpu',