From 2808940875a26e0cc20b4f559b35fce9eaa37e30 Mon Sep 17 00:00:00 2001 From: Alexandre E Souza Date: Tue, 19 Mar 2024 15:41:49 -0300 Subject: [PATCH 01/11] llms: Wisper model --- llms/openai/internal/openaiclient/wisper.go | 64 +++++++++++++++++++++ llms/openai/openaillm_option.go | 9 +++ 2 files changed, 73 insertions(+) create mode 100644 llms/openai/internal/openaiclient/wisper.go diff --git a/llms/openai/internal/openaiclient/wisper.go b/llms/openai/internal/openaiclient/wisper.go new file mode 100644 index 000000000..a54e0eba2 --- /dev/null +++ b/llms/openai/internal/openaiclient/wisper.go @@ -0,0 +1,64 @@ +package openaiclient + +import ( + "bytes" + "context" + "io" + "io/ioutil" + "mime/multipart" + "net/http" + "os" + "path/filepath" +) + +func (c *Client) uploadAudioAndGetTranscription(ctx context.Context, audioFilePath, model, responseFormat, language string, temperature string) ([]byte, error) { + + payload := &bytes.Buffer{} + writer := multipart.NewWriter(payload) + file, errFile1 := os.Open(audioFilePath) + + if errFile1 != nil { + return nil, errFile1 + } + + defer file.Close() + + part1, errFile1 := writer.CreateFormFile("file", filepath.Base(audioFilePath)) + if errFile1 != nil { + return nil, errFile1 + } + _, errFile1 = io.Copy(part1, file) + if errFile1 != nil { + return nil, errFile1 + } + + _ = writer.WriteField("model", c.Model) + _ = writer.WriteField("response_format", "json") + _ = writer.WriteField("temperature", temperature) + _ = writer.WriteField("language", language) + err := writer.Close() + if err != nil { + return nil, err + } + + client := &http.Client{} + req, err := http.NewRequestWithContext(ctx, http.MethodPost, c.buildURL("/audio/transcriptions", c.Model), payload) + + if err != nil { + return nil, err + } + req.Header.Add("Accept", "application/json") + + req.Header.Set("Content-Type", writer.FormDataContentType()) + res, err := client.Do(req) + if err != nil { + return nil, err + } + defer res.Body.Close() + + body, err := ioutil.ReadAll(res.Body) + if err != nil { + return nil, err + } + return body, nil +} diff --git a/llms/openai/openaillm_option.go b/llms/openai/openaillm_option.go index d005e80fe..005cf6fe8 100644 --- a/llms/openai/openaillm_option.go +++ b/llms/openai/openaillm_option.go @@ -40,6 +40,8 @@ type options struct { embeddingModel string callbackHandler callbacks.Handler + // required when use wisper + language string } // Option is a functional option for the OpenAI client. @@ -128,3 +130,10 @@ func WithResponseFormat(responseFormat ResponseFormat) Option { opts.responseFormat = responseFormat } } + +// WithLanguage allows setting a custom language. +func WithLanguage(language string) Option { + return func(opts *options) { + opts.language = language + } +} From 388d7c7452629df6e6e019bb832f407265766777 Mon Sep 17 00:00:00 2001 From: Alexandre E Souza Date: Wed, 20 Mar 2024 01:06:09 -0300 Subject: [PATCH 02/11] llms: Wisper model --- .../internal/openaiclient/openaiclient.go | 15 ++++++++++- llms/openai/internal/openaiclient/wisper.go | 24 +++++++++++++----- llms/openai/llm.go | 3 ++- llms/openai/multicontent_test.go | 15 ++++++++++- llms/openai/openaillm.go | 9 +++++++ llms/openai/sample.mp3 | Bin 0 -> 140166 bytes 6 files changed, 56 insertions(+), 10 deletions(-) create mode 100644 llms/openai/sample.mp3 diff --git a/llms/openai/internal/openaiclient/openaiclient.go b/llms/openai/internal/openaiclient/openaiclient.go index c50bed9da..29af707da 100644 --- a/llms/openai/internal/openaiclient/openaiclient.go +++ b/llms/openai/internal/openaiclient/openaiclient.go @@ -36,6 +36,7 @@ type Client struct { // required when APIType is APITypeAzure or APITypeAzureAD apiVersion string embeddingsModel string + language string } // Option is an option for the OpenAI client. @@ -48,7 +49,7 @@ type Doer interface { // New returns a new OpenAI client. func New(token string, model string, baseURL string, organization string, - apiType APIType, apiVersion string, httpClient Doer, embeddingsModel string, + apiType APIType, apiVersion string, httpClient Doer, embeddingsModel string, language string, opts ...Option, ) (*Client, error) { c := &Client{ @@ -60,6 +61,7 @@ func New(token string, model string, baseURL string, organization string, apiType: apiType, apiVersion: apiVersion, httpClient: httpClient, + language: language, } for _, opt := range opts { @@ -144,6 +146,17 @@ func (c *Client) CreateChat(ctx context.Context, r *ChatRequest) (*ChatResponse, return resp, nil } +// Transcription with audio file +func (c *Client) Transcription(ctx context.Context, audioFilePath string, temperature float64) ([]byte, error) { + + res, err := c.uploadAudioAndGetTranscription(ctx, audioFilePath, c.language, temperature) + if err != nil { + return nil, err + } + + return res, nil +} + func IsAzure(apiType APIType) bool { return apiType == APITypeAzure || apiType == APITypeAzureAD } diff --git a/llms/openai/internal/openaiclient/wisper.go b/llms/openai/internal/openaiclient/wisper.go index a54e0eba2..fdd850df9 100644 --- a/llms/openai/internal/openaiclient/wisper.go +++ b/llms/openai/internal/openaiclient/wisper.go @@ -3,15 +3,20 @@ package openaiclient import ( "bytes" "context" + "encoding/json" + "fmt" "io" - "io/ioutil" "mime/multipart" "net/http" "os" "path/filepath" ) -func (c *Client) uploadAudioAndGetTranscription(ctx context.Context, audioFilePath, model, responseFormat, language string, temperature string) ([]byte, error) { +type TranscribeAudioResponse struct { + Text string `json:"text"` +} + +func (c *Client) uploadAudioAndGetTranscription(ctx context.Context, audioFilePath, language string, temperature float64) ([]byte, error) { payload := &bytes.Buffer{} writer := multipart.NewWriter(payload) @@ -34,7 +39,7 @@ func (c *Client) uploadAudioAndGetTranscription(ctx context.Context, audioFilePa _ = writer.WriteField("model", c.Model) _ = writer.WriteField("response_format", "json") - _ = writer.WriteField("temperature", temperature) + _ = writer.WriteField("temperature", fmt.Sprintf("%f", temperature)) _ = writer.WriteField("language", language) err := writer.Close() if err != nil { @@ -42,12 +47,12 @@ func (c *Client) uploadAudioAndGetTranscription(ctx context.Context, audioFilePa } client := &http.Client{} - req, err := http.NewRequestWithContext(ctx, http.MethodPost, c.buildURL("/audio/transcriptions", c.Model), payload) + req, err := http.NewRequestWithContext(ctx, http.MethodPost, "https://api.openai.com/v1/audio/transcriptions", payload) if err != nil { return nil, err } - req.Header.Add("Accept", "application/json") + c.setHeaders(req) req.Header.Set("Content-Type", writer.FormDataContentType()) res, err := client.Do(req) @@ -56,9 +61,14 @@ func (c *Client) uploadAudioAndGetTranscription(ctx context.Context, audioFilePa } defer res.Body.Close() - body, err := ioutil.ReadAll(res.Body) + body, err := io.ReadAll(res.Body) + if err != nil { + return nil, err + } + var transcriptionResponse TranscribeAudioResponse + err = json.Unmarshal(body, &transcriptionResponse) if err != nil { return nil, err } - return body, nil + return []byte(transcriptionResponse.Text), nil } diff --git a/llms/openai/llm.go b/llms/openai/llm.go index 38352f4af..0ac42c420 100644 --- a/llms/openai/llm.go +++ b/llms/openai/llm.go @@ -25,6 +25,7 @@ func newClient(opts ...Option) (*options, *openaiclient.Client, error) { organization: os.Getenv(organizationEnvVarName), apiType: APIType(openaiclient.APITypeOpenAI), httpClient: http.DefaultClient, + language: "en", } for _, opt := range opts { @@ -44,7 +45,7 @@ func newClient(opts ...Option) (*options, *openaiclient.Client, error) { } cli, err := openaiclient.New(options.token, options.model, options.baseURL, options.organization, - openaiclient.APIType(options.apiType), options.apiVersion, options.httpClient, options.embeddingModel) + openaiclient.APIType(options.apiType), options.apiVersion, options.httpClient, options.embeddingModel, options.language) return options, cli, err } diff --git a/llms/openai/multicontent_test.go b/llms/openai/multicontent_test.go index 7dccb94ce..adb425826 100644 --- a/llms/openai/multicontent_test.go +++ b/llms/openai/multicontent_test.go @@ -13,7 +13,7 @@ import ( "github.com/tmc/langchaingo/schema" ) -func newTestClient(t *testing.T, opts ...Option) llms.Model { +func newTestClient(t *testing.T, opts ...Option) *LLM { t.Helper() if openaiKey := os.Getenv("OPENAI_API_KEY"); openaiKey == "" { t.Skip("OPENAI_API_KEY not set") @@ -162,6 +162,19 @@ func TestFunctionCall(t *testing.T) { assert.NotNil(t, c1.FuncCall) } +func TestTranscription(t *testing.T) { + t.Parallel() + llm := newTestClient(t, WithModel("whisper-1")) + + audioFilePath := "./sample.mp3" + _, err := os.Stat(audioFilePath) + require.NoError(t, err) + + rsp, err := llm.TranscribeAudio(context.Background(), audioFilePath) + require.NoError(t, err) + + assert.NotEmpty(t, rsp) +} func showResponse(rsp any) string { //nolint:golint,unused b, err := json.MarshalIndent(rsp, "", " ") if err != nil { diff --git a/llms/openai/openaillm.go b/llms/openai/openaillm.go index d4bcaf5b3..acae50c94 100644 --- a/llms/openai/openaillm.go +++ b/llms/openai/openaillm.go @@ -150,3 +150,12 @@ func (o *LLM) CreateEmbedding(ctx context.Context, inputTexts []string) ([][]flo } return embeddings, nil } + +// Transcription with audio file +func (o *LLM) TranscribeAudio(ctx context.Context, audioFilePath string, options ...llms.CallOption) ([]byte, error) { + opts := llms.CallOptions{} + for _, opt := range options { + opt(&opts) + } + return o.client.Transcription(ctx, audioFilePath, opts.Temperature) +} diff --git a/llms/openai/sample.mp3 b/llms/openai/sample.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..f99b816f7f68cdc60159f53f067f041a4015acf3 GIT binary patch literal 140166 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�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 Date: Wed, 20 Mar 2024 01:11:24 -0300 Subject: [PATCH 03/11] fix: formated --- llms/openai/internal/openaiclient/openaiclient.go | 1 - llms/openai/internal/openaiclient/wisper.go | 2 -- llms/openai/multicontent_test.go | 1 + 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/llms/openai/internal/openaiclient/openaiclient.go b/llms/openai/internal/openaiclient/openaiclient.go index 29af707da..c8f7c3d40 100644 --- a/llms/openai/internal/openaiclient/openaiclient.go +++ b/llms/openai/internal/openaiclient/openaiclient.go @@ -148,7 +148,6 @@ func (c *Client) CreateChat(ctx context.Context, r *ChatRequest) (*ChatResponse, // Transcription with audio file func (c *Client) Transcription(ctx context.Context, audioFilePath string, temperature float64) ([]byte, error) { - res, err := c.uploadAudioAndGetTranscription(ctx, audioFilePath, c.language, temperature) if err != nil { return nil, err diff --git a/llms/openai/internal/openaiclient/wisper.go b/llms/openai/internal/openaiclient/wisper.go index fdd850df9..c5cb8d746 100644 --- a/llms/openai/internal/openaiclient/wisper.go +++ b/llms/openai/internal/openaiclient/wisper.go @@ -17,7 +17,6 @@ type TranscribeAudioResponse struct { } func (c *Client) uploadAudioAndGetTranscription(ctx context.Context, audioFilePath, language string, temperature float64) ([]byte, error) { - payload := &bytes.Buffer{} writer := multipart.NewWriter(payload) file, errFile1 := os.Open(audioFilePath) @@ -48,7 +47,6 @@ func (c *Client) uploadAudioAndGetTranscription(ctx context.Context, audioFilePa client := &http.Client{} req, err := http.NewRequestWithContext(ctx, http.MethodPost, "https://api.openai.com/v1/audio/transcriptions", payload) - if err != nil { return nil, err } diff --git a/llms/openai/multicontent_test.go b/llms/openai/multicontent_test.go index adb425826..cca7e8cac 100644 --- a/llms/openai/multicontent_test.go +++ b/llms/openai/multicontent_test.go @@ -175,6 +175,7 @@ func TestTranscription(t *testing.T) { assert.NotEmpty(t, rsp) } + func showResponse(rsp any) string { //nolint:golint,unused b, err := json.MarshalIndent(rsp, "", " ") if err != nil { From dbfcc28712e689a9363f8adce3770ace2fc54f5b Mon Sep 17 00:00:00 2001 From: Alexandre E Souza Date: Wed, 20 Mar 2024 01:13:19 -0300 Subject: [PATCH 04/11] fix: formated --- llms/openai/internal/openaiclient/openaiclient.go | 2 +- llms/openai/openaillm.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/llms/openai/internal/openaiclient/openaiclient.go b/llms/openai/internal/openaiclient/openaiclient.go index c8f7c3d40..9a1b190fd 100644 --- a/llms/openai/internal/openaiclient/openaiclient.go +++ b/llms/openai/internal/openaiclient/openaiclient.go @@ -146,7 +146,7 @@ func (c *Client) CreateChat(ctx context.Context, r *ChatRequest) (*ChatResponse, return resp, nil } -// Transcription with audio file +// Transcription with audio file. func (c *Client) Transcription(ctx context.Context, audioFilePath string, temperature float64) ([]byte, error) { res, err := c.uploadAudioAndGetTranscription(ctx, audioFilePath, c.language, temperature) if err != nil { diff --git a/llms/openai/openaillm.go b/llms/openai/openaillm.go index acae50c94..05a828e30 100644 --- a/llms/openai/openaillm.go +++ b/llms/openai/openaillm.go @@ -151,7 +151,7 @@ func (o *LLM) CreateEmbedding(ctx context.Context, inputTexts []string) ([][]flo return embeddings, nil } -// Transcription with audio file +// Transcription with audio file. func (o *LLM) TranscribeAudio(ctx context.Context, audioFilePath string, options ...llms.CallOption) ([]byte, error) { opts := llms.CallOptions{} for _, opt := range options { From baeef8ca0d3286c3a423ce376c9e36dc44f31c2c Mon Sep 17 00:00:00 2001 From: Alexandre E Souza Date: Wed, 20 Mar 2024 17:49:08 -0300 Subject: [PATCH 05/11] feat: finished --- llms/openai/internal/openaiclient/openaiclient.go | 4 +++- llms/openai/internal/openaiclient/{wisper.go => whisper.go} | 0 llms/openai/openaillm.go | 4 +++- llms/openai/openaillm_option.go | 3 ++- 4 files changed, 8 insertions(+), 3 deletions(-) rename llms/openai/internal/openaiclient/{wisper.go => whisper.go} (100%) diff --git a/llms/openai/internal/openaiclient/openaiclient.go b/llms/openai/internal/openaiclient/openaiclient.go index 9a1b190fd..ec58c53a9 100644 --- a/llms/openai/internal/openaiclient/openaiclient.go +++ b/llms/openai/internal/openaiclient/openaiclient.go @@ -146,7 +146,9 @@ func (c *Client) CreateChat(ctx context.Context, r *ChatRequest) (*ChatResponse, return resp, nil } -// Transcription with audio file. +// Transcription is a method of the Client type that performs transcription of an audio file. +// It takes the execution context, the path of the audio file , and the audio temperature as parameters. +// It returns the transcription of the audio as a byte array and a possible error if one occurs. func (c *Client) Transcription(ctx context.Context, audioFilePath string, temperature float64) ([]byte, error) { res, err := c.uploadAudioAndGetTranscription(ctx, audioFilePath, c.language, temperature) if err != nil { diff --git a/llms/openai/internal/openaiclient/wisper.go b/llms/openai/internal/openaiclient/whisper.go similarity index 100% rename from llms/openai/internal/openaiclient/wisper.go rename to llms/openai/internal/openaiclient/whisper.go diff --git a/llms/openai/openaillm.go b/llms/openai/openaillm.go index 05a828e30..ee6f07b9f 100644 --- a/llms/openai/openaillm.go +++ b/llms/openai/openaillm.go @@ -151,7 +151,9 @@ func (o *LLM) CreateEmbedding(ctx context.Context, inputTexts []string) ([][]flo return embeddings, nil } -// Transcription with audio file. +// Transcription is a method of the Client type that performs transcription of an audio file. +// It takes the execution context, the path of the audio file, and the audio temperature as parameters. +// It returns the transcription of the audio as a byte array and a possible error if one occurs. func (o *LLM) TranscribeAudio(ctx context.Context, audioFilePath string, options ...llms.CallOption) ([]byte, error) { opts := llms.CallOptions{} for _, opt := range options { diff --git a/llms/openai/openaillm_option.go b/llms/openai/openaillm_option.go index 005cf6fe8..a0f778a30 100644 --- a/llms/openai/openaillm_option.go +++ b/llms/openai/openaillm_option.go @@ -40,7 +40,7 @@ type options struct { embeddingModel string callbackHandler callbacks.Handler - // required when use wisper + // required when use whisper model language string } @@ -132,6 +132,7 @@ func WithResponseFormat(responseFormat ResponseFormat) Option { } // WithLanguage allows setting a custom language. +// doc for language: https://platform.openai.com/docs/guides/speech-to-text/supported-languages func WithLanguage(language string) Option { return func(opts *options) { opts.language = language From 58709eaf766177416257d62d9353a58a3b50df84 Mon Sep 17 00:00:00 2001 From: Alexandre E Souza Date: Wed, 20 Mar 2024 18:05:49 -0300 Subject: [PATCH 06/11] feat:add link for audio formats --- llms/openai/openaillm.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/llms/openai/openaillm.go b/llms/openai/openaillm.go index ee6f07b9f..6a5b6d739 100644 --- a/llms/openai/openaillm.go +++ b/llms/openai/openaillm.go @@ -154,6 +154,8 @@ func (o *LLM) CreateEmbedding(ctx context.Context, inputTexts []string) ([][]flo // Transcription is a method of the Client type that performs transcription of an audio file. // It takes the execution context, the path of the audio file, and the audio temperature as parameters. // It returns the transcription of the audio as a byte array and a possible error if one occurs. +// +// Audio support is not available for OpenAI. https://help.openai.com/en/articles/7031512-whisper-audio-api-faq func (o *LLM) TranscribeAudio(ctx context.Context, audioFilePath string, options ...llms.CallOption) ([]byte, error) { opts := llms.CallOptions{} for _, opt := range options { From c01f0abe687020c054cbbc5417ea87a61fba0364 Mon Sep 17 00:00:00 2001 From: Alexandre E Souza Date: Wed, 20 Mar 2024 19:09:39 -0300 Subject: [PATCH 07/11] feat: update comments --- llms/openai/internal/openaiclient/openaiclient.go | 2 +- llms/openai/openaillm.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/llms/openai/internal/openaiclient/openaiclient.go b/llms/openai/internal/openaiclient/openaiclient.go index ec58c53a9..10847e7bb 100644 --- a/llms/openai/internal/openaiclient/openaiclient.go +++ b/llms/openai/internal/openaiclient/openaiclient.go @@ -146,7 +146,7 @@ func (c *Client) CreateChat(ctx context.Context, r *ChatRequest) (*ChatResponse, return resp, nil } -// Transcription is a method of the Client type that performs transcription of an audio file. +// TranscribeAudio is a method of the Client type that performs transcription of an audio file. // It takes the execution context, the path of the audio file , and the audio temperature as parameters. // It returns the transcription of the audio as a byte array and a possible error if one occurs. func (c *Client) Transcription(ctx context.Context, audioFilePath string, temperature float64) ([]byte, error) { diff --git a/llms/openai/openaillm.go b/llms/openai/openaillm.go index 6a5b6d739..0898513a0 100644 --- a/llms/openai/openaillm.go +++ b/llms/openai/openaillm.go @@ -151,7 +151,7 @@ func (o *LLM) CreateEmbedding(ctx context.Context, inputTexts []string) ([][]flo return embeddings, nil } -// Transcription is a method of the Client type that performs transcription of an audio file. +// TranscribeAudio is a method of the Client type that performs transcription of an audio file. // It takes the execution context, the path of the audio file, and the audio temperature as parameters. // It returns the transcription of the audio as a byte array and a possible error if one occurs. // From ecccd208dfc6e5e4d7879d67f54f83b50007c273 Mon Sep 17 00:00:00 2001 From: Alexandre E Souza Date: Fri, 29 Mar 2024 23:06:16 -0300 Subject: [PATCH 08/11] chore: move whiper to documentloaders --- {llms/openai => documentloaders}/sample.mp3 | Bin documentloaders/whisper.go | 213 ++++++++++++++++++ documentloaders/whisper_test.go | 48 ++++ .../internal/openaiclient/openaiclient.go | 15 +- llms/openai/internal/openaiclient/whisper.go | 72 ------ llms/openai/llm.go | 3 +- llms/openai/multicontent_test.go | 14 -- llms/openai/openaillm.go | 13 -- llms/openai/openaillm_option.go | 10 - 9 files changed, 263 insertions(+), 125 deletions(-) rename {llms/openai => documentloaders}/sample.mp3 (100%) create mode 100644 documentloaders/whisper.go create mode 100644 documentloaders/whisper_test.go delete mode 100644 llms/openai/internal/openaiclient/whisper.go diff --git a/llms/openai/sample.mp3 b/documentloaders/sample.mp3 similarity index 100% rename from llms/openai/sample.mp3 rename to documentloaders/sample.mp3 diff --git a/documentloaders/whisper.go b/documentloaders/whisper.go new file mode 100644 index 000000000..b2a7c3f5d --- /dev/null +++ b/documentloaders/whisper.go @@ -0,0 +1,213 @@ +package documentloaders + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "io/ioutil" + "mime/multipart" + "net/http" + "os" + "path/filepath" + "strings" + + "github.com/tmc/langchaingo/schema" + "github.com/tmc/langchaingo/textsplitter" +) + +// WhisperOpenAILoader is a struct for loading and transcribing audio files using Whisper OpenAI model. +type WhisperOpenAILoader struct { + model string // the model to use for transcription + audioFilePath string // path to the audio file + language string // language of the audio + temperature float64 // transcription temperature + token string // authentication token for OpenAI API +} + +// Ensure WhisperOpenAILoader implements the Loader interface. +var _ Loader = &WhisperOpenAILoader{} + +// TranscribeAudioResponse represents the JSON response from the transcription API. +type TranscribeAudioResponse struct { + Text string `json:"text"` +} + +// WhisperOpenAIOption defines a function type for configuring WhisperOpenAILoader. +type WhisperOpenAIOption func(loader *WhisperOpenAILoader) + +// NewWhisperOpenAI creates a new WhisperOpenAILoader with given API key and options. +func NewWhisperOpenAI(apiKey string, opts ...WhisperOpenAIOption) *WhisperOpenAILoader { + loader := &WhisperOpenAILoader{ + model: "whisper-1", + temperature: 0.7, + language: "en", + token: apiKey, + } + // Apply options to configure the loader. + for _, opt := range opts { + opt(loader) + } + + return loader +} + +// WithModel sets the model for the WhisperOpenAILoader. +func WithModel(model string) WhisperOpenAIOption { + return func(w *WhisperOpenAILoader) { + w.model = model + } +} + +// WithAudioPath sets the audio file path for the WhisperOpenAILoader. +func WithAudioPath(path string) WhisperOpenAIOption { + return func(w *WhisperOpenAILoader) { + w.audioFilePath = path + } +} + +// WithLanguage allows setting a custom language. +// doc for language: https://platform.openai.com/docs/guides/speech-to-text/supported-languages +func WithLanguage(language string) WhisperOpenAIOption { + return func(opts *WhisperOpenAILoader) { + opts.language = language + } +} + +// WithTemperature sets the transcription temperature for the WhisperOpenAILoader. +func WithTemperature(temperature float64) WhisperOpenAIOption { + return func(w *WhisperOpenAILoader) { + w.temperature = temperature + } +} + +func (c *WhisperOpenAILoader) Load(ctx context.Context) ([]schema.Document, error) { + + if strings.Contains(c.audioFilePath, "http") { + audioFilePath, err := downloadFileFromURL(c.audioFilePath) + if err != nil { + return nil, err + } + + c.audioFilePath = audioFilePath + } + + transcribe, err := c.transcribe(ctx, c.audioFilePath) + if err != nil { + return nil, err + } + + //create a virtual file + tmpOutputFile, err := ioutil.TempFile("", "*.txt") + if err != nil { + return nil, fmt.Errorf("erro ao criar arquivo temporário de texto: %w", err) + } + + defer os.Remove(tmpOutputFile.Name()) + + // Write in virtual file + if _, err := tmpOutputFile.Write(transcribe); err != nil { + return nil, fmt.Errorf("erro ao escrever no arquivo temporário de texto: %w", err) + } + + //read file + file, err := os.Open(tmpOutputFile.Name()) + if err != nil { + return nil, fmt.Errorf("erro ao ler o arquivo de texto gerado: %w", err) + } + txtLoader := NewText(file) + + return txtLoader.Load(ctx) + +} + +func (c *WhisperOpenAILoader) LoadAndSplit(ctx context.Context, splitter textsplitter.TextSplitter) ([]schema.Document, error) { + docs, err := c.Load(ctx) + if err != nil { + return nil, err + } + + return textsplitter.SplitDocuments(splitter, docs) +} + +// downloadFileFromURL downloads a file from the provided URL and saves it to a temporary file. +// It returns the path to the temporary file and any error encountered. +func downloadFileFromURL(fileURL string) (string, error) { + // Get the data + resp, err := http.Get(fileURL) + if err != nil { + return "", err + } + defer resp.Body.Close() + + // Create a temporary file + tmpFile, err := os.CreateTemp("", "downloaded_audio_*.mp3") // Adjust the pattern to match your file type + if err != nil { + return "", err + } + defer tmpFile.Close() + + // Write the body to file + _, err = io.Copy(tmpFile, resp.Body) + if err != nil { + return "", err + } + + return tmpFile.Name(), nil +} + +// transcribe performs the audio file transcription using the Whisper OpenAI model. +func (c *WhisperOpenAILoader) transcribe(ctx context.Context, audioFilePath string) ([]byte, error) { + payload := &bytes.Buffer{} + writer := multipart.NewWriter(payload) + file, err := os.Open(audioFilePath) + if err != nil { + return nil, err + } + defer file.Close() + + // Create a form file part in the multipart writer. + part1, err := writer.CreateFormFile("file", filepath.Base(audioFilePath)) + if err != nil { + return nil, err + } + if _, err = io.Copy(part1, file); err != nil { + return nil, err + } + + // Add other fields to the multipart form. + _ = writer.WriteField("model", c.model) + _ = writer.WriteField("response_format", "json") + _ = writer.WriteField("temperature", fmt.Sprintf("%f", c.temperature)) + _ = writer.WriteField("language", c.language) + if err = writer.Close(); err != nil { + return nil, err + } + + client := &http.Client{} + req, err := http.NewRequestWithContext(ctx, http.MethodPost, "https://api.openai.com/v1/audio/transcriptions", payload) + if err != nil { + return nil, err + } + + // Set request headers. + req.Header.Set("Authorization", "Bearer "+c.token) + req.Header.Set("Content-Type", writer.FormDataContentType()) // Correctly set the Content-Type for multipart form data. + + res, err := client.Do(req) + if err != nil { + return nil, err + } + defer res.Body.Close() + + body, err := io.ReadAll(res.Body) + if err != nil { + return nil, err + } + var transcriptionResponse TranscribeAudioResponse + if err = json.Unmarshal(body, &transcriptionResponse); err != nil { + return nil, err + } + return []byte(transcriptionResponse.Text), nil +} diff --git a/documentloaders/whisper_test.go b/documentloaders/whisper_test.go new file mode 100644 index 000000000..badbca535 --- /dev/null +++ b/documentloaders/whisper_test.go @@ -0,0 +1,48 @@ +package documentloaders + +import ( + "context" + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestTranscription(t *testing.T) { + t.Parallel() + if openaiKey := os.Getenv("OPENAI_API_KEY"); openaiKey == "" { + t.Skip("OPENAI_API_KEY not set") + } + t.Run("Test with local file", func(t *testing.T) { + + audioFilePath := "./sample.mp3" + _, err := os.Stat(audioFilePath) + require.NoError(t, err) + opts := []WhisperOpenAIOption{ + WithAudioPath(audioFilePath), + } + whisper := NewWhisperOpenAI(os.Getenv("OPENAI_API_KEY"), opts...) + + rsp, err := whisper.Load(context.Background()) + require.NoError(t, err) + + assert.NotEmpty(t, rsp) + + }) + + t.Run("Test from url", func(t *testing.T) { + audioURL := "https://github.com/AssemblyAI-Examples/audio-examples/raw/main/20230607_me_canadian_wildfires.mp3" + + opts := []WhisperOpenAIOption{ + WithAudioPath(audioURL), + } + whisper := NewWhisperOpenAI(os.Getenv("OPENAI_API_KEY"), opts...) + + rsp, err := whisper.Load(context.Background()) + require.NoError(t, err) + + assert.NotEmpty(t, rsp) + + }) +} diff --git a/llms/openai/internal/openaiclient/openaiclient.go b/llms/openai/internal/openaiclient/openaiclient.go index 10847e7bb..d5ab33a9a 100644 --- a/llms/openai/internal/openaiclient/openaiclient.go +++ b/llms/openai/internal/openaiclient/openaiclient.go @@ -49,7 +49,7 @@ type Doer interface { // New returns a new OpenAI client. func New(token string, model string, baseURL string, organization string, - apiType APIType, apiVersion string, httpClient Doer, embeddingsModel string, language string, + apiType APIType, apiVersion string, httpClient Doer, embeddingsModel string, opts ...Option, ) (*Client, error) { c := &Client{ @@ -61,7 +61,6 @@ func New(token string, model string, baseURL string, organization string, apiType: apiType, apiVersion: apiVersion, httpClient: httpClient, - language: language, } for _, opt := range opts { @@ -146,18 +145,6 @@ func (c *Client) CreateChat(ctx context.Context, r *ChatRequest) (*ChatResponse, return resp, nil } -// TranscribeAudio is a method of the Client type that performs transcription of an audio file. -// It takes the execution context, the path of the audio file , and the audio temperature as parameters. -// It returns the transcription of the audio as a byte array and a possible error if one occurs. -func (c *Client) Transcription(ctx context.Context, audioFilePath string, temperature float64) ([]byte, error) { - res, err := c.uploadAudioAndGetTranscription(ctx, audioFilePath, c.language, temperature) - if err != nil { - return nil, err - } - - return res, nil -} - func IsAzure(apiType APIType) bool { return apiType == APITypeAzure || apiType == APITypeAzureAD } diff --git a/llms/openai/internal/openaiclient/whisper.go b/llms/openai/internal/openaiclient/whisper.go deleted file mode 100644 index c5cb8d746..000000000 --- a/llms/openai/internal/openaiclient/whisper.go +++ /dev/null @@ -1,72 +0,0 @@ -package openaiclient - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "io" - "mime/multipart" - "net/http" - "os" - "path/filepath" -) - -type TranscribeAudioResponse struct { - Text string `json:"text"` -} - -func (c *Client) uploadAudioAndGetTranscription(ctx context.Context, audioFilePath, language string, temperature float64) ([]byte, error) { - payload := &bytes.Buffer{} - writer := multipart.NewWriter(payload) - file, errFile1 := os.Open(audioFilePath) - - if errFile1 != nil { - return nil, errFile1 - } - - defer file.Close() - - part1, errFile1 := writer.CreateFormFile("file", filepath.Base(audioFilePath)) - if errFile1 != nil { - return nil, errFile1 - } - _, errFile1 = io.Copy(part1, file) - if errFile1 != nil { - return nil, errFile1 - } - - _ = writer.WriteField("model", c.Model) - _ = writer.WriteField("response_format", "json") - _ = writer.WriteField("temperature", fmt.Sprintf("%f", temperature)) - _ = writer.WriteField("language", language) - err := writer.Close() - if err != nil { - return nil, err - } - - client := &http.Client{} - req, err := http.NewRequestWithContext(ctx, http.MethodPost, "https://api.openai.com/v1/audio/transcriptions", payload) - if err != nil { - return nil, err - } - c.setHeaders(req) - - req.Header.Set("Content-Type", writer.FormDataContentType()) - res, err := client.Do(req) - if err != nil { - return nil, err - } - defer res.Body.Close() - - body, err := io.ReadAll(res.Body) - if err != nil { - return nil, err - } - var transcriptionResponse TranscribeAudioResponse - err = json.Unmarshal(body, &transcriptionResponse) - if err != nil { - return nil, err - } - return []byte(transcriptionResponse.Text), nil -} diff --git a/llms/openai/llm.go b/llms/openai/llm.go index 0ac42c420..38352f4af 100644 --- a/llms/openai/llm.go +++ b/llms/openai/llm.go @@ -25,7 +25,6 @@ func newClient(opts ...Option) (*options, *openaiclient.Client, error) { organization: os.Getenv(organizationEnvVarName), apiType: APIType(openaiclient.APITypeOpenAI), httpClient: http.DefaultClient, - language: "en", } for _, opt := range opts { @@ -45,7 +44,7 @@ func newClient(opts ...Option) (*options, *openaiclient.Client, error) { } cli, err := openaiclient.New(options.token, options.model, options.baseURL, options.organization, - openaiclient.APIType(options.apiType), options.apiVersion, options.httpClient, options.embeddingModel, options.language) + openaiclient.APIType(options.apiType), options.apiVersion, options.httpClient, options.embeddingModel) return options, cli, err } diff --git a/llms/openai/multicontent_test.go b/llms/openai/multicontent_test.go index cca7e8cac..a758c76a4 100644 --- a/llms/openai/multicontent_test.go +++ b/llms/openai/multicontent_test.go @@ -162,20 +162,6 @@ func TestFunctionCall(t *testing.T) { assert.NotNil(t, c1.FuncCall) } -func TestTranscription(t *testing.T) { - t.Parallel() - llm := newTestClient(t, WithModel("whisper-1")) - - audioFilePath := "./sample.mp3" - _, err := os.Stat(audioFilePath) - require.NoError(t, err) - - rsp, err := llm.TranscribeAudio(context.Background(), audioFilePath) - require.NoError(t, err) - - assert.NotEmpty(t, rsp) -} - func showResponse(rsp any) string { //nolint:golint,unused b, err := json.MarshalIndent(rsp, "", " ") if err != nil { diff --git a/llms/openai/openaillm.go b/llms/openai/openaillm.go index 0898513a0..d4bcaf5b3 100644 --- a/llms/openai/openaillm.go +++ b/llms/openai/openaillm.go @@ -150,16 +150,3 @@ func (o *LLM) CreateEmbedding(ctx context.Context, inputTexts []string) ([][]flo } return embeddings, nil } - -// TranscribeAudio is a method of the Client type that performs transcription of an audio file. -// It takes the execution context, the path of the audio file, and the audio temperature as parameters. -// It returns the transcription of the audio as a byte array and a possible error if one occurs. -// -// Audio support is not available for OpenAI. https://help.openai.com/en/articles/7031512-whisper-audio-api-faq -func (o *LLM) TranscribeAudio(ctx context.Context, audioFilePath string, options ...llms.CallOption) ([]byte, error) { - opts := llms.CallOptions{} - for _, opt := range options { - opt(&opts) - } - return o.client.Transcription(ctx, audioFilePath, opts.Temperature) -} diff --git a/llms/openai/openaillm_option.go b/llms/openai/openaillm_option.go index a0f778a30..d005e80fe 100644 --- a/llms/openai/openaillm_option.go +++ b/llms/openai/openaillm_option.go @@ -40,8 +40,6 @@ type options struct { embeddingModel string callbackHandler callbacks.Handler - // required when use whisper model - language string } // Option is a functional option for the OpenAI client. @@ -130,11 +128,3 @@ func WithResponseFormat(responseFormat ResponseFormat) Option { opts.responseFormat = responseFormat } } - -// WithLanguage allows setting a custom language. -// doc for language: https://platform.openai.com/docs/guides/speech-to-text/supported-languages -func WithLanguage(language string) Option { - return func(opts *options) { - opts.language = language - } -} From bbe06721248c771a6de621e65d48166c4dc30947 Mon Sep 17 00:00:00 2001 From: Alexandre E Souza Date: Fri, 29 Mar 2024 23:24:00 -0300 Subject: [PATCH 09/11] chore: move whiper to documentloaders --- documentloaders/whisper.go | 37 +++++++++++++++++++++++---------- documentloaders/whisper_test.go | 5 ++--- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/documentloaders/whisper.go b/documentloaders/whisper.go index b2a7c3f5d..ae8443ab5 100644 --- a/documentloaders/whisper.go +++ b/documentloaders/whisper.go @@ -6,12 +6,13 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "mime/multipart" "net/http" + "net/url" "os" "path/filepath" "strings" + "time" "github.com/tmc/langchaingo/schema" "github.com/tmc/langchaingo/textsplitter" @@ -83,7 +84,6 @@ func WithTemperature(temperature float64) WhisperOpenAIOption { } func (c *WhisperOpenAILoader) Load(ctx context.Context) ([]schema.Document, error) { - if strings.Contains(c.audioFilePath, "http") { audioFilePath, err := downloadFileFromURL(c.audioFilePath) if err != nil { @@ -98,8 +98,8 @@ func (c *WhisperOpenAILoader) Load(ctx context.Context) ([]schema.Document, erro return nil, err } - //create a virtual file - tmpOutputFile, err := ioutil.TempFile("", "*.txt") + // create a virtual file + tmpOutputFile, err := os.CreateTemp("", "*.txt") if err != nil { return nil, fmt.Errorf("erro ao criar arquivo temporário de texto: %w", err) } @@ -111,7 +111,7 @@ func (c *WhisperOpenAILoader) Load(ctx context.Context) ([]schema.Document, erro return nil, fmt.Errorf("erro ao escrever no arquivo temporário de texto: %w", err) } - //read file + // read file file, err := os.Open(tmpOutputFile.Name()) if err != nil { return nil, fmt.Errorf("erro ao ler o arquivo de texto gerado: %w", err) @@ -119,7 +119,6 @@ func (c *WhisperOpenAILoader) Load(ctx context.Context) ([]schema.Document, erro txtLoader := NewText(file) return txtLoader.Load(ctx) - } func (c *WhisperOpenAILoader) LoadAndSplit(ctx context.Context, splitter textsplitter.TextSplitter) ([]schema.Document, error) { @@ -133,22 +132,38 @@ func (c *WhisperOpenAILoader) LoadAndSplit(ctx context.Context, splitter textspl // downloadFileFromURL downloads a file from the provided URL and saves it to a temporary file. // It returns the path to the temporary file and any error encountered. +// +// nolint func downloadFileFromURL(fileURL string) (string, error) { - // Get the data - resp, err := http.Get(fileURL) + parsedURL, err := url.Parse(fileURL) + if err != nil { + return "", fmt.Errorf("failed to parse URL: %w", err) + } + + // Verificação adicional do esquema pode ser realizada aqui, se necessário + + if parsedURL.Scheme != "http" && parsedURL.Scheme != "https" { + return "", fmt.Errorf("URL scheme must be HTTP or HTTPS") + } + + // Configuração de um http.Client com timeout + netClient := &http.Client{ + Timeout: time.Second * 10, // Defina o timeout conforme necessário + } + + resp, err := netClient.Get(fileURL) if err != nil { return "", err } defer resp.Body.Close() - // Create a temporary file - tmpFile, err := os.CreateTemp("", "downloaded_audio_*.mp3") // Adjust the pattern to match your file type + // Restante do código para manipulação do arquivo... + tmpFile, err := os.CreateTemp("", "downloaded_file_*") // Ajuste o padrão conforme o tipo de arquivo if err != nil { return "", err } defer tmpFile.Close() - // Write the body to file _, err = io.Copy(tmpFile, resp.Body) if err != nil { return "", err diff --git a/documentloaders/whisper_test.go b/documentloaders/whisper_test.go index badbca535..9f3fa0834 100644 --- a/documentloaders/whisper_test.go +++ b/documentloaders/whisper_test.go @@ -15,7 +15,7 @@ func TestTranscription(t *testing.T) { t.Skip("OPENAI_API_KEY not set") } t.Run("Test with local file", func(t *testing.T) { - + t.Parallel() audioFilePath := "./sample.mp3" _, err := os.Stat(audioFilePath) require.NoError(t, err) @@ -28,10 +28,10 @@ func TestTranscription(t *testing.T) { require.NoError(t, err) assert.NotEmpty(t, rsp) - }) t.Run("Test from url", func(t *testing.T) { + t.Parallel() audioURL := "https://github.com/AssemblyAI-Examples/audio-examples/raw/main/20230607_me_canadian_wildfires.mp3" opts := []WhisperOpenAIOption{ @@ -43,6 +43,5 @@ func TestTranscription(t *testing.T) { require.NoError(t, err) assert.NotEmpty(t, rsp) - }) } From 1a9d0e1572fa6e759b42292bc767e72ea07e9ba1 Mon Sep 17 00:00:00 2001 From: Alexandre E Souza Date: Fri, 29 Mar 2024 23:27:33 -0300 Subject: [PATCH 10/11] chore: remove language --- llms/openai/internal/openaiclient/openaiclient.go | 1 - 1 file changed, 1 deletion(-) diff --git a/llms/openai/internal/openaiclient/openaiclient.go b/llms/openai/internal/openaiclient/openaiclient.go index d5ab33a9a..c50bed9da 100644 --- a/llms/openai/internal/openaiclient/openaiclient.go +++ b/llms/openai/internal/openaiclient/openaiclient.go @@ -36,7 +36,6 @@ type Client struct { // required when APIType is APITypeAzure or APITypeAzureAD apiVersion string embeddingsModel string - language string } // Option is an option for the OpenAI client. From 7b6bdc31d4a245f17c4cce48c1e3d91b90b486ab Mon Sep 17 00:00:00 2001 From: Alexandre E Souza Date: Mon, 1 Apr 2024 08:22:41 -0300 Subject: [PATCH 11/11] fix: translated --- documentloaders/whisper.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/documentloaders/whisper.go b/documentloaders/whisper.go index ae8443ab5..4abe1dde9 100644 --- a/documentloaders/whisper.go +++ b/documentloaders/whisper.go @@ -140,15 +140,15 @@ func downloadFileFromURL(fileURL string) (string, error) { return "", fmt.Errorf("failed to parse URL: %w", err) } - // Verificação adicional do esquema pode ser realizada aqui, se necessário + // Additional schema verification can be performed here if necessary if parsedURL.Scheme != "http" && parsedURL.Scheme != "https" { return "", fmt.Errorf("URL scheme must be HTTP or HTTPS") } - // Configuração de um http.Client com timeout + // Configuring an http.Client with timeout netClient := &http.Client{ - Timeout: time.Second * 10, // Defina o timeout conforme necessário + Timeout: time.Second * 10, // Set the timeout as needed } resp, err := netClient.Get(fileURL) @@ -157,8 +157,8 @@ func downloadFileFromURL(fileURL string) (string, error) { } defer resp.Body.Close() - // Restante do código para manipulação do arquivo... - tmpFile, err := os.CreateTemp("", "downloaded_file_*") // Ajuste o padrão conforme o tipo de arquivo + // Rest of the code for file manipulation... + tmpFile, err := os.CreateTemp("", "downloaded_file_*") // Adjust the default according to the file type if err != nil { return "", err }