# Deepgram Provider

Deepgram provides speech-to-text transcription models. The current Go provider
implements the shared `provider.TranscriptionModel` interface and is used
through `ai.Transcribe`.

## Setup

```go
import (
    "context"
    "fmt"
    "log"
    "os"

    "github.com/digitallysavvy/go-ai/pkg/ai"
    "github.com/digitallysavvy/go-ai/pkg/providers/deepgram"
)
```

```go
provider := deepgram.New(deepgram.Config{
    APIKey: os.Getenv("DEEPGRAM_API_KEY"),
})

model, err := provider.TranscriptionModel("nova-2")
if err != nil {
    log.Fatal(err)
}
```

## Transcribe Audio

```go
audioData, err := os.ReadFile("recording.mp3")
if err != nil {
    log.Fatal(err)
}

result, err := ai.Transcribe(context.Background(), ai.TranscribeOptions{
    Model:    model,
    Audio:    audioData,
    MimeType: "audio/mpeg",
    ProviderOptions: map[string]interface{}{
        "deepgram": map[string]interface{}{
            "language": "en",
        },
    },
})
if err != nil {
    log.Fatal(err)
}

fmt.Println(result.Text)
```

## Timestamps

Use Deepgram provider options to request word timing data. The high-level
`ai.Transcribe` result exposes normalized segment fields.

```go
result, err := ai.Transcribe(context.Background(), ai.TranscribeOptions{
    Model:    model,
    Audio:    audioData,
    MimeType: "audio/mpeg",
    ProviderOptions: map[string]interface{}{
        "deepgram": map[string]interface{}{
            "utterances": true,
        },
    },
})
if err != nil {
    log.Fatal(err)
}

for _, segment := range result.Segments {
    fmt.Printf("[%.2f-%.2f] %s\n", segment.StartSecond, segment.EndSecond, segment.Text)
}
```

## Models

Common Deepgram model IDs include:

| Model ID | Best For |
|---|---|
| `nova-2` | General transcription (default when the model ID is empty) |
| `nova-2-phonecall` | Phone audio |
| `nova-2-meeting` | Meetings |
| `enhanced` | General-purpose transcription |
| `base` | Cost-sensitive use cases |

## Speech Synthesis

Deepgram also exposes Aura text-to-speech through `provider.SpeechModel(modelID)`:

```go
speechModel, err := provider.SpeechModel("aura-2-thalia-en")
if err != nil {
    log.Fatal(err)
}

result, err := ai.GenerateSpeech(ctx, ai.GenerateSpeechOptions{
    Model: speechModel,
    Text:  "Hello from Deepgram.",
})
```

Deepgram does not support reranking — `provider.RerankingModel` returns an
error.

## Array Query Options

Deepgram provider options that take a list (e.g. `keywords`) are sent as
comma-joined query values, matching the Deepgram REST API's expected query
string format.

`DEEPGRAM_API_KEY` is read automatically when no API key is passed to
`Config`.

## Workflow Serialization

Deepgram speech and transcription models can cross a workflow boundary
with `provider.SerializeSpeechModel` / `DeserializeSpeechModel` and
`provider.SerializeTranscriptionModel` / `DeserializeTranscriptionModel`. See
[Provider Serialization](https://goaisdk.com/docs/agents/workflow-agent.md#provider-serialization)
for the mechanism.

## See Also

- [API Reference: Transcribe](https://goaisdk.com/docs/reference/ai/transcribe.md)
- [Transcription Guide](https://goaisdk.com/docs/ai-sdk-core/transcription.md)
- [Deepgram Documentation](https://developers.deepgram.com)
