Skip to content

Commit

Permalink
feat(openaiprovider): implement text-to-speech provider
Browse files Browse the repository at this point in the history
  • Loading branch information
nullswan committed Oct 29, 2024
1 parent 7fb920a commit ed495a7
Showing 1 changed file with 60 additions and 0 deletions.
60 changes: 60 additions & 0 deletions internal/providers/openaiprovider/texttospeech.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package openaiprovider

import (
"context"
"fmt"
"io"

baseprovider "github.com/nullswan/nomi/internal/providers/base"
"github.com/sashabaranov/go-openai"
)

const (
OpenAITextToSpeechDefaultModel = openai.TTSModel1
)

type TextToSpeechProvider struct {
client *openai.Client
}

func NewTextToSpeechProvider(
config oaiProviderConfig,
) (baseprovider.TextToSpeechProvider, error) {
p := &TextToSpeechProvider{
client: openai.NewClient(config.apiKey),
}

return p, nil
}

func (p TextToSpeechProvider) Close() error {
return nil
}

func (p TextToSpeechProvider) GenerateSpeech(
ctx context.Context,
message string,
) ([]byte, error) {
resp, err := p.client.CreateSpeech(ctx, openai.CreateSpeechRequest{
Model: OpenAITextToSpeechDefaultModel,
Voice: openai.VoiceAlloy,
Input: message,
})
if err != nil {
return nil, fmt.Errorf("error creating speech: %w", err)
}

defer resp.Close()

buf, err := io.ReadAll(resp)
if err != nil {
return nil, fmt.Errorf("error reading speech response: %w", err)
}

return buf, nil
}

// For now, we are always using the default model
func (p TextToSpeechProvider) GetModel() string {
return string(OpenAITextToSpeechDefaultModel)
}

0 comments on commit ed495a7

Please sign in to comment.