# AssemblyAI Provider

AssemblyAI 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/assemblyai"
)
```

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

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

## Transcribe Audio

Pass local audio bytes to `ai.Transcribe`; the AssemblyAI provider uploads the
audio and polls until the transcript is complete.

```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{}{
        "assemblyai": map[string]interface{}{
            "languageCode": "en",
        },
    },
})
if err != nil {
    log.Fatal(err)
}

fmt.Println(result.Text)
```

You can also provide a URL and let the SDK download it before invoking the
provider:

```go
result, err := ai.Transcribe(context.Background(), ai.TranscribeOptions{
    Model:    model,
    AudioURL: "https://example.com/recording.mp3",
    ProviderOptions: map[string]interface{}{
        "assemblyai": map[string]interface{}{
            "languageCode": "en",
        },
    },
})
```

## Timestamps

AssemblyAI word timings are returned as normalized segments when available.

```go
result, err := ai.Transcribe(context.Background(), ai.TranscribeOptions{
    Model:    model,
    Audio:    audioData,
    MimeType: "audio/mpeg",
    ProviderOptions: map[string]interface{}{
        "assemblyai": map[string]interface{}{
            "speakerLabels": 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

| Model ID | Best For |
|---|---|
| `best` | Highest-accuracy transcription |
| `nano` | Lower-latency transcription |

## Workflow Serialization

AssemblyAI transcription models can cross a workflow boundary with
`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)
- [AssemblyAI Documentation](https://www.assemblyai.com/docs)
