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,17 +134,36 @@ Future<sherpa_onnx.OfflineTts> createOfflineTts() async { @@ -126,17 +134,36 @@ 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(  
131 - model: modelName,  
132 - lexicon: lexicon,  
133 - tokens: tokens,  
134 - dataDir: dataDir,  
135 - dictDir: dictDir,  
136 - ); 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(
  154 + model: modelName,
  155 + lexicon: lexicon,
  156 + tokens: tokens,
  157 + dataDir: dataDir,
  158 + dictDir: dictDir,
  159 + );
  160 +
  161 + kokoro = sherpa_onnx.OfflineTtsKokoroModelConfig();
  162 + }
137 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',