Skip to content

Commit c51a5ad

Browse files
authored
Merge pull request #75 from mutablelogic/djt-0618-api
Re-introduced translation
2 parents 7007e04 + ed0ffce commit c51a5ad

File tree

6 files changed

+37
-108
lines changed

6 files changed

+37
-108
lines changed

pkg/api/register.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ func RegisterEndpoints(base string, whisper *whisper.Whisper, mux *http.ServeMux
2424
// Create a logger
2525
logger := logger.New(os.Stderr, logger.Term, debug)
2626

27+
// Not Found: GET /
28+
// returns a not found response
29+
mux.HandleFunc("/", logger.HandleFunc(func(w http.ResponseWriter, r *http.Request) {
30+
defer r.Body.Close()
31+
httpresponse.Error(w, httpresponse.ErrNotFound)
32+
}))
33+
2734
// Health: GET /v1/health
2835
// returns an empty OK response
2936
mux.HandleFunc(types.JoinPath(base, "health"), logger.HandleFunc(func(w http.ResponseWriter, r *http.Request) {

pkg/api/transcribe.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package api
22

33
import (
44
"context"
5-
"fmt"
65
"io"
76
"net/http"
87
"slices"
@@ -43,8 +42,6 @@ func TranscribeFile(ctx context.Context, service *whisper.Whisper, w http.Respon
4342
format = openai.Formats[0] // Default to first format
4443
} else if !slices.Contains(openai.Formats, format) {
4544
return httpresponse.Error(w, httpresponse.ErrBadRequest.Withf("Unsupported format: %q", format))
46-
} else {
47-
fmt.Println("TranscribeFile: format:", format)
4845
}
4946

5047
// Start a translation task
@@ -106,8 +103,6 @@ func TranslateFile(ctx context.Context, service *whisper.Whisper, w http.Respons
106103
format = openai.Formats[0] // Default to first format
107104
} else if !slices.Contains(openai.Formats, format) {
108105
return httpresponse.Error(w, httpresponse.ErrBadRequest.Withf("Unsupported format: %q", format))
109-
} else {
110-
fmt.Println("TranscribeFile: format:", format)
111106
}
112107

113108
// Cannot diarize when translating

pkg/client/client.go

Lines changed: 9 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ func (c *Client) Transcribe(ctx context.Context, model string, r io.Reader, opt
162162
case c.gowhisper != nil && model != "":
163163
if req, err := applyOpts(apigowhisper, model, r, opt...); err != nil {
164164
return nil, err
165-
} else if resp, err := c.gowhisper.Transcribe(ctx, req.gowhisper); err != nil {
165+
} else if resp, err := c.gowhisper.Transcribe(ctx, req.transcribe); err != nil {
166166
return nil, err
167167
} else {
168168
response = resp.Segments()
@@ -189,101 +189,18 @@ func (c *Client) Translate(ctx context.Context, model string, r io.Reader, opt .
189189
}
190190
case c.elevenlabs != nil && slices.Contains(elevenlabs.Models, model):
191191
return nil, httpresponse.ErrNotImplemented.Withf("translation with model %q is not supported", model)
192-
// TODO
193-
/*
194-
case c.gowhisper != nil && model != "":
195-
if req, err := applyOpts(apigowhisper, model, r, opt...); err != nil {
196-
return nil, err
197-
} else if resp, err := c.gowhisper.Translate(ctx, req.gowhisper.TranslationRequest); err != nil {
198-
return nil, err
199-
} else {
200-
response = resp.Segments()
201-
}
202-
*/
203-
default:
204-
return nil, httpresponse.ErrNotImplemented.Withf("model %q is not supported", model)
205-
}
206-
207-
// Return success
208-
return response, nil
209-
}
210-
211-
/*
212-
func (c *Client) Transcribe(ctx context.Context, model string, r io.Reader, opt ...Opt) (*schema.Transcription, error) {
213-
var request struct {
214-
File multipart.File `json:"file"`
215-
Model string `json:"model"`
216-
opts
217-
}
218-
var response schema.Transcription
219-
220-
// Get the name from the io.Reader
221-
name := ""
222-
if f, ok := r.(*os.File); ok {
223-
name = filepath.Base(f.Name())
224-
} else {
225-
name = "audio.wav" // Default name if not a file
226-
}
227-
228-
// Create the request
229-
request.Model = model
230-
request.File = multipart.File{
231-
Path: name,
232-
Body: r,
233-
}
234-
for _, o := range opt {
235-
if err := o(&request.opts); err != nil {
192+
case c.gowhisper != nil && model != "":
193+
if req, err := applyOpts(apigowhisper, model, r, opt...); err != nil {
236194
return nil, err
237-
}
238-
}
239-
240-
// Request->Response
241-
if payload, err := client.NewMultipartRequest(request, types.ContentTypeFormData); err != nil {
242-
return nil, err
243-
} else if err := c.DoWithContext(ctx, payload, &response, client.OptPath("audio/transcriptions"), client.OptNoTimeout()); err != nil {
244-
return nil, err
245-
}
246-
247-
// Return success
248-
return &response, nil
249-
}
250-
251-
func (c *Client) Translate(ctx context.Context, model string, r io.Reader, opt ...Opt) (*schema.Transcription, error) {
252-
var request struct {
253-
File multipart.File `json:"file"`
254-
Model string `json:"model"`
255-
opts
256-
}
257-
var response schema.Transcription
258-
259-
// Get the name from the io.Reader
260-
name := ""
261-
if f, ok := r.(*os.File); ok {
262-
name = filepath.Base(f.Name())
263-
} else {
264-
name = "audio.wav" // Default name if not a file
265-
}
266-
267-
// Create the request
268-
request.Model = model
269-
request.File = multipart.File{
270-
Path: name,
271-
Body: r,
272-
}
273-
for _, o := range opt {
274-
if err := o(&request.opts); err != nil {
195+
} else if resp, err := c.gowhisper.Translate(ctx, req.translate); err != nil {
275196
return nil, err
197+
} else {
198+
response = resp.Segments()
276199
}
277-
}
278-
279-
// Request->Response
280-
if payload, err := client.NewMultipartRequest(request, types.ContentTypeFormData); err != nil {
281-
return nil, err
282-
} else if err := c.DoWithContext(ctx, payload, &response, client.OptPath("audio/translations"), client.OptNoTimeout()); err != nil {
283-
return nil, err
200+
default:
201+
return nil, httpresponse.ErrNotImplemented.Withf("model %q is not supported", model)
284202
}
285203

286204
// Return success
287-
return &response, nil
205+
return response, nil
288206
}
289-
*/

pkg/client/gowhisper/schema.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99

1010
type TranslationRequest struct {
1111
openai.TranslationRequest
12+
Stream *bool `json:"stream,omitempty"`
1213
Diarize *bool `json:"diarize,omitempty"`
1314
}
1415

pkg/client/opts.go

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ import (
2020
type opts struct {
2121
openai openai.TranscriptionRequest
2222
elevenlabs elevenlabs.TranscribeRequest
23-
gowhisper gowhisper.TranscriptionRequest
23+
transcribe gowhisper.TranscriptionRequest
24+
translate gowhisper.TranslationRequest
2425
}
2526

2627
type Opt func(apitype, *opts) error
@@ -46,8 +47,10 @@ func applyOpts(api apitype, model string, r io.Reader, opt ...Opt) (*opts, error
4647
o.openai.Model = model
4748
o.elevenlabs.File = multipart.File{Body: r}
4849
o.elevenlabs.Model = model
49-
o.gowhisper.File = multipart.File{Body: r}
50-
o.gowhisper.Model = model
50+
o.transcribe.File = multipart.File{Body: r}
51+
o.transcribe.Model = model
52+
o.translate.File = multipart.File{Body: r}
53+
o.translate.Model = model
5154

5255
for _, opt := range opt {
5356
if err := opt(api, &o); err != nil {
@@ -73,7 +76,7 @@ func OptLanguage(language string) Opt {
7376
return httpresponse.ErrBadRequest.Withf("language %q not supported", language)
7477
} else {
7578
o.openai.Language = types.StringPtr(code)
76-
o.gowhisper.Language = types.StringPtr(code)
79+
o.transcribe.Language = types.StringPtr(code)
7780
}
7881
case apielevenlabs:
7982
// ElevenLabs uses three-letter language codes
@@ -100,7 +103,8 @@ func OptFormat(v string) Opt {
100103
// Set format
101104
switch api {
102105
case apiopenai, apigowhisper:
103-
o.gowhisper.Format = types.StringPtr(v)
106+
o.translate.Format = types.StringPtr(v)
107+
o.transcribe.Format = types.StringPtr(v)
104108
o.openai.Format = types.StringPtr(v)
105109
default:
106110
return httpresponse.ErrBadRequest.Withf("format %q not supported", v)
@@ -116,7 +120,8 @@ func OptPath(v string) Opt {
116120
return func(api apitype, o *opts) error {
117121
o.openai.File.Path = v
118122
o.elevenlabs.File.Path = v
119-
o.gowhisper.File.Path = v
123+
o.translate.File.Path = v
124+
o.transcribe.File.Path = v
120125
return nil
121126
}
122127
}
@@ -127,7 +132,8 @@ func OptPrompt(v string) Opt {
127132
switch api {
128133
case apiopenai, apigowhisper:
129134
o.openai.Prompt = types.StringPtr(v)
130-
o.gowhisper.Prompt = types.StringPtr(v)
135+
o.translate.Prompt = types.StringPtr(v)
136+
o.transcribe.Prompt = types.StringPtr(v)
131137
default:
132138
return httpresponse.ErrNotImplemented.Withf("OptPrompt not supported")
133139
}
@@ -141,7 +147,8 @@ func OptTemperature(v float64) Opt {
141147
switch api {
142148
case apiopenai, apigowhisper:
143149
o.openai.Temperature = types.Float64Ptr(v)
144-
o.gowhisper.Temperature = types.Float64Ptr(v)
150+
o.translate.Temperature = types.Float64Ptr(v)
151+
o.transcribe.Temperature = types.Float64Ptr(v)
145152
default:
146153
return httpresponse.ErrNotImplemented.Withf("OptTemperature not supported")
147154
}
@@ -170,7 +177,8 @@ func OptStream() Opt {
170177
switch api {
171178
case apiopenai, apigowhisper:
172179
o.openai.Stream = types.BoolPtr(true)
173-
o.gowhisper.Stream = types.BoolPtr(true)
180+
o.translate.Stream = types.BoolPtr(true)
181+
o.transcribe.Stream = types.BoolPtr(true)
174182
default:
175183
return httpresponse.ErrNotImplemented.Withf("OptStream not supported")
176184
}
@@ -183,7 +191,8 @@ func OptDiarize() Opt {
183191
return func(api apitype, o *opts) error {
184192
switch api {
185193
case apigowhisper:
186-
o.gowhisper.Diarize = types.BoolPtr(true)
194+
o.translate.Diarize = types.BoolPtr(true)
195+
o.transcribe.Diarize = types.BoolPtr(true)
187196
case apielevenlabs:
188197
o.elevenlabs.Diarize = types.BoolPtr(true)
189198
default:

third_party/whisper.cpp

0 commit comments

Comments
 (0)