@@ -6,14 +6,20 @@ import (
6
6
"regexp"
7
7
"strings"
8
8
9
- // Packages
9
+ // Package imports
10
10
"github.com/mutablelogic/go-client/pkg/client"
11
11
"github.com/mutablelogic/go-client/pkg/elevenlabs"
12
-
13
- // Namespace imports
14
- . "github.com/djthorpe/go-errors"
15
12
)
16
13
14
+ /////////////////////////////////////////////////////////////////////
15
+ // TYPES
16
+
17
+ type result struct {
18
+ Path string `json:"path"`
19
+ Bytes int64 `json:"bytes_written"`
20
+ Mime string `json:"mime_type,omitempty"`
21
+ }
22
+
17
23
/////////////////////////////////////////////////////////////////////
18
24
// GLOBALS
19
25
@@ -26,18 +32,10 @@ var (
26
32
27
33
func ElevenlabsFlags (flags * Flags ) {
28
34
flags .String ("elevenlabs-api-key" , "${ELEVENLABS_API_KEY}" , "ElevenLabs API key" )
29
- flags .String ("elevenlabs-voice" , "" , "Voice" )
30
35
}
31
36
32
37
func ElevenlabsRegister (cmd []Client , opts []client.ClientOpt , flags * Flags ) ([]Client , error ) {
33
- // Get API key
34
- key , err := flags .GetString ("elevenlabs-api-key" )
35
- if err != nil {
36
- return nil , err
37
- }
38
-
39
- // Create client
40
- elevenlabs , err := elevenlabs .New (key , opts ... )
38
+ elevenlabs , err := elevenlabs .New (flags .GetString ("elevenlabs-api-key" ), opts ... )
41
39
if err != nil {
42
40
return nil , err
43
41
}
@@ -46,10 +44,9 @@ func ElevenlabsRegister(cmd []Client, opts []client.ClientOpt, flags *Flags) ([]
46
44
cmd = append (cmd , Client {
47
45
ns : "elevenlabs" ,
48
46
cmd : []Command {
49
- {Name : "voices" , Description : "Return registered voices" , MinArgs : 2 , MaxArgs : 2 , Fn : elevenlabsVoices (elevenlabs , flags )},
50
- {Name : "voice" , Description : "Return a voice" , Syntax : "<voice>" , MinArgs : 3 , MaxArgs : 3 , Fn : elevenlabsVoice (elevenlabs , flags )},
51
- {Name : "preview" , Description : "Preview a voice" , Syntax : "<voice>" , MinArgs : 3 , MaxArgs : 3 , Fn : elevenlabsVoicePreview (elevenlabs , flags )},
52
- {Name : "say" , Description : "Text-to-speech" , Syntax : "<voice> <text>" , MinArgs : 3 , MaxArgs : 3 , Fn : elevenlabsTextToSpeech (elevenlabs , flags )},
47
+ {Name : "voices" , Description : "Return registered voices" , MinArgs : 2 , MaxArgs : 2 , Fn : elVoices (elevenlabs , flags )},
48
+ {Name : "voice" , Description : "Return voice information" , Syntax : "<voice-id>" , MinArgs : 3 , MaxArgs : 3 , Fn : elVoice (elevenlabs , flags )},
49
+ {Name : "speak" , Description : "Create speech from a prompt" , Syntax : "<voice> <prompt>" , MinArgs : 4 , MaxArgs : 4 , Fn : elSpeak (elevenlabs , flags )},
53
50
},
54
51
})
55
52
@@ -60,7 +57,7 @@ func ElevenlabsRegister(cmd []Client, opts []client.ClientOpt, flags *Flags) ([]
60
57
/////////////////////////////////////////////////////////////////////
61
58
// API CALL FUNCTIONS
62
59
63
- func elevenlabsVoices (client * elevenlabs.Client , flags * Flags ) CommandFn {
60
+ func elVoices (client * elevenlabs.Client , flags * Flags ) CommandFn {
64
61
return func () error {
65
62
if voices , err := client .Voices (); err != nil {
66
63
return err
@@ -70,55 +67,40 @@ func elevenlabsVoices(client *elevenlabs.Client, flags *Flags) CommandFn {
70
67
}
71
68
}
72
69
73
- func elevenlabsVoice (client * elevenlabs.Client , flags * Flags ) CommandFn {
70
+ func elVoice (client * elevenlabs.Client , flags * Flags ) CommandFn {
74
71
return func () error {
75
- voice , err := elevenlabsGetVoiceId (client , flags .Arg (2 ))
76
- if err != nil {
77
- return err
78
- } else if voice , err := client .Voice (voice ); err != nil {
72
+ if voice , err := client .Voice (flags .Arg (2 )); err != nil {
79
73
return err
80
74
} else {
81
75
return flags .Write (voice )
82
76
}
83
77
}
84
78
}
85
79
86
- func elevenlabsVoicePreview (client * elevenlabs.Client , flags * Flags ) CommandFn {
80
+ func elSpeak (client * elevenlabs.Client , flags * Flags ) CommandFn {
87
81
return func () error {
88
- voice , err := elevenlabsGetVoiceId (client , flags .Arg (2 ))
82
+ voice , err := elGetVoiceId (client , flags .Arg (2 ))
89
83
if err != nil {
90
84
return err
91
- } else if voice , err := client .Voice (voice ); err != nil {
92
- return err
93
- } else if voice .PreviewUrl == "" {
94
- return ErrNotFound .Withf ("%q" , flags .Arg (2 ))
95
- } else {
96
- fmt .Println (voice .PreviewUrl )
97
- return nil
98
85
}
99
- }
100
- }
101
86
102
- func elevenlabsTextToSpeech (client * elevenlabs.Client , flags * Flags ) CommandFn {
103
- return func () error {
104
- // Determine the voice to use
105
- voice , err := flags .GetString ("elevenlabs-voice" )
106
- if err != nil {
107
- return err
108
- } else if voice == "" {
109
- return fmt .Errorf ("missing argument: -elevenlabs-voice" )
110
- }
111
- voice , err = elevenlabsGetVoiceId (client , voice )
87
+ // Set options
88
+ opts := []elevenlabs.Opt {}
89
+
90
+ // Create the audio
91
+ out := flags .GetOutFilename ("speech.mp3" , 0 )
92
+ file , err := os .Create (out )
112
93
if err != nil {
113
94
return err
114
95
}
115
-
116
- data , err := client .TextToSpeech (flags .Arg (2 ), voice )
117
- if err != nil {
96
+ defer file .Close ()
97
+ if n , err := client .TextToSpeech (file , voice , flags .Arg (3 ), opts ... ); err != nil {
118
98
return err
119
- } else if _ , err := os . Stdout . Write (data ); err != nil {
99
+ } else if err := flags . Write (result { Path : out , Bytes : n } ); err != nil {
120
100
return err
121
101
}
102
+
103
+ // Return success
122
104
return nil
123
105
}
124
106
}
@@ -127,7 +109,7 @@ func elevenlabsTextToSpeech(client *elevenlabs.Client, flags *Flags) CommandFn {
127
109
// PRIVATE METHODS
128
110
129
111
// return a voice-id given a parameter, which can be a voice-id or name
130
- func elevenlabsGetVoiceId (client * elevenlabs.Client , voice string ) (string , error ) {
112
+ func elGetVoiceId (client * elevenlabs.Client , voice string ) (string , error ) {
131
113
if reVoiceId .MatchString (voice ) {
132
114
return voice , nil
133
115
} else if voices , err := client .Voices (); err != nil {
@@ -139,5 +121,5 @@ func elevenlabsGetVoiceId(client *elevenlabs.Client, voice string) (string, erro
139
121
}
140
122
}
141
123
}
142
- return "" , ErrNotFound . Withf ( " %q" , voice )
124
+ return "" , fmt . Errorf ( "voice not found: %q" , voice )
143
125
}
0 commit comments