通过 Flask 将音频文件从 mp3 转换为 flac,并保存在 Google 云存储
Convert an audio file from mp3 to flac by Flask, and save at Google Cloud Storage
我正在尝试创建一个 Flask 应用程序,它使用 GCP 的语音转文本功能转录 mp3 文件并将结果保存到云存储 (GCS)。 (将 mp3 文件从 Vue.js 上传到 Flask)
过程中想把用户选择的mp3文件转成flac文件,但是又不想保存到本地扔到speech-to-text或者保存到GCS。
任何模块都可以,但我想不通过本地保存转GCS的音频文件
我尝试使用 pydub,它通常用于转换音频文件,但是相对路径是选择预转换文件和保存位置时唯一可以采用的参数 post-转换文件。我无法将 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] 没有这样的文件或目录: 'https://storage.googleapis.com//npl_speech_2.mp3'
(3) AttributeError: '_io.BufferedRandom' 对象没有属性 'export'
最后想用AWS Lambda,所以想转文件不经过本地
您的假设是正确的,您不能将 GCS URL 作为参数传递。您首先需要 "download" 所需的对象,然后再进行转换。下载将完成到一个临时文件夹。
您可以使用 GCS client library for Python 实现。您的代码可能如下所示:
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>)
Here您将找到更多关于如何使用 GCS 客户端库的示例。
我正在尝试创建一个 Flask 应用程序,它使用 GCP 的语音转文本功能转录 mp3 文件并将结果保存到云存储 (GCS)。 (将 mp3 文件从 Vue.js 上传到 Flask) 过程中想把用户选择的mp3文件转成flac文件,但是又不想保存到本地扔到speech-to-text或者保存到GCS。
任何模块都可以,但我想不通过本地保存转GCS的音频文件
我尝试使用 pydub,它通常用于转换音频文件,但是相对路径是选择预转换文件和保存位置时唯一可以采用的参数 post-转换文件。我无法将 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] 没有这样的文件或目录: 'https://storage.googleapis.com//npl_speech_2.mp3'
(3) AttributeError: '_io.BufferedRandom' 对象没有属性 'export'
最后想用AWS Lambda,所以想转文件不经过本地
您的假设是正确的,您不能将 GCS URL 作为参数传递。您首先需要 "download" 所需的对象,然后再进行转换。下载将完成到一个临时文件夹。
您可以使用 GCS client library for Python 实现。您的代码可能如下所示:
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>)
Here您将找到更多关于如何使用 GCS 客户端库的示例。