-1

我正在尝试创建一个 Flask 应用程序,该应用程序使用 GCP 的语音到文本转录 mp3 文件并将结果保存到云存储 (GCS)。(将Vue.js中的mp3文件上传到Flask)在这个过程中,我想把用户选择的mp3文件转换成flac文件,但是我不想保存到本地扔到speech-to-text或将其保存到 GCS。

任何模块都可以,但是我想把转换成GCS的音频文件不经过本地保存。

我尝试使用 pydub,它通常用于转换音频文件,但在选择转换前文件和保存转换后文件的位置时,相对路径是唯一可以采用的参数。我无法将 Flask 接收的 mp3 文件转换为 flac 文件并将它们保存到 GCS。

即使无法保存到 GCS,也可以将转换后的文件保存到变量中。我也做不到。

from pydub import AudioSegment
# (1)I can convert an audio file at the local.
sound = AudioSegment.from_mp3("example.mp3")
sound.export("example.flac", format="flac")

# (2)I CANNOT pass GCS URL as an argument
sound = AudioSegment.from_mp3("https://storage.googleapis.com/<bucket-name>/example.mp3")
sound.export("https://storage.googleapis.com/<bucket-name>/example.flac", format="flac")

# (3)I CANNOT written to a variable
sound = sound.export(format="flac")
sound.export("example.flac")

以上源代码

(1) 显示预期行为,转换后的example.flac保存在当前目录

(2) FileNotFoundError: [Errno 2] No such file or directory: ' https://storage.googleapis.com/ /npl_speech_2.mp3'

(3) AttributeError: '_io.BufferedRandom' 对象没有属性 'export'

最后,我想使用AWS Lambda,所以我想在不经过本地的情况下转换文件。

4

1 回答 1

1

您的假设是正确的,您不能将 GCS URL 作为参数传递。您首先需要“下载”所需的对象,然后继续进行转换。下载将完成到一个临时文件夹。

您可以使用Python 的 GCS 客户端库来实现。您的代码可能如下所示:

from google.cloud import storage

storage_client = storage.Client()
bucket = storage_client.get_bucket("<BUCKET_NAME>")
blob = bucket.blob("<OBJECT_NAME>")
blob.download_to_filename("/tmp/<TMP_OBJECT_NAME>")

#Convert downloaded object and save the export to a tmp file
sound = AudioSegment.from_mp3("/tmp/<TMP_OBJECT_NAME>")
sound.export("/tmp/<TMP_OBJECT_NAME_CONVERTED>", format="flac")

#Set name of the object that will be uploaded to GCS
destination_object_name = "<storage-object-name>"

#Set blob name and upload the exported file
blob_to_upload = bucket.blob(destination_object_name)
blob_to_upload.upload_from_filename(/tmp/<TMP_OBJECT_NAME_CONVERTED>)

在这里,您将找到更多关于如何使用 GCS 客户端库的示例。

于 2019-12-26T11:02:02.923 回答