Hello. I am developing a web application (through bubble.io) and I want to make an API request to transcribe some text. As you might imagine, files can’t be stored locally. They are stored in Amazon AWS.
So here’s my question: how do I send them to the API?
The curl request is:
curl https://api.openai.com/v1/audio/transcriptions \
-X POST \
-H 'Authorization: Bearer TOKEN' \
-H 'Content-Type: multipart/form-data' \
-F file=@/path/to/file/audio.mp3 \
-F model=whisper-1
I have them stored in Amazon AWS and I have the URL that is something like: https://s3.amazonaws.com/app/xxxxxxxx/TESTAUDIO.mp3
Thanks
I think the API is asking for the raw file bytes to be sent. No idea. But interested if any has found a workaround. In my case I download the file from S3 and send off the bytes to the API. Works great!
Hey @logankilpatrick is there any solution?
@curt.kennedy do you have an example where you are sending the bytes to the api? I’m trying to do this with node. It works fine if I save the audio first and then save the file, but if I just try and send the data from the buffer it is not working. I’d like to perform the following, but no dice.
// Get the mp3 file buffer from req.file
var audioBuffer = req.file.buffer;
// Create a form data instance
const form = new FormData();
// Append the mp3 file buffer and other parameters to the form data
form.append('file', audioBuffer);
form.append("model", "whisper-1");
// Set the headers for the axios request
const headers = {
Authorization: "Bearer sk-xxx",
...form.getHeaders(),
};
//Make a post request to the API endpoint
axios
.post("https://api.openai.com/v1/audio/transcriptions", form, { headers })
.then((r) => {
// Send back a JSON response with the transcription
res.json(r.data.text);
console.log(r);
})
.catch((error) => {
// Handle error response
console.error(error);
});
Any help would be great. Thanks!
@danvonfeldt
Here is more context of doing this in Python from S3
NANOwav = time.time_ns() # generate to avoid clobber
fname_local = f"/tmp/{NANOwav}.wav" # avoid local clobber by using nsec
# Uri is the S3 location of the file
with requests.get(Uri, stream=True) as r:
with open(fname_local,"wb") as binary_file:
binary_file.write(r.raw.read())
file_data = open(fname_local,'rb')
files = {'file': file_data,'model': (None, 'whisper-1'),}
response = requests.post('https://api.openai.com/v1/audio/transcriptions', headers=headers, files=files)
WhisperResponse = response.json()
VoiceTranscript = WhisperResponse.get("text","")
I probably could have avoided the write to disc operation by using a BytesIO object, but didn’t have time to code that version.
Thank you @curt.kennedy that is helpful. I am hosting with vercel and it is read-only however it does allow the ability to store some data in /tmp dir so I took advantage of that and things are working ok for me. Still writing to disk, but just blow it away right away. Thanks for your response.
This works for me in PHP
$token = 'Bearer ' . $OPENAI_API_KEY;
// Set the file path and model name
$model_name = 'whisper-1';
// Create a new cURL resource
$ch = curl_init();
// Set the cURL options
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization: '.$token,
'Content-Type: multipart/form-data'
));
$file_path = '1.mp3';
$fileContent = file_get_contents($file_path);
$r= new \CURLFile('data:audio/mp3;base64,' . base64_encode($fileContent), 'audio/mp3', $file_path );
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
'name' => basename($file_path),
'file' => $r,
'response_format' => 'json',
'prompt' => 'transcribe this Chapter',
'language' => 'de',
'model' => $model_name,
));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Execute the cURL request
$response = curl_exec($ch);
// Close the cURL resource
curl_close($ch);
// Handle the response
echo ($response);
in bubble.io, just check the sendfile option on the whisper api param definition and the you will be able to send mp3 files even just with the url - so works even if store on your own S3