如何在NodeJS服务器上构建临时文件

s4n0splo  于 2023-04-05  发布在  Node.js
关注(0)|答案(1)|浏览(178)

我想从firebase bucket中获取一个webm文件,并使用openai whisper进行转录。

到目前为止,我正在为bucket中的文件生成一个公共URL,用axios发送一个请求并创建一个blob。

export const getFile = async(publicUrl: string) => {
    const response = await axios.get(publicUrl, { responseType: 'blob' })
    return new Blob([response.data], { type: 'video/webm' })
}

在官方的openai nodejs包中,我想调用的函数是:

createTranscription(file: File, model: string, prompt?: string, responseFormat?: string, temperature?: number, language?: string, options?: AxiosRequestConfig): Promise<import("axios").AxiosResponse<CreateTranscriptionResponse, any>>;

根据openai文档:
file必需。要转录的音频文件,格式如下:mp3、mp4、mpeg、mpga、m4a、wav或webm。
我在将此Blob转换为File或从firebase存储桶获取File对象时遇到问题。

我所尝试的

构造文件

const file = new File([blob], "test.webm", {
      type: "video/webm",
    });

我会得到一个:ReferenceError: File is not defined,据我所知,我不能使用文件javascript对象。

在blob上添加需要的属性

一个Blob和一个File几乎是相同的,所以我尝试添加缺少的属性:

const resp = await openai.createTranscription(
      {...blob, lastModified: 0, webkitRelativePath: "", name: "test.webm"},
      "whisper-1"
    );

不喜欢的类型:

Argument of type '{ lastModified: number; webkitRelativePath: string; name: string; size: number; type: string; arrayBuffer(): Promise<ArrayBuffer>; slice(start?: number | undefined, end?: number | undefined, contentType?: string | undefined): Blob; stream(): ReadableStream<...>; text(): Promise<...>; prototype: Blob; }' is not assignable to parameter of type 'File'.
  Type '{ lastModified: number; webkitRelativePath: string; name: string; size: number; type: string; arrayBuffer(): Promise<ArrayBuffer>; slice(start?: number | undefined, end?: number | undefined, contentType?: string | undefined): Blob; stream(): ReadableStream<...>; text(): Promise<...>; prototype: Blob; }' provides no match for the signature 'new (blobParts?: BlobPart[] | undefined, options?: BlobPropertyBag | undefined): Blob'.
7y4bm7vi

7y4bm7vi1#

我遇到了类似的问题,输入是一个使用HTML输入类型文件上传的PDF文件,我想从PDF中提取文本并将其传递给openAI模型。
PDF文本提取器需要一个Buffer对象。尝试了多次破解/修复无法转换/解析node.js中的传入文件
最后,我尝试了Multer作为中间件,它工作正常。
我用的是nextjs,所以这是我的代码。

import nextConnect from 'next-connect';
import multer from 'multer';

interface MulterRequest extends NextApiRequest {
    file: multerFile;
    files: Array<multerFile>;
}

const apiRoute = nextConnect({
    onError(error, req: MulterRequest, res: NextApiResponse) {
        res.status(501).json({
            error: `Sorry something Happened! ${error.message}`,
        });
    },
    onNoMatch(req, res) {
        res.status(405).json({ error: `Method "${req.method}" Not Allowed` });
    },
});

apiRoute.use(multer().any());

apiRoute.post(async (req, res) => {
    try {
        // console.log(req.body, req.files); // Your form data here
        // Any logic with your data here
        const configuration = new Configuration({
            apiKey: process.env.OPENAI_API_KEY,
        });
        const openai = new OpenAIApi(configuration);
        // Problem was this part 👇 arg1 type was Buffer
        const data = await PdfParse(req.files[0].buffer);

        const response = await openai....stuff

        console.log(response.data)
        res.status(200).json({ data: response.data.choices })
        // fs.writeFile('./parse.txt', data.text, () => {});
    } catch (error) {
        console.log(error);
        res.status(500).json({ data: 'Error', error });
    }
});

使用multer作为中间件的tl;dr可能会解决您的问题。

相关问题