|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- package gogpt
-
- import (
- "bytes"
- "context"
- "fmt"
- "io"
- "mime/multipart"
- "net/http"
- "os"
- )
-
- // Whisper Defines the models provided by OpenAI to use when processing audio with OpenAI.
- const (
- Whisper1 = "whisper-1"
- )
-
- // AudioRequest represents a request structure for audio API.
- type AudioRequest struct {
- Model string
- FilePath string
- }
-
- // AudioResponse represents a response structure for audio API.
- type AudioResponse struct {
- Text string `json:"text"`
- }
-
- // CreateTranscription — API call to create a transcription. Returns transcribed text.
- func (c *Client) CreateTranscription(
- ctx context.Context,
- request AudioRequest,
- ) (response AudioResponse, err error) {
- response, err = c.callAudioAPI(ctx, request, "transcriptions")
- return
- }
-
- // CreateTranslation — API call to translate audio into English.
- func (c *Client) CreateTranslation(
- ctx context.Context,
- request AudioRequest,
- ) (response AudioResponse, err error) {
- response, err = c.callAudioAPI(ctx, request, "translations")
- return
- }
-
- // callAudioAPI — API call to an audio endpoint.
- func (c *Client) callAudioAPI(
- ctx context.Context,
- request AudioRequest,
- endpointSuffix string,
- ) (response AudioResponse, err error) {
- var formBody bytes.Buffer
- w := multipart.NewWriter(&formBody)
-
- if err = audioMultipartForm(request, w); err != nil {
- return
- }
-
- urlSuffix := fmt.Sprintf("/audio/%s", endpointSuffix)
- req, err := http.NewRequestWithContext(ctx, http.MethodPost, c.fullURL(urlSuffix), &formBody)
- if err != nil {
- return
- }
- req.Header.Add("Content-Type", w.FormDataContentType())
-
- err = c.sendRequest(req, &response)
- return
- }
-
- // audioMultipartForm creates a form with audio file contents and the name of the model to use for
- // audio processing.
- func audioMultipartForm(request AudioRequest, w *multipart.Writer) error {
- f, err := os.Open(request.FilePath)
- if err != nil {
- return fmt.Errorf("opening audio file: %w", err)
- }
-
- fw, err := w.CreateFormFile("file", f.Name())
- if err != nil {
- return fmt.Errorf("creating form file: %w", err)
- }
-
- if _, err = io.Copy(fw, f); err != nil {
- return fmt.Errorf("reading from opened audio file: %w", err)
- }
-
- fw, err = w.CreateFormField("model")
- if err != nil {
- return fmt.Errorf("creating form field: %w", err)
- }
-
- modelName := bytes.NewReader([]byte(request.Model))
- if _, err = io.Copy(fw, modelName); err != nil {
- return fmt.Errorf("writing model name: %w", err)
- }
- w.Close()
-
- return nil
- }
|