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
2024-08-05 14:06:21 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Committed by
GitHub
2024-08-05 14:06:21 +0800
Commit
6422966a7fdd8a35c38add141d9c382dce9bc318
6422966a
1 parent
9caa4880
Support passing TTS callback in Swift API (#1218)
显示空白字符变更
内嵌
并排对比
正在显示
2 个修改的文件
包含
54 行增加
和
4 行删除
swift-api-examples/SherpaOnnx.swift
swift-api-examples/tts.swift
swift-api-examples/SherpaOnnx.swift
查看文件 @
6422966
...
...
@@ -757,6 +757,14 @@ class SherpaOnnxGeneratedAudioWrapper {
}
}
typealias
TtsCallbackWithArg
=
(
@convention(c)
(
UnsafePointer
<
Float
>
?,
// const float* samples
Int32
,
// int32_t n
UnsafeMutableRawPointer
?
// void *arg
)
->
Int32
)?
class
SherpaOnnxOfflineTtsWrapper
{
/// A pointer to the underlying counterpart in C
let
tts
:
OpaquePointer
!
...
...
@@ -780,6 +788,17 @@ class SherpaOnnxOfflineTtsWrapper {
return
SherpaOnnxGeneratedAudioWrapper
(
audio
:
audio
)
}
func
generateWithCallbackWithArg
(
text
:
String
,
callback
:
TtsCallbackWithArg
,
arg
:
UnsafeMutableRawPointer
,
sid
:
Int
=
0
,
speed
:
Float
=
1.0
)
->
SherpaOnnxGeneratedAudioWrapper
{
let
audio
:
UnsafePointer
<
SherpaOnnxGeneratedAudio
>
?
=
SherpaOnnxOfflineTtsGenerateWithCallbackWithArg
(
tts
,
toCPointer
(
text
),
Int32
(
sid
),
speed
,
callback
,
arg
)
return
SherpaOnnxGeneratedAudioWrapper
(
audio
:
audio
)
}
}
// spoken language identification
...
...
swift-api-examples/tts.swift
查看文件 @
6422966
class
MyClass
{
func
playSamples
(
samples
:
[
Float
])
{
print
(
"Play
\(
samples
.
count
)
samples"
)
}
}
func
run
()
{
let
model
=
"./vits-piper-en_US-amy-low/en_US-amy-low.onnx"
let
tokens
=
"./vits-piper-en_US-amy-low/tokens.txt"
...
...
@@ -11,6 +17,27 @@ func run() {
let
modelConfig
=
sherpaOnnxOfflineTtsModelConfig
(
vits
:
vits
)
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
=
...
...
@@ -18,11 +45,15 @@ func run() {
let
sid
=
99
let
speed
:
Float
=
1.0
let
audio
=
tts
.
generate
(
text
:
text
,
sid
:
sid
,
speed
:
speed
)
let
audio
=
tts
.
generateWithCallbackWithArg
(
text
:
text
,
callback
:
callback
,
arg
:
arg
,
sid
:
sid
,
speed
:
speed
)
let
filename
=
"test.wav"
audio
.
save
(
filename
:
filename
)
print
(
"
\n
Saved to:
\n\(
filename
)
"
)
let
ok
=
audio
.
save
(
filename
:
filename
)
if
ok
==
1
{
print
(
"
\n
Saved to:
\(
filename
)
"
)
}
else
{
print
(
"Failed to save to
\(
filename
)
"
)
}
}
@main
...
...
请
注册
或
登录
后发表评论