Esta é uma biblioteca cliente Go para a plataforma de clonagem de voz e síntese de voz ElevenLabs. Ele fornece uma interface básica para programas Go interagirem com a API ElevenLabs.
go get github.com/haguro/elevenlabs-go
Certifique-se de substituir "your-api-key"
em todos os exemplos pela sua chave de API real. Consulte a documentação oficial da API Elevenlabs para obter mais detalhes.
A documentação completa desta biblioteca está disponível aqui.
Usar a função NewClient
retorna uma nova instância Client
que permitirá passar um contexto pai, sua chave de API e uma duração de tempo limite.
package main
import (
"context"
"log"
"os"
"time"
"github.com/haguro/elevenlabs-go"
)
func main () {
// Create a new client
client := elevenlabs . NewClient ( context . Background (), "your-api-key" , 30 * time . Second )
// Create a TextToSpeechRequest
ttsReq := elevenlabs. TextToSpeechRequest {
Text : "Hello, world! My name is Adam, nice to meet you!" ,
ModelID : "eleven_monolingual_v1" ,
}
// Call the TextToSpeech method on the client, using the "Adam"'s voice ID.
audio , err := client . TextToSpeech ( "pNInz6obpgDQGcFmaJgB" , ttsReq )
if err != nil {
log . Fatal ( err )
}
// Write the audio file bytes to disk
if err := os . WriteFile ( "adam.mp3" , audio , 0644 ); err != nil {
log . Fatal ( err )
}
log . Println ( "Successfully generated audio file" )
}
A biblioteca possui um cliente padrão que você pode configurar e usar com funções de proxy que agrupam chamadas de método para o cliente padrão. O cliente padrão tem um tempo limite padrão definido para 30 segundos e é configurado com context.Background()
como o contexto pai. Você só precisará definir sua chave de API no mínimo ao aproveitar as vantagens do cliente padrão. Aqui está a versão a do exemplo acima usando apenas funções abreviadas.
package main
import (
"log"
"os"
"time"
el "github.com/haguro/elevenlabs-go"
)
func main () {
// Set your API key
el . SetAPIKey ( "your-api-key" )
// Set a different timeout (optional)
el . SetTimeout ( 15 * time . Second )
// Call the TextToSpeech method on the client, using the "Adam"'s voice ID.
audio , err := el . TextToSpeech ( "pNInz6obpgDQGcFmaJgB" , el. TextToSpeechRequest {
Text : "Hello, world! My name is Adam, nice to meet you!" ,
ModelID : "eleven_monolingual_v1" ,
})
if err != nil {
log . Fatal ( err )
}
// Write the audio file bytes to disk
if err := os . WriteFile ( "adam.mp3" , audio , 0644 ); err != nil {
log . Fatal ( err )
}
log . Println ( "Successfully generated audio file" )
}
A API Elevenlabs permite streaming de áudio "à medida que é gerado". No onzelabs-go, você desejará passar um io.Writer
para o método TextToSpeechStream
para onde o fluxo será copiado continuamente. Observe que você precisará definir o tempo limite do cliente com um valor alto o suficiente para garantir que a solicitação não expire no meio do fluxo .
package main
import (
"context"
"log"
"os/exec"
"time"
"github.com/haguro/elevenlabs-go"
)
func main () {
message := `The concept of "flushing" typically applies to I/O buffers in many programming
languages, which store data temporarily in memory before writing it to a more permanent location
like a file or a network connection. Flushing the buffer means writing all the buffered data
immediately, even if the buffer isn't full.`
// Set your API key
elevenlabs . SetAPIKey ( "your-api-key" )
// Set a large enough timeout to ensure the stream is not interrupted.
elevenlabs . SetTimeout ( 1 * time . Minute )
// We'll use mpv to play the audio from the stream piped to standard input
cmd := exec . CommandContext ( context . Background (), "mpv" , "--no-cache" , "--no-terminal" , "--" , "fd://0" )
// Get a pipe connected to the mpv's standard input
pipe , err := cmd . StdinPipe ()
if err != nil {
log . Fatal ( err )
}
// Attempt to run the command in a separate process
if err := cmd . Start (); err != nil {
log . Fatal ( err )
}
// Stream the audio to the pipe connected to mpv's standard input
if err := elevenlabs . TextToSpeechStream (
pipe ,
"pNInz6obpgDQGcFmaJgB" ,
elevenlabs. TextToSpeechRequest {
Text : message ,
ModelID : "eleven_multilingual_v1" ,
}); err != nil {
log . Fatalf ( "Got %T error: %q n " , err , err )
}
// Close the pipe when all stream has been copied to the pipe
if err := pipe . Close (); err != nil {
log . Fatalf ( "Could not close pipe: %s" , err )
}
log . Print ( "Streaming finished." )
// Wait for mpv to exit. With the pipe closed, it will do that as
// soon as it finishes playing
if err := cmd . Wait (); err != nil {
log . Fatal ( err )
}
log . Print ( "All done." )
}
No momento da redação deste artigo (24 de junho de 2023), a biblioteca fornece ligações Go para 100% dos métodos API da Elevenlabs. Pretendo adicionar mais algumas funções de tipo utilitário caso haja alguma necessidade ou solicitação suficiente para elas.
De acordo com a Elevenlabs, a API ainda é considerada experimental e está sujeita e com probabilidade de alterações.
Contribuições são bem-vindas! Se você tiver alguma ideia, melhoria ou correção de bug, abra um problema ou envie uma solicitação pull.
A biblioteca Python oficial do Elevenlabs é excelente e outros Pythonistas são incentivados a usá-la (e também a dar uma chance ao Go, go?)!
Este é um projeto independente e não é afiliado ou endossado pela Elevenlabs. Elevenlabs e suas marcas registradas são propriedade de seus respectivos proprietários. O objetivo deste projeto é fornecer uma biblioteca cliente para facilitar o acesso à API pública fornecida pelo Elevenlabs nos programas Go. Qualquer uso das marcas registradas da Elevenlabs neste projeto é apenas para fins de identificação e não implica endosso, patrocínio ou afiliação.
Este projeto está licenciado sob a licença MIT.
Esta biblioteca de códigos é fornecida "como está" e sem qualquer garantia. Use por sua conta e risco. Mais detalhes no arquivo LICENSE.