66 "os"
77 "path"
88 "path/filepath"
9+ "sync"
910
1011 "github.com/google/uuid"
1112 "github.com/labstack/echo/v4"
@@ -17,8 +18,11 @@ import (
1718 "github.com/mudler/xlog"
1819)
1920
21+ var transcriptionTaskResults = sync.Map {}
22+
2023// TranscriptionEndpoint handles CAMB AI transcription (POST /apis/transcribe).
21- // Runs synchronously but returns results in CAMB AI's async task format.
24+ // The SDK sends multipart form with optional file upload and/or media_url.
25+ // Returns {"task_id": "..."} matching OrchestratorPipelineCallResult.
2226func TranscriptionEndpoint (cl * config.ModelConfigLoader , ml * model.ModelLoader , appConfig * config.ApplicationConfig ) echo.HandlerFunc {
2327 return func (c echo.Context ) error {
2428 cfg , ok := c .Get (middleware .CONTEXT_LOCALS_KEY_MODEL_CONFIG ).(* config.ModelConfig )
@@ -32,54 +36,79 @@ func TranscriptionEndpoint(cl *config.ModelConfigLoader, ml *model.ModelLoader,
3236 if input != nil && input .LanguageID > 0 {
3337 language = schema .CambAILanguageCodeFromID (input .LanguageID )
3438 }
35-
36- file , err := c .FormFile ("file" )
37- if err != nil {
38- return c .JSON (http .StatusBadRequest , schema.CambAIErrorResponse {
39- Detail : "Audio file is required. Upload as multipart form field 'file'." ,
40- })
39+ // SDK sends language as multipart form field too
40+ if language == "" {
41+ if langField := c .FormValue ("language" ); langField != "" {
42+ language = langField
43+ }
4144 }
4245
43- f , err := file .Open ()
44- if err != nil {
45- return err
46- }
47- defer f .Close ()
46+ // Try file upload first (field "file" or "media_file")
47+ var audioPath string
48+ for _ , fieldName := range []string {"file" , "media_file" } {
49+ file , err := c .FormFile (fieldName )
50+ if err != nil {
51+ continue
52+ }
4853
49- dir , err := os .MkdirTemp ("" , "cambai-transcribe" )
50- if err != nil {
51- return err
54+ f , err := file .Open ()
55+ if err != nil {
56+ return err
57+ }
58+ defer f .Close ()
59+
60+ dir , err := os .MkdirTemp ("" , "cambai-transcribe" )
61+ if err != nil {
62+ return err
63+ }
64+ defer os .RemoveAll (dir )
65+
66+ dst := filepath .Join (dir , path .Base (file .Filename ))
67+ dstFile , err := os .Create (dst )
68+ if err != nil {
69+ return err
70+ }
71+
72+ if _ , err := io .Copy (dstFile , f ); err != nil {
73+ dstFile .Close ()
74+ return err
75+ }
76+ dstFile .Close ()
77+ audioPath = dst
78+ break
5279 }
53- defer os .RemoveAll (dir )
5480
55- dst := filepath .Join (dir , path .Base (file .Filename ))
56- dstFile , err := os .Create (dst )
57- if err != nil {
58- return err
81+ // Fall back to media_url form field
82+ if audioPath == "" {
83+ mediaURL := c .FormValue ("media_url" )
84+ if mediaURL == "" {
85+ mediaURL = c .FormValue ("audio_url" )
86+ }
87+ if mediaURL != "" {
88+ audioPath = mediaURL
89+ }
5990 }
6091
61- if _ , err := io .Copy (dstFile , f ); err != nil {
62- xlog .Debug ("Audio file copying error" , "filename" , file .Filename , "dst" , dst , "error" , err )
63- return err
92+ if audioPath == "" {
93+ return c .JSON (http .StatusBadRequest , schema.CambAIErrorResponse {
94+ Detail : "Either a file upload or media_url is required." ,
95+ })
6496 }
65- dstFile .Close ()
6697
67- xlog .Debug ("CAMB AI transcription request" , "file " , dst , "language" , language )
98+ xlog .Debug ("CAMB AI transcription request" , "path " , audioPath , "language" , language )
6899
69- tr , err := backend .ModelTranscription (dst , language , false , false , "" , ml , * cfg , appConfig )
100+ tr , err := backend .ModelTranscription (audioPath , language , false , false , "" , ml , * cfg , appConfig )
70101 if err != nil {
71102 return err
72103 }
73104
74105 taskID := uuid .New ().String ()
106+ transcriptionTaskResults .Store (taskID , tr .Text )
75107
76- return c .JSON (http .StatusOK , schema.CambAITaskStatusResponse {
108+ return c .JSON (http .StatusOK , schema.CambAITaskResponse {
109+ TaskID : taskID ,
77110 Status : "SUCCESS" ,
78111 RunID : taskID ,
79- Output : schema.CambAITranscriptionResponse {
80- Text : tr .Text ,
81- Language : language ,
82- },
83112 })
84113 }
85114}
0 commit comments