@@ -3,15 +3,16 @@ package main
3
3
import (
4
4
"bytes"
5
5
"context"
6
+ "errors"
6
7
"fmt"
7
8
"io"
8
9
"regexp"
9
10
"strings"
10
11
11
12
// Packages
12
13
tablewriter "github.com/djthorpe/go-tablewriter"
13
- "github.com/go-audio/audio"
14
- "github.com/go-audio/wav"
14
+ audio "github.com/go-audio/audio"
15
+ wav "github.com/go-audio/wav"
15
16
client "github.com/mutablelogic/go-client"
16
17
elevenlabs "github.com/mutablelogic/go-client/pkg/elevenlabs"
17
18
@@ -23,12 +24,16 @@ import (
23
24
// GLOBALS
24
25
25
26
var (
26
- elName = "elevenlabs"
27
- elClient * elevenlabs.Client
28
- elExt = "mp3"
29
- elBitrate = uint64 (32 ) // in kbps
30
- elSamplerate = uint64 (44100 ) // in Hz
31
- reVoiceId = regexp .MustCompile ("^[a-z0-9-]{20}$" )
27
+ elName = "elevenlabs"
28
+ elClient * elevenlabs.Client
29
+ elExt = "mp3"
30
+ elBitrate = uint64 (32 ) // in kbps
31
+ elSamplerate = uint64 (44100 ) // in Hz
32
+ elSimilarityBoost = float64 (0.0 )
33
+ elStability = float64 (0.0 )
34
+ elUseSpeakerBoost = false
35
+ elWriteSettings = false
36
+ reVoiceId = regexp .MustCompile ("^[a-z0-9-]{20}$" )
32
37
)
33
38
34
39
///////////////////////////////////////////////////////////////////////////////
@@ -51,8 +56,7 @@ func elRegister(flags *Flags) {
51
56
Fn : []Fn {
52
57
{Name : "voices" , Call : elVoices , Description : "Return registered voices" },
53
58
{Name : "voice" , Call : elVoice , Description : "Return one voice" , MinArgs : 1 , MaxArgs : 1 , Syntax : "<voice-id>" },
54
- {Name : "settings" , Call : elGetVoiceSettings , Description : "Return voice settings, or default settings" , MaxArgs : 1 , Syntax : "(<voice-id>)" },
55
- {Name : "set" , Call : elSetVoiceSettings , Description : "Set voice settings from -stability, -similarity-boost and -use-speaker-boost flags" , MinArgs : 1 , MaxArgs : 1 , Syntax : "<voice-id>" },
59
+ {Name : "settings" , Call : elVoiceSettings , Description : "Return voice settings, or default settings. Set voice settings from -stability, -similarity-boost and -use-speaker-boost flags" , MaxArgs : 1 , Syntax : "(<voice-id>)" },
56
60
{Name : "say" , Call : elTextToSpeech , Description : "Text to speech" , MinArgs : 2 , Syntax : "<voice-id> <text>..." },
57
61
},
58
62
})
@@ -86,6 +90,30 @@ func elParse(flags *Flags, opts ...client.ClientOpt) error {
86
90
}
87
91
}
88
92
93
+ // Similarity boost
94
+ if value , err := flags .GetValue ("similarity-boost" ); err == nil {
95
+ elSimilarityBoost = value .(float64 )
96
+ elWriteSettings = true
97
+ } else if ! errors .Is (err , ErrNotFound ) {
98
+ return err
99
+ }
100
+
101
+ // Stability
102
+ if value , err := flags .GetValue ("stability" ); err == nil {
103
+ elStability = value .(float64 )
104
+ elWriteSettings = true
105
+ } else if ! errors .Is (err , ErrNotFound ) {
106
+ return err
107
+ }
108
+
109
+ // Use speaker boost
110
+ if value , err := flags .GetValue ("use-speaker-boost" ); err == nil {
111
+ elUseSpeakerBoost = value .(bool )
112
+ elWriteSettings = true
113
+ } else if ! errors .Is (err , ErrNotFound ) {
114
+ return err
115
+ }
116
+
89
117
// Return success
90
118
return nil
91
119
}
@@ -111,23 +139,7 @@ func elVoice(ctx context.Context, w *tablewriter.Writer, args []string) error {
111
139
}
112
140
}
113
141
114
- func elGetVoiceSettings (ctx context.Context , w * tablewriter.Writer , args []string ) error {
115
- var voice string
116
- if len (args ) > 0 {
117
- if v , err := elVoiceId (args [0 ]); err != nil {
118
- return err
119
- } else {
120
- voice = v
121
- }
122
- }
123
- if voice , err := elClient .VoiceSettings (voice ); err != nil {
124
- return err
125
- } else {
126
- return w .Write (voice )
127
- }
128
- }
129
-
130
- func elSetVoiceSettings (ctx context.Context , w * tablewriter.Writer , args []string ) error {
142
+ func elVoiceSettings (ctx context.Context , w * tablewriter.Writer , args []string ) error {
131
143
var voice string
132
144
if len (args ) > 0 {
133
145
if v , err := elVoiceId (args [0 ]); err != nil {
@@ -143,15 +155,31 @@ func elSetVoiceSettings(ctx context.Context, w *tablewriter.Writer, args []strin
143
155
return err
144
156
}
145
157
146
- // TODO: Modify settings
147
- fmt .Println ("TODO: elSetVoiceSettings: Modify settings" )
158
+ // Modify settings
159
+ if elWriteSettings {
160
+ // We need a voice in order to write the settings
161
+ if voice == "" {
162
+ return ErrBadParameter .With ("Missing voice-id" )
163
+ }
148
164
149
- // Set voice settings
150
- if err := elClient .SetVoiceSettings (voice , settings ); err != nil {
151
- return err
152
- } else {
153
- return w .Write (settings )
165
+ // Change parameters
166
+ if elStability != 0.0 {
167
+ settings .Stability = float32 (elStability )
168
+ }
169
+ if elSimilarityBoost != 0.0 {
170
+ settings .SimilarityBoost = float32 (elSimilarityBoost )
171
+ }
172
+ if elUseSpeakerBoost != settings .UseSpeakerBoost {
173
+ settings .UseSpeakerBoost = elUseSpeakerBoost
174
+ }
175
+
176
+ // Set voice settings
177
+ if err := elClient .SetVoiceSettings (voice , settings ); err != nil {
178
+ return err
179
+ }
154
180
}
181
+
182
+ return w .Write (settings )
155
183
}
156
184
157
185
func elTextToSpeech (ctx context.Context , w * tablewriter.Writer , args []string ) error {
@@ -225,14 +253,14 @@ func elOutputFormat() elevenlabs.Opt {
225
253
/////////////////////////////////////////////////////////////////////
226
254
// AUDIO WRITER
227
255
228
- type audioWriter struct {
256
+ type wavWriter struct {
229
257
enc * wav.Encoder
230
258
buf * bytes.Buffer
231
259
pcm * audio.IntBuffer
232
260
}
233
261
234
- func NewAudioWriter (w io.WriteSeeker , sampleRate , channels int ) * audioWriter {
235
- this := new (audioWriter )
262
+ func NewAudioWriter (w io.WriteSeeker , sampleRate , channels int ) * wavWriter {
263
+ this := new (wavWriter )
236
264
237
265
// Create a WAV encoder
238
266
this .enc = wav .NewEncoder (w , sampleRate , 16 , channels , 1 )
@@ -257,7 +285,7 @@ func NewAudioWriter(w io.WriteSeeker, sampleRate, channels int) *audioWriter {
257
285
return this
258
286
}
259
287
260
- func (a * audioWriter ) Write (data []byte ) (int , error ) {
288
+ func (a * wavWriter ) Write (data []byte ) (int , error ) {
261
289
// Write the data to the buffer
262
290
if n , err := a .buf .Write (data ); err != nil {
263
291
return 0 , err
@@ -268,7 +296,7 @@ func (a *audioWriter) Write(data []byte) (int, error) {
268
296
}
269
297
}
270
298
271
- func (a * audioWriter ) Flush () error {
299
+ func (a * wavWriter ) Flush () error {
272
300
var n int
273
301
var sample [2 ]byte
274
302
@@ -301,7 +329,7 @@ func (a *audioWriter) Flush() error {
301
329
return nil
302
330
}
303
331
304
- func (a * audioWriter ) Close () error {
332
+ func (a * wavWriter ) Close () error {
305
333
if err := a .Flush (); err != nil {
306
334
return err
307
335
}
0 commit comments