如何将base64格式的音频文件转换为.wav文件而不将它们存储在Python中的当前目录中?

发布于 2025-01-10 06:04:16 字数 2387 浏览 3 评论 0原文

我想知道是否有更好的方法将 base64 格式的音频文件转换为 .wav 文件而不将它们存储在当前目录中。

问题是,我从用户使用 FastAPI 发送 POST 请求上传时获取了 Base64 格式的音频文件,然后对它们进行解码并将其转换为 .wav 文件,因为我需要将这些文件传递给我创建的一些函数,以便进行预处理和转录文件,这些函数使用 .wav 文件的 Wave 模块。由于我创建 .wav 文件只是为了转录它们,所以我不需要存储它们,最后我用 os.unlink 函数删除它们。

import fastapi_server.preprocessing_f as pr

app = FastAPI()

class AudioBase64(BaseModel):
    audio_name: str = Field(..., min_length=1, example="my-audio")
    data_base64: str = Field(..., min_length=1)

@app.post(
    path="/upload-base64-audios/",
    status_code=status.HTTP_200_OK
)
async def upload_base64_audios(audios: list[AudioBase64] = Body(...)):

    model: str = "~/models"
    dir_name = os.path.expanduser(model)
    output_graph, scorer = pr.resolve_models(dir_name)
    model_retval: List[str] = pr.load_model(output_graph, scorer)

    all_names: list[str] = []
    all_datas: list[str] = []
    all_decode: list[str] = []
    aggresive = 1
    transcriptions: list[str] = []
    new_data: list[str] = []
    final_data: list[str] = []
    header: list[str] = ["audio_name", "transcriptions"]

    for i in range(len(audios)):
        name = audios[i].audio_name
        data = audios[i].data_base64
        decode = base64.b64decode(data)
        all_names.append(name)
        all_datas.append(data)
        all_decode.append(decode)

        filename = "%s.wav" % name
        with open(filename, "wb") as f:
            f.write(decode)

        cwd = os.getcwd()
        files = glob.glob(cwd + "/" + name + ".wav")

        segments, sample_rate, audio_length = pr.vad_segment_generator(
            files[0], aggresive
        )
        for k, segment in enumerate(segments):
            audio = np.frombuffer(segment, dtype=np.int16)
            output = pr.stt(model_retval[0], audio)
            transcript = output[0]
        transcriptions.append(transcript)
        new_data = [all_names[i], transcriptions[i]]
        final_data.append(new_data)

    dir_files = glob.glob(cwd + "/*.wav")
    for file in dir_files:
        os.unlink(file)

    new_df = pd.DataFrame(final_data, columns=header)
    stream = io.StringIO()
    new_df.to_csv(stream, index=False)
    response: Response = StreamingResponse(
        iter([stream.getvalue()]), media_type="text/csv"
    )
    response.headers["Content-Disposition"] = "attachment; filename=my-file.csv"
    return response

I would like to know if there is a better way to convert base64-format audio files into .wav files without storage them on current directory.

The thing is that I get base64-format audio files from user uploading whith a POST request with FastAPI, then I decode them and convert them into .wav files because I need to pass the files over some functions that I created in order to preprocess and transcript the files and those functions use the wave module for .wav files. Due to I created .wav files for nothing more than transcripting them, so I don't need to store them and I finally delete them with os.unlink function.

import fastapi_server.preprocessing_f as pr

app = FastAPI()

class AudioBase64(BaseModel):
    audio_name: str = Field(..., min_length=1, example="my-audio")
    data_base64: str = Field(..., min_length=1)

@app.post(
    path="/upload-base64-audios/",
    status_code=status.HTTP_200_OK
)
async def upload_base64_audios(audios: list[AudioBase64] = Body(...)):

    model: str = "~/models"
    dir_name = os.path.expanduser(model)
    output_graph, scorer = pr.resolve_models(dir_name)
    model_retval: List[str] = pr.load_model(output_graph, scorer)

    all_names: list[str] = []
    all_datas: list[str] = []
    all_decode: list[str] = []
    aggresive = 1
    transcriptions: list[str] = []
    new_data: list[str] = []
    final_data: list[str] = []
    header: list[str] = ["audio_name", "transcriptions"]

    for i in range(len(audios)):
        name = audios[i].audio_name
        data = audios[i].data_base64
        decode = base64.b64decode(data)
        all_names.append(name)
        all_datas.append(data)
        all_decode.append(decode)

        filename = "%s.wav" % name
        with open(filename, "wb") as f:
            f.write(decode)

        cwd = os.getcwd()
        files = glob.glob(cwd + "/" + name + ".wav")

        segments, sample_rate, audio_length = pr.vad_segment_generator(
            files[0], aggresive
        )
        for k, segment in enumerate(segments):
            audio = np.frombuffer(segment, dtype=np.int16)
            output = pr.stt(model_retval[0], audio)
            transcript = output[0]
        transcriptions.append(transcript)
        new_data = [all_names[i], transcriptions[i]]
        final_data.append(new_data)

    dir_files = glob.glob(cwd + "/*.wav")
    for file in dir_files:
        os.unlink(file)

    new_df = pd.DataFrame(final_data, columns=header)
    stream = io.StringIO()
    new_df.to_csv(stream, index=False)
    response: Response = StreamingResponse(
        iter([stream.getvalue()]), media_type="text/csv"
    )
    response.headers["Content-Disposition"] = "attachment; filename=my-file.csv"
    return response

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

又怨 2025-01-17 06:04:16

正如建议的作者:@martineau
尝试中间写入 io.BytesIO,但写入后,调用 .seek(0) 将蒸汽位置返回到开始位置,而不是调用 getbuffer()
(写入后,流位置将位于末尾,准备接收更多数据)

with io.BytesIO() as buffer:
    buffer.write(decode)
    buffer.seek(0)  # rewind stream
    ...
    segments, sample_rate, audio_length = pr.vad_segment_generator(
        buffer, aggresive)

As suggested by @martineau,
try writing intermediately to an io.BytesIO, but after writing, call .seek(0) to return the steam position to the start, rather than calling getbuffer()
(after writing, the stream position will be at the end, ready for more data)

with io.BytesIO() as buffer:
    buffer.write(decode)
    buffer.seek(0)  # rewind stream
    ...
    segments, sample_rate, audio_length = pr.vad_segment_generator(
        buffer, aggresive)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文