refactor elevenlabs adapter to use EndpointConfig
This commit is contained in:
@@ -10,12 +10,18 @@ import (
|
||||
"mime/multipart"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/leonardotrapani/hyprvoice/internal/language"
|
||||
"github.com/leonardotrapani/hyprvoice/internal/provider"
|
||||
)
|
||||
|
||||
// ElevenLabsAdapter implements BatchAdapter for ElevenLabs Scribe API
|
||||
type ElevenLabsAdapter struct {
|
||||
client *http.Client
|
||||
config Config
|
||||
client *http.Client
|
||||
endpoint *provider.EndpointConfig
|
||||
apiKey string
|
||||
model string
|
||||
language string
|
||||
}
|
||||
|
||||
// ElevenLabsResponse represents the API response
|
||||
@@ -23,14 +29,32 @@ type ElevenLabsResponse struct {
|
||||
Text string `json:"text"`
|
||||
}
|
||||
|
||||
// NewElevenLabsAdapter creates a new ElevenLabs adapter
|
||||
func NewElevenLabsAdapter(config Config) *ElevenLabsAdapter {
|
||||
// NewElevenLabsAdapter creates an adapter for ElevenLabs Scribe API
|
||||
// endpoint: the endpoint config (BaseURL + Path)
|
||||
// apiKey: ElevenLabs API key
|
||||
// model: model ID (e.g., "scribe_v1")
|
||||
// lang: canonical language code (will be converted to provider format)
|
||||
func NewElevenLabsAdapter(endpoint *provider.EndpointConfig, apiKey, model, lang string) *ElevenLabsAdapter {
|
||||
return &ElevenLabsAdapter{
|
||||
client: &http.Client{Timeout: 30 * time.Second},
|
||||
config: config,
|
||||
client: &http.Client{Timeout: 30 * time.Second},
|
||||
endpoint: endpoint,
|
||||
apiKey: apiKey,
|
||||
model: model,
|
||||
language: lang,
|
||||
}
|
||||
}
|
||||
|
||||
// NewElevenLabsAdapterFromConfig creates an adapter using the legacy Config struct
|
||||
// for backwards compatibility during migration
|
||||
func NewElevenLabsAdapterFromConfig(config Config) *ElevenLabsAdapter {
|
||||
return NewElevenLabsAdapter(
|
||||
&provider.EndpointConfig{BaseURL: "https://api.elevenlabs.io", Path: "/v1/speech-to-text"},
|
||||
config.APIKey,
|
||||
config.Model,
|
||||
config.Language,
|
||||
)
|
||||
}
|
||||
|
||||
// Transcribe sends audio to ElevenLabs API for transcription
|
||||
func (a *ElevenLabsAdapter) Transcribe(ctx context.Context, audioData []byte) (string, error) {
|
||||
if len(audioData) == 0 {
|
||||
@@ -57,13 +81,14 @@ func (a *ElevenLabsAdapter) Transcribe(ctx context.Context, audioData []byte) (s
|
||||
}
|
||||
|
||||
// Add model_id
|
||||
if err := writer.WriteField("model_id", a.config.Model); err != nil {
|
||||
if err := writer.WriteField("model_id", a.model); err != nil {
|
||||
return "", fmt.Errorf("write model_id: %w", err)
|
||||
}
|
||||
|
||||
// Add language_code if specified
|
||||
if a.config.Language != "" {
|
||||
if err := writer.WriteField("language_code", a.config.Language); err != nil {
|
||||
// Add language_code if specified (convert to provider format)
|
||||
providerLang := language.ToProviderFormat(a.language, "elevenlabs")
|
||||
if providerLang != "" {
|
||||
if err := writer.WriteField("language_code", providerLang); err != nil {
|
||||
return "", fmt.Errorf("write language_code: %w", err)
|
||||
}
|
||||
}
|
||||
@@ -72,15 +97,15 @@ func (a *ElevenLabsAdapter) Transcribe(ctx context.Context, audioData []byte) (s
|
||||
return "", fmt.Errorf("close writer: %w", err)
|
||||
}
|
||||
|
||||
// Create HTTP request
|
||||
url := "https://api.elevenlabs.io/v1/speech-to-text"
|
||||
// Create HTTP request using endpoint config
|
||||
url := a.endpoint.BaseURL + a.endpoint.Path
|
||||
req, err := http.NewRequestWithContext(ctx, "POST", url, &body)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("create request: %w", err)
|
||||
}
|
||||
|
||||
req.Header.Set("Content-Type", writer.FormDataContentType())
|
||||
req.Header.Set("xi-api-key", a.config.APIKey)
|
||||
req.Header.Set("xi-api-key", a.apiKey)
|
||||
|
||||
start := time.Now()
|
||||
resp, err := a.client.Do(req)
|
||||
|
||||
Reference in New Issue
Block a user