Files
hyprvoice/internal/transcriber/transcriber.go
T

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
}