保存FFMpeg转换为PHP变量与文件系统使用Whisper API?

wbgh16ku  于 2023-04-19  发布在  PHP
关注(0)|答案(1)|浏览(83)

我刚开始做一个小演示,用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);

}
tquggr8v

tquggr8v1#

我不认为你可以直接将Whisper API的流输出到一个变量中。但我认为你的意思是你想:
1.将来自Whisper的流响应存储在存储器中;或
1.存储在无需管理的文件中。
幸运的是,OpenAI客户端库似乎接受指针资源(即fopen返回变量)。最接近的方法是使用php://temp读写流。PHP会检查它的大小是否大于2 MB(可配置),它会创建一个临时文件进行存储。
如果这是美丽的:
1.如果流很小,PHP将使用内存处理所有内容。
1.如果它很大,你不必自己管理生成的临时文件,PHP会在使用后删除临时文件。

$mp3 = fopen('php://temp');
$response = $client->audio()->transcribe([
    'model' => 'whisper-1',
    'file' =>  fopen($mp3, 'w+'),
    'response_format' => 'verbose_json',
]);

然后你可以rewind$mp3流并读出/ stream。例如:

// Move the pointer back to the beginning of the temporary storage.
rewind($mp3);

// Directly copy the stream chunk-by-chunk to the
// output buffer / output stream
$output = fopen('php://output', 'w');
stream_copy_to_stream($mp3, $output, 1024);

使用Laravel,你可能需要这样的东西:

rewind($mp3);
return response()->stream(fn() => echo stream_get_contents($mp3));

相关问题