39 lines
1.2 KiB
Go
39 lines
1.2 KiB
Go
package provider
|
|
|
|
import (
|
|
"errors"
|
|
"log/slog"
|
|
"strings"
|
|
|
|
"ai-operator/internal/ai"
|
|
"ai-operator/internal/ai/fake"
|
|
realtime "ai-operator/internal/ai/openai/realtime"
|
|
"ai-operator/internal/ai/pipeline"
|
|
"ai-operator/internal/config"
|
|
)
|
|
|
|
func NewVoiceProvider(cfg config.Config, logger *slog.Logger) (ai.VoiceProvider, error) {
|
|
switch strings.TrimSpace(cfg.Voice.Provider) {
|
|
case "", "fake":
|
|
return fake.New(), nil
|
|
case "openai_realtime":
|
|
if cfg.OpenAI.APIKey == "" {
|
|
return nil, errors.New("OPENAI_API_KEY is required for openai_realtime provider")
|
|
}
|
|
return realtime.NewProvider(cfg, logger), nil
|
|
case "pipeline_elevenlabs", "pipeline_elevenlabs_streaming":
|
|
if cfg.Eleven.APIKey == "" {
|
|
return nil, errors.New("ELEVENLABS_API_KEY is required for pipeline_elevenlabs_streaming provider")
|
|
}
|
|
if cfg.Eleven.VoiceIDRU == "" {
|
|
return nil, errors.New("ELEVENLABS_VOICE_ID_RU is required for pipeline_elevenlabs_streaming provider")
|
|
}
|
|
if cfg.OpenAI.APIKey == "" {
|
|
return nil, errors.New("OPENAI_API_KEY is required for pipeline_elevenlabs_streaming provider")
|
|
}
|
|
return pipeline.NewStreamingProvider(cfg, logger), nil
|
|
default:
|
|
return nil, errors.New("unknown voice provider")
|
|
}
|
|
}
|