diff --git a/ios-swiftui/SherpaOnnxTts/SherpaOnnxTts/ViewModel.swift b/ios-swiftui/SherpaOnnxTts/SherpaOnnxTts/ViewModel.swift index 4d328903..b2000c3b 100644 --- a/ios-swiftui/SherpaOnnxTts/SherpaOnnxTts/ViewModel.swift +++ b/ios-swiftui/SherpaOnnxTts/SherpaOnnxTts/ViewModel.swift @@ -180,10 +180,43 @@ func getTtsFor_kokoro_en_v0_19() -> SherpaOnnxOfflineTtsWrapper { return SherpaOnnxOfflineTtsWrapper(config: &config) } +func getTtsFor_kokoro_multi_lang_v1_0() -> SherpaOnnxOfflineTtsWrapper { + // please see https://k2-fsa.github.io/sherpa/onnx/tts/pretrained_models/kokoro.html + + let model = getResource("model", "onnx") + let voices = getResource("voices", "bin") + + // tokens.txt + let tokens = getResource("tokens", "txt") + + let lexicon_en = getResource("lexicon-us-en", "txt") + let lexicon_zh = getResource("lexicon-zh", "txt") + let lexicon = "\(lexicon_en),\(lexicon_zh)" + + // in this case, we don't need lexicon.txt + let dataDir = resourceURL(to: "espeak-ng-data") + let dictDir = resourceURL(to: "dict") + + let numFst = getResource("number-zh", "fst") + let dateFst = getResource("date-zh", "fst") + let phoneFst = getResource("phone-zh", "fst") + let ruleFsts = "\(dateFst),\(phoneFst),\(numFst)" + + let kokoro = sherpaOnnxOfflineTtsKokoroModelConfig( + model: model, voices: voices, tokens: tokens, dataDir: dataDir, + dictDir: dictDir, lexicon: lexicon) + let modelConfig = sherpaOnnxOfflineTtsModelConfig(kokoro: kokoro) + var config = sherpaOnnxOfflineTtsConfig(model: modelConfig) + + return SherpaOnnxOfflineTtsWrapper(config: &config) +} + func createOfflineTts() -> SherpaOnnxOfflineTtsWrapper { // Please enable only one of them - return getTtsFor_kokoro_en_v0_19() + return getTtsFor_kokoro_multi_lang_v1_0() + + // return getTtsFor_kokoro_en_v0_19() // return getTtsFor_matcha_icefall_zh_baker()