我刚开始做一个小演示,用JS将前端捕获的音频转换为audio/webm,然后在Laravel应用程序中发送后端。我想有JS库可以处理转换,但我宁愿使用FFMPEG的服务器端解决方案,我正在做。
后端代码如下。在我使用的PHP composer包和Laravel的一个包之间,它似乎可以工作。我宁愿使用这个包,因为我有其他的PHP应用程序不是Laravel。
问题:
1.有了FFMpeg库,有没有一种方法可以将转换后的.mp3文件捕获到脚本中的PHP变量中,而不是将其保存到文件系统中,然后在以后阅读回?
1.对于OpenAI调用,我也想在那里捕获异常。我现在只是在那里有一个占位符。
protected function whisper(Request $request) {
$yourApiKey = getenv('OPENAI_API_KEY');
$client = OpenAI::client($yourApiKey);
$file = $request->file('file');
$mimeType = $request->file('file')->getMimeType();
$audioContents = $file->getContent();
try {
FFMpeg::open($file)
->export()
->toDisk('public')
->inFormat(new \FFMpeg\Format\Audio\Mp3)
->save('song_converted.mp3');
}
catch (EncodingException $exception) {
$command = $exception->getCommand();
$errorLog = $exception->getErrorOutput();
}
$mp3 = Storage::disk('public')->path('song_converted.mp3');
try {
$response = $client->audio()->transcribe([
'model' => 'whisper-1',
'file' => fopen($mp3, 'r'),
'response_format' => 'verbose_json',
]);
}
catch (EncodingException $exception) {
$command = $exception->getCommand();
$errorLog = $exception->getErrorOutput();
}
echo json_encode($response);
}
1条答案
按热度按时间tquggr8v1#
我不认为你可以直接将Whisper API的流输出到一个变量中。但我认为你的意思是你想:
1.将来自Whisper的流响应存储在存储器中;或
1.存储在无需管理的文件中。
幸运的是,OpenAI客户端库似乎接受指针资源(即fopen返回变量)。最接近的方法是使用php://temp读写流。PHP会检查它的大小是否大于2 MB(可配置),它会创建一个临时文件进行存储。
如果这是美丽的:
1.如果流很小,PHP将使用内存处理所有内容。
1.如果它很大,你不必自己管理生成的临时文件,PHP会在使用后删除临时文件。
然后你可以rewind
$mp3
流并读出/ stream。例如:使用Laravel,你可能需要这样的东西: