From 38cac375ade314209d7771b81588c98b13df68af Mon Sep 17 00:00:00 2001 From: leonardotrapani Date: Sat, 31 Jan 2026 20:46:36 +0100 Subject: [PATCH] pass keywords to transcription adapters for spelling hints --- internal/config/config.go | 1 + .../transcriber/adapter_groq_transcription.go | 6 ++++++ internal/transcriber/adapter_groq_translation.go | 6 ++++++ internal/transcriber/adapter_openai.go | 6 ++++++ internal/transcriber/transcriber.go | 1 + progress.txt | 15 +++++++++++++++ tasks/prd.jsonc | 2 +- 7 files changed, 36 insertions(+), 1 deletion(-) diff --git a/internal/config/config.go b/internal/config/config.go index ca7ac6f..8cc0a99 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -146,6 +146,7 @@ func (c *Config) ToTranscriberConfig() transcriber.Config { Provider: c.Transcription.Provider, Language: c.Transcription.Language, Model: c.Transcription.Model, + Keywords: c.Keywords, } // Resolve API key: providers map -> legacy transcription.api_key -> environment variable diff --git a/internal/transcriber/adapter_groq_transcription.go b/internal/transcriber/adapter_groq_transcription.go index a164b88..9511ccc 100644 --- a/internal/transcriber/adapter_groq_transcription.go +++ b/internal/transcriber/adapter_groq_transcription.go @@ -5,6 +5,7 @@ import ( "context" "fmt" "log" + "strings" "time" "github.com/sashabaranov/go-openai" @@ -46,6 +47,11 @@ func (a *GroqTranscriptionAdapter) Transcribe(ctx context.Context, audioData []b Language: a.config.Language, } + // Add keywords as prompt to help with spelling hints + if len(a.config.Keywords) > 0 { + req.Prompt = strings.Join(a.config.Keywords, ", ") + } + start := time.Now() resp, err := a.client.CreateTranscription(ctx, req) duration := time.Since(start) diff --git a/internal/transcriber/adapter_groq_translation.go b/internal/transcriber/adapter_groq_translation.go index 5842a1b..05afc9f 100644 --- a/internal/transcriber/adapter_groq_translation.go +++ b/internal/transcriber/adapter_groq_translation.go @@ -5,6 +5,7 @@ import ( "context" "fmt" "log" + "strings" "time" "github.com/sashabaranov/go-openai" @@ -49,6 +50,11 @@ func (a *GroqTranslationAdapter) Transcribe(ctx context.Context, audioData []byt Language: a.config.Language, // Source language hint } + // Add keywords as prompt to help with spelling hints + if len(a.config.Keywords) > 0 { + req.Prompt = strings.Join(a.config.Keywords, ", ") + } + start := time.Now() resp, err := a.client.CreateTranslation(ctx, req) duration := time.Since(start) diff --git a/internal/transcriber/adapter_openai.go b/internal/transcriber/adapter_openai.go index 53fc5ae..68622c0 100644 --- a/internal/transcriber/adapter_openai.go +++ b/internal/transcriber/adapter_openai.go @@ -5,6 +5,7 @@ import ( "context" "fmt" "log" + "strings" "time" "github.com/sashabaranov/go-openai" @@ -43,6 +44,11 @@ func (a *OpenAIAdapter) Transcribe(ctx context.Context, audioData []byte) (strin Language: a.config.Language, } + // Add keywords as initial_prompt to help with spelling hints + if len(a.config.Keywords) > 0 { + req.Prompt = strings.Join(a.config.Keywords, ", ") + } + start := time.Now() resp, err := a.client.CreateTranscription(ctx, req) duration := time.Since(start) diff --git a/internal/transcriber/transcriber.go b/internal/transcriber/transcriber.go index 1dcfecb..55428bb 100644 --- a/internal/transcriber/transcriber.go +++ b/internal/transcriber/transcriber.go @@ -25,6 +25,7 @@ type Config struct { APIKey string Language string Model string + Keywords []string } // NewTranscriber creates a new simple transcriber diff --git a/progress.txt b/progress.txt index 0d24c62..05e2f88 100644 --- a/progress.txt +++ b/progress.txt @@ -78,3 +78,18 @@ Key decisions: - LLM processing happens between transcription and injection - Adapter creation and processing errors are logged but don't fail the pipeline - Sets status to Processing during LLM phase, then back to Injecting + +## Task 5: Pass keywords to transcription adapters - COMPLETE + +Added Keywords support to transcription adapters: +- Added `Keywords []string` to transcriber.Config struct +- Updated `ToTranscriberConfig()` to pass keywords from config +- OpenAI adapter uses keywords in `Prompt` field (initial_prompt parameter) +- Groq transcription adapter uses keywords in `Prompt` field +- Groq translation adapter uses keywords in `Prompt` field +- Mistral and ElevenLabs adapters ignore keywords (APIs don't support initial_prompt) + +Key decisions: +- Keywords joined with ", " to form a single string for the Prompt field +- Whisper uses this as "initial_prompt" to help with spelling/terminology +- Only added to adapters that clearly support it (OpenAI/Groq via go-openai lib) diff --git a/tasks/prd.jsonc b/tasks/prd.jsonc index 276a8f4..4fac459 100644 --- a/tasks/prd.jsonc +++ b/tasks/prd.jsonc @@ -101,7 +101,7 @@ "Non-supporting transcribers still work", "Typecheck passes" ], - "passes": false + "passes": true }, { "title": "Add TUI dependencies and base components",