105 lines
3.1 KiB
Swift
105 lines
3.1 KiB
Swift
//
|
|
// ViewModel.swift
|
|
// SherpaOnnxTts
|
|
//
|
|
// Created by fangjun on 2023/11/23.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
// used to get the path to espeak-ng-data
|
|
func resourceURL(to path: String) -> String {
|
|
return URL(string: path, relativeTo: Bundle.main.resourceURL)!.path
|
|
}
|
|
|
|
func getResource(_ forResource: String, _ ofType: String) -> String {
|
|
let path = Bundle.main.path(forResource: forResource, ofType: ofType)
|
|
precondition(
|
|
path != nil,
|
|
"\(forResource).\(ofType) does not exist!\n" + "Remember to change \n"
|
|
+ " Build Phases -> Copy Bundle Resources\n" + "to add it!"
|
|
)
|
|
return path!
|
|
}
|
|
|
|
/// Please refer to
|
|
/// https://k2-fsa.github.io/sherpa/onnx/tts/pretrained_models/index.html
|
|
/// to download pre-trained models
|
|
|
|
func getTtsForVCTK() -> SherpaOnnxOfflineTtsWrapper {
|
|
// See the following link
|
|
// https://k2-fsa.github.io/sherpa/onnx/tts/pretrained_models/vits.html#vctk-english-multi-speaker-109-speakers
|
|
|
|
// vits-vctk.onnx
|
|
let model = getResource("vits-vctk", "onnx")
|
|
|
|
// lexicon.txt
|
|
let lexicon = getResource("lexicon", "txt")
|
|
|
|
// tokens.txt
|
|
let tokens = getResource("tokens", "txt")
|
|
|
|
let vits = sherpaOnnxOfflineTtsVitsModelConfig(model: model, lexicon: lexicon, tokens: tokens)
|
|
let modelConfig = sherpaOnnxOfflineTtsModelConfig(vits: vits)
|
|
var config = sherpaOnnxOfflineTtsConfig(model: modelConfig)
|
|
return SherpaOnnxOfflineTtsWrapper(config: &config)
|
|
}
|
|
|
|
func getTtsForAishell3() -> SherpaOnnxOfflineTtsWrapper {
|
|
// See the following link
|
|
// https://k2-fsa.github.io/sherpa/onnx/tts/pretrained_models/vits.html#vits-model-aishell3
|
|
|
|
let model = getResource("model", "onnx")
|
|
|
|
// lexicon.txt
|
|
let lexicon = getResource("lexicon", "txt")
|
|
|
|
// tokens.txt
|
|
let tokens = getResource("tokens", "txt")
|
|
|
|
// rule.fst
|
|
let ruleFsts = getResource("rule", "fst")
|
|
|
|
// rule.far
|
|
let ruleFars = getResource("rule", "far")
|
|
|
|
let vits = sherpaOnnxOfflineTtsVitsModelConfig(model: model, lexicon: lexicon, tokens: tokens)
|
|
let modelConfig = sherpaOnnxOfflineTtsModelConfig(vits: vits)
|
|
var config = sherpaOnnxOfflineTtsConfig(
|
|
model: modelConfig,
|
|
ruleFsts: ruleFsts,
|
|
ruleFars: ruleFars
|
|
)
|
|
return SherpaOnnxOfflineTtsWrapper(config: &config)
|
|
}
|
|
|
|
// https://github.com/k2-fsa/sherpa-onnx/releases/tag/tts-models
|
|
func getTtsFor_en_US_amy_low() -> SherpaOnnxOfflineTtsWrapper {
|
|
// please see https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/vits-piper-en_US-amy-low.tar.bz2
|
|
|
|
let model = getResource("en_US-amy-low", "onnx")
|
|
|
|
// tokens.txt
|
|
let tokens = getResource("tokens", "txt")
|
|
|
|
// in this case, we don't need lexicon.txt
|
|
let dataDir = resourceURL(to: "espeak-ng-data")
|
|
|
|
let vits = sherpaOnnxOfflineTtsVitsModelConfig(
|
|
model: model, lexicon: "", tokens: tokens, dataDir: dataDir)
|
|
let modelConfig = sherpaOnnxOfflineTtsModelConfig(vits: vits)
|
|
var config = sherpaOnnxOfflineTtsConfig(model: modelConfig)
|
|
|
|
return SherpaOnnxOfflineTtsWrapper(config: &config)
|
|
}
|
|
|
|
func createOfflineTts() -> SherpaOnnxOfflineTtsWrapper {
|
|
return getTtsFor_en_US_amy_low()
|
|
|
|
// return getTtsForVCTK()
|
|
|
|
// return getTtsForAishell3()
|
|
|
|
// please add more models on need by following the above two examples
|
|
}
|