Skip to content

Commit 32a7a75

Browse files
committed
Updated for setting modification
1 parent 51c181f commit 32a7a75

File tree

3 files changed

+84
-51
lines changed

3 files changed

+84
-51
lines changed

cmd/api/elevenlabs.go

Lines changed: 68 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@ package main
33
import (
44
"bytes"
55
"context"
6+
"errors"
67
"fmt"
78
"io"
89
"regexp"
910
"strings"
1011

1112
// Packages
1213
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"
1516
client "github.com/mutablelogic/go-client"
1617
elevenlabs "github.com/mutablelogic/go-client/pkg/elevenlabs"
1718

@@ -23,12 +24,16 @@ import (
2324
// GLOBALS
2425

2526
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}$")
3237
)
3338

3439
///////////////////////////////////////////////////////////////////////////////
@@ -51,8 +56,7 @@ func elRegister(flags *Flags) {
5156
Fn: []Fn{
5257
{Name: "voices", Call: elVoices, Description: "Return registered voices"},
5358
{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>)"},
5660
{Name: "say", Call: elTextToSpeech, Description: "Text to speech", MinArgs: 2, Syntax: "<voice-id> <text>..."},
5761
},
5862
})
@@ -86,6 +90,30 @@ func elParse(flags *Flags, opts ...client.ClientOpt) error {
8690
}
8791
}
8892

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+
89117
// Return success
90118
return nil
91119
}
@@ -111,23 +139,7 @@ func elVoice(ctx context.Context, w *tablewriter.Writer, args []string) error {
111139
}
112140
}
113141

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 {
131143
var voice string
132144
if len(args) > 0 {
133145
if v, err := elVoiceId(args[0]); err != nil {
@@ -143,15 +155,31 @@ func elSetVoiceSettings(ctx context.Context, w *tablewriter.Writer, args []strin
143155
return err
144156
}
145157

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+
}
148164

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+
}
154180
}
181+
182+
return w.Write(settings)
155183
}
156184

157185
func elTextToSpeech(ctx context.Context, w *tablewriter.Writer, args []string) error {
@@ -225,14 +253,14 @@ func elOutputFormat() elevenlabs.Opt {
225253
/////////////////////////////////////////////////////////////////////
226254
// AUDIO WRITER
227255

228-
type audioWriter struct {
256+
type wavWriter struct {
229257
enc *wav.Encoder
230258
buf *bytes.Buffer
231259
pcm *audio.IntBuffer
232260
}
233261

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)
236264

237265
// Create a WAV encoder
238266
this.enc = wav.NewEncoder(w, sampleRate, 16, channels, 1)
@@ -257,7 +285,7 @@ func NewAudioWriter(w io.WriteSeeker, sampleRate, channels int) *audioWriter {
257285
return this
258286
}
259287

260-
func (a *audioWriter) Write(data []byte) (int, error) {
288+
func (a *wavWriter) Write(data []byte) (int, error) {
261289
// Write the data to the buffer
262290
if n, err := a.buf.Write(data); err != nil {
263291
return 0, err
@@ -268,7 +296,7 @@ func (a *audioWriter) Write(data []byte) (int, error) {
268296
}
269297
}
270298

271-
func (a *audioWriter) Flush() error {
299+
func (a *wavWriter) Flush() error {
272300
var n int
273301
var sample [2]byte
274302

@@ -301,7 +329,7 @@ func (a *audioWriter) Flush() error {
301329
return nil
302330
}
303331

304-
func (a *audioWriter) Close() error {
332+
func (a *wavWriter) Close() error {
305333
if err := a.Flush(); err != nil {
306334
return err
307335
}

cmd/api/flags.go

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ func (flags *Flags) Parse(args []string) (*Fn, []string, error) {
135135
// Print usage
136136
if err != nil {
137137
if err != flag.ErrHelp {
138-
fmt.Fprintf(os.Stderr, "%v: %v\n", flags.cmd.Name, err)
138+
// TODO: Do nothing
139139
} else {
140140
flags.PrintUsage()
141141
}
@@ -179,11 +179,18 @@ func (flags *Flags) Parse(args []string) (*Fn, []string, error) {
179179
}
180180

181181
// Get returns the value of a flag, and returns true if the flag exists
182+
// and has been changed from the default
182183
func (flags *Flags) Get(name string) (string, bool) {
184+
var visited bool
185+
flags.Visit(func(f *flag.Flag) {
186+
if f.Name == name {
187+
visited = true
188+
}
189+
})
183190
if value := flags.FlagSet.Lookup(name); value == nil {
184191
return "", false
185192
} else {
186-
return value.Value.String(), true
193+
return value.Value.String(), visited
187194
}
188195
}
189196

@@ -426,17 +433,15 @@ func (flags *Flags) GetBool(name string) bool {
426433
// GetString returns a flag value as a string, and expands
427434
// any environment variables in the returned value
428435
func (flags *Flags) GetString(name string) string {
429-
if value, exists := flags.Get(name); !exists {
430-
return ""
431-
} else {
432-
return os.ExpandEnv(value)
433-
}
436+
value, _ := flags.Get(name)
437+
return os.ExpandEnv(value)
434438
}
435439

436-
// GetValue returns a flag value
440+
// GetValue returns a flag value, if it has been changed from the default
441+
// value
437442
func (flags *Flags) GetValue(name string) (any, error) {
438-
value, exists := flags.Get(name)
439-
if !exists {
443+
value, visited := flags.Get(name)
444+
if !visited {
440445
return nil, ErrNotFound.With(name)
441446
} else {
442447
value = os.ExpandEnv(value)

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ require (
88
github.com/andreburgaud/crypt2go v1.5.0
99
github.com/djthorpe/go-errors v1.0.3
1010
github.com/djthorpe/go-tablewriter v0.0.6
11+
github.com/go-audio/audio v1.0.0
1112
github.com/go-audio/wav v1.1.0
1213
github.com/pkg/errors v0.9.1
1314
github.com/stretchr/testify v1.9.0
@@ -19,7 +20,6 @@ require (
1920

2021
require (
2122
github.com/davecgh/go-spew v1.1.1 // indirect
22-
github.com/go-audio/audio v1.0.0 // indirect
2323
github.com/go-audio/riff v1.0.0 // indirect
2424
github.com/mattn/go-runewidth v0.0.15 // indirect
2525
github.com/pmezard/go-difflib v1.0.0 // indirect

0 commit comments

Comments
 (0)