2024-08-05 14:06:21 +08:00
class MyClass {
func playSamples ( samples : [ Float ] ) {
print ( " Play \( samples . count ) samples " )
}
}
2023-11-22 16:04:26 +08:00
func run ( ) {
2023-11-30 23:57:43 +08:00
let model = " ./vits-piper-en_US-amy-low/en_US-amy-low.onnx "
let tokens = " ./vits-piper-en_US-amy-low/tokens.txt "
let dataDir = " ./vits-piper-en_US-amy-low/espeak-ng-data "
2023-11-22 16:04:26 +08:00
let vits = sherpaOnnxOfflineTtsVitsModelConfig (
model : model ,
2023-11-30 23:57:43 +08:00
lexicon : " " ,
tokens : tokens ,
dataDir : dataDir
2023-11-22 16:04:26 +08:00
)
let modelConfig = sherpaOnnxOfflineTtsModelConfig ( vits : vits )
var ttsConfig = sherpaOnnxOfflineTtsConfig ( model : modelConfig )
2024-08-05 14:06:21 +08:00
let myClass = MyClass ( )
// W e u s e U n r e t a i n e d h e r e s o m y C l a s s m u s t b e k e p t a l i v e a s t h e c a l l b a c k i s i n v o k e d
//
// S e e a l s o
// h t t p s : / / m e d i u m . c o m / c o d e x / s w i f t - c - c a l l b a c k - i n t e r o p e r a b i l i t y - 6 d 5 7 d a 6 c 8 e e 6
let arg = Unmanaged < MyClass > . passUnretained ( myClass ) . toOpaque ( )
let callback : TtsCallbackWithArg = { samples , n , arg in
let o = Unmanaged < MyClass > . fromOpaque ( arg ! ) . takeUnretainedValue ( )
var savedSamples : [ Float ] = [ ]
for index in 0. . < n {
savedSamples . append ( samples ! [ Int ( index ) ] )
}
o . playSamples ( samples : savedSamples )
// r e t u r n 1 s o t h a t i t c o n t i n u e s g e n e r a t i n g
return 1
}
2023-11-22 16:04:26 +08:00
let tts = SherpaOnnxOfflineTtsWrapper ( config : & ttsConfig )
2023-11-30 23:57:43 +08:00
let 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.” "
2023-11-22 16:04:26 +08:00
let sid = 99
let speed : Float = 1.0
2024-08-05 14:06:21 +08:00
let audio = tts . generateWithCallbackWithArg (
text : text , callback : callback , arg : arg , sid : sid , speed : speed )
2025-01-06 07:23:45 +08:00
let filename = " test-vits-en.wav "
2024-08-05 14:06:21 +08:00
let ok = audio . save ( filename : filename )
if ok = = 1 {
print ( " \n Saved to: \( filename ) " )
} else {
print ( " Failed to save to \( filename ) " )
}
2023-11-22 16:04:26 +08:00
}
@ main
struct App {
static func main ( ) {
run ( )
}
}