81 lines
2.3 KiB
Go
81 lines
2.3 KiB
Go
package transcriber
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/leonardotrapani/hyprvoice/internal/provider"
|
|
"github.com/leonardotrapani/hyprvoice/internal/recording"
|
|
)
|
|
|
|
// Main transcriber interface
|
|
type Transcriber interface {
|
|
Start(ctx context.Context, frameCh <-chan recording.AudioFrame) (<-chan error, error)
|
|
Stop(ctx context.Context) error
|
|
GetFinalTranscription() (string, error)
|
|
}
|
|
|
|
// BatchAdapter interface for batch transcription backends (collect all audio, transcribe at end)
|
|
type BatchAdapter interface {
|
|
Transcribe(ctx context.Context, audioData []byte) (string, error)
|
|
}
|
|
|
|
// Configuration for the transcriber
|
|
type Config struct {
|
|
Provider string
|
|
APIKey string
|
|
Language string
|
|
Model string
|
|
Keywords []string
|
|
}
|
|
|
|
// NewTranscriber creates a new simple transcriber
|
|
func NewTranscriber(config Config) (Transcriber, error) {
|
|
// Create the appropriate adapter
|
|
var adapter BatchAdapter
|
|
|
|
switch config.Provider {
|
|
case "openai":
|
|
if config.APIKey == "" {
|
|
return nil, fmt.Errorf("OpenAI API key required")
|
|
}
|
|
adapter = NewOpenAIAdapterFromConfig(config)
|
|
|
|
case "groq-transcription":
|
|
if config.APIKey == "" {
|
|
return nil, fmt.Errorf("Groq API key required")
|
|
}
|
|
// use consolidated OpenAI adapter with Groq endpoint
|
|
endpoint := &provider.EndpointConfig{BaseURL: "https://api.groq.com/openai"}
|
|
adapter = NewOpenAIAdapter(endpoint, config.APIKey, config.Model, config.Language, config.Keywords, "groq")
|
|
|
|
case "groq-translation":
|
|
if config.APIKey == "" {
|
|
return nil, fmt.Errorf("Groq API key required")
|
|
}
|
|
adapter = NewGroqTranslationAdapter(config)
|
|
|
|
case "mistral-transcription":
|
|
if config.APIKey == "" {
|
|
return nil, fmt.Errorf("Mistral API key required")
|
|
}
|
|
// use consolidated OpenAI adapter with Mistral endpoint
|
|
endpoint := &provider.EndpointConfig{BaseURL: "https://api.mistral.ai"}
|
|
adapter = NewOpenAIAdapter(endpoint, config.APIKey, config.Model, config.Language, config.Keywords, "mistral")
|
|
|
|
case "elevenlabs":
|
|
if config.APIKey == "" {
|
|
return nil, fmt.Errorf("ElevenLabs API key required")
|
|
}
|
|
adapter = NewElevenLabsAdapterFromConfig(config)
|
|
|
|
default:
|
|
return nil, fmt.Errorf("unsupported provider: %s", config.Provider)
|
|
}
|
|
|
|
// Create simple transcriber that collects all audio
|
|
transcriber := NewSimpleTranscriber(config, adapter)
|
|
|
|
return transcriber, nil
|
|
}
|