Toggle navigation
Toggle navigation
此项目
正在载入...
Sign in
xuning
/
sherpaonnx
转到一个项目
Toggle navigation
项目
群组
代码片段
帮助
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
Fangjun Kuang
2025-08-08 20:16:33 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Committed by
GitHub
2025-08-08 20:16:33 +0800
Commit
c726f9d7ee482ed049baf9d79b945b2d40af8f7e
c726f9d7
1 parent
9f3e70e5
Add Swift API for KittenTTS (#2476)
隐藏空白字符变更
内嵌
并排对比
正在显示
5 个修改的文件
包含
127 行增加
和
2 行删除
.github/scripts/test-swift.sh
swift-api-examples/.gitignore
swift-api-examples/SherpaOnnx.swift
swift-api-examples/run-tts-kitten-en.sh
swift-api-examples/tts-kitten-en.swift
.github/scripts/test-swift.sh
查看文件 @
c726f9d
...
...
@@ -9,6 +9,10 @@ ls -lh
./run-test-version.sh
./run-tts-kitten-en.sh
ls -lh
rm -rf kitten-
*
./run-zipformer-ctc-asr.sh
rm -rf sherpa-onnx-zipformer-
*
...
...
swift-api-examples/.gitignore
查看文件 @
c726f9d
...
...
@@ -20,3 +20,4 @@ decode-file-sense-voice-with-hr
test-version
zipformer-ctc-asr
dolphin-ctc-asr
tts-kitten-en
...
...
swift-api-examples/SherpaOnnx.swift
查看文件 @
c726f9d
...
...
@@ -884,13 +884,30 @@ func sherpaOnnxOfflineTtsKokoroModelConfig(
)
}
func
sherpaOnnxOfflineTtsKittenModelConfig
(
model
:
String
=
""
,
voices
:
String
=
""
,
tokens
:
String
=
""
,
dataDir
:
String
=
""
,
lengthScale
:
Float
=
1.0
)
->
SherpaOnnxOfflineTtsKittenModelConfig
{
return
SherpaOnnxOfflineTtsKittenModelConfig
(
model
:
toCPointer
(
model
),
voices
:
toCPointer
(
voices
),
tokens
:
toCPointer
(
tokens
),
data_dir
:
toCPointer
(
dataDir
),
length_scale
:
lengthScale
)
}
func
sherpaOnnxOfflineTtsModelConfig
(
vits
:
SherpaOnnxOfflineTtsVitsModelConfig
=
sherpaOnnxOfflineTtsVitsModelConfig
(),
matcha
:
SherpaOnnxOfflineTtsMatchaModelConfig
=
sherpaOnnxOfflineTtsMatchaModelConfig
(),
kokoro
:
SherpaOnnxOfflineTtsKokoroModelConfig
=
sherpaOnnxOfflineTtsKokoroModelConfig
(),
numThreads
:
Int
=
1
,
debug
:
Int
=
0
,
provider
:
String
=
"cpu"
provider
:
String
=
"cpu"
,
kitten
:
SherpaOnnxOfflineTtsKittenModelConfig
=
sherpaOnnxOfflineTtsKittenModelConfig
()
)
->
SherpaOnnxOfflineTtsModelConfig
{
return
SherpaOnnxOfflineTtsModelConfig
(
vits
:
vits
,
...
...
@@ -898,7 +915,8 @@ func sherpaOnnxOfflineTtsModelConfig(
debug
:
Int32
(
debug
),
provider
:
toCPointer
(
provider
),
matcha
:
matcha
,
kokoro
:
kokoro
kokoro
:
kokoro
,
kitten
:
kitten
)
}
...
...
swift-api-examples/run-tts-kitten-en.sh
0 → 100755
查看文件 @
c726f9d
#!/usr/bin/env bash
set
-ex
if
[
! -d ../build-swift-macos
]
;
then
echo
"Please run ../build-swift-macos.sh first!"
exit
1
fi
# please visit
# https://k2-fsa.github.io/sherpa/onnx/tts/pretrained_models/kitten.html
# to download more models
if
[
! -f ./kitten-nano-en-v0_1-fp16/model.fp16.onnx
]
;
then
curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/kitten-nano-en-v0_1-fp16.tar.bz2
tar xf kitten-nano-en-v0_1-fp16.tar.bz2
rm kitten-nano-en-v0_1-fp16.tar.bz2
fi
if
[
! -e ./tts-kitten-en
]
;
then
# Note: We use -lc++ to link against libc++ instead of libstdc++
swiftc
\
-lc++
\
-I ../build-swift-macos/install/include
\
-import-objc-header ./SherpaOnnx-Bridging-Header.h
\
./tts-kitten-en.swift ./SherpaOnnx.swift
\
-L ../build-swift-macos/install/lib/
\
-l sherpa-onnx
\
-l onnxruntime
\
-o tts-kitten-en
strip tts-kitten-en
else
echo
"./tts-kitten-en exists - skip building"
fi
export
DYLD_LIBRARY_PATH
=
$PWD
/../build-swift-macos/install/lib:
$DYLD_LIBRARY_PATH
./tts-kitten-en
...
...
swift-api-examples/tts-kitten-en.swift
0 → 100644
查看文件 @
c726f9d
class
MyClass
{
func
playSamples
(
samples
:
[
Float
])
{
print
(
"Play
\(
samples
.
count
)
samples"
)
}
}
func
run
()
{
let
model
=
"./kitten-nano-en-v0_1-fp16/model.fp16.onnx"
let
voices
=
"./kitten-nano-en-v0_1-fp16/voices.bin"
let
tokens
=
"./kitten-nano-en-v0_1-fp16/tokens.txt"
let
dataDir
=
"./kitten-nano-en-v0_1-fp16/espeak-ng-data"
let
kitten
=
sherpaOnnxOfflineTtsKittenModelConfig
(
model
:
model
,
voices
:
voices
,
tokens
:
tokens
,
dataDir
:
dataDir
)
let
modelConfig
=
sherpaOnnxOfflineTtsModelConfig
(
debug
:
0
,
kitten
:
kitten
)
var
ttsConfig
=
sherpaOnnxOfflineTtsConfig
(
model
:
modelConfig
)
let
myClass
=
MyClass
()
// We use Unretained here so myClass must be kept alive as the callback is invoked
//
// See also
// https://medium.com/codex/swift-c-callback-interoperability-6d57da6c8ee6
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
)
// return 1 so that it continues generating
return
1
}
let
tts
=
SherpaOnnxOfflineTtsWrapper
(
config
:
&
ttsConfig
)
let
text
=
"Friends fell out often because life was changing so fast. The easiest thing in the world was to lose touch with someone."
let
sid
=
0
let
speed
:
Float
=
1.0
let
audio
=
tts
.
generateWithCallbackWithArg
(
text
:
text
,
callback
:
callback
,
arg
:
arg
,
sid
:
sid
,
speed
:
speed
)
let
filename
=
"test-kitten-en.wav"
let
ok
=
audio
.
save
(
filename
:
filename
)
if
ok
==
1
{
print
(
"
\n
Saved to:
\(
filename
)
"
)
}
else
{
print
(
"Failed to save to
\(
filename
)
"
)
}
}
@main
struct
App
{
static
func
main
()
{
run
()
}
}
...
...
请
注册
或
登录
后发表评论