Python 通过Flask将音频文件从mp3转换为flac,并保存在谷歌云存储中

Python 通过Flask将音频文件从mp3转换为flac,并保存在谷歌云存储中,python,flask,google-cloud-storage,pydub,audio-converter,Python,Flask,Google Cloud Storage,Pydub,Audio Converter,我正在尝试创建一个Flask应用程序,它使用GCP的speech-to-text将mp3文件转录成文本,并将结果保存到云存储(GCS)。(将mp3文件从Vue.js上载到Flask) 在此过程中,我希望将用户选择的mp3文件转换为flac文件,但我不希望将其保存在本地,并将其转换为语音到文本或保存到GCS 任何模块都可以使用,但我想保存转换为GCS的音频文件,而无需通过本地接口 我尝试使用pydub,它通常用于转换音频文件,但在选择转换前文件和转换后文件的保存位置时,相对路径是唯一的参数。我无法

我正在尝试创建一个Flask应用程序,它使用GCP的speech-to-text将mp3文件转录成文本,并将结果保存到云存储(GCS)。(将mp3文件从Vue.js上载到Flask) 在此过程中,我希望将用户选择的mp3文件转换为flac文件,但我不希望将其保存在本地,并将其转换为语音到文本或保存到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")
从pydub导入音频段
#(1)我可以在本地转换音频文件。
声音=音频段。来自mp3(“example.mp3”)
sound.export(“example.flac”,format=“flac”)
#(2)我无法将GCS URL作为参数传递
声音=音频段。来自mp3(“https://storage.googleapis.com//example.mp3")
声音。导出(“https://storage.googleapis.com//example.flac“,format=“flac”)
#(3)我无法写入变量
声音=声音。导出(format=“flac”)
sound.export(“example.flac”)
以上源代码的一部分

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

(2) FileNotFoundError:[Errno 2]没有这样的文件或目录:'/npl\u speech\u 2.mp3'

(3) AttributeError:“\u io.BufferedRandom”对象没有属性“export”


最后,我想使用AWS Lambda,因此我想转换文件而不必经过本地。

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

您可以使用。您的代码可能如下所示:

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>)

从google.cloud导入存储
storage\u client=storage.client()
bucket=存储\客户端。获取\ bucket(“”)
blob=bucket.blob(“”)
blob.下载到文件名(“/tmp/”)中
#转换下载的对象并将导出保存到tmp文件
声音=音频段。来自mp3(“/tmp/”)
sound.export(“/tmp/”,format=“flac”)
#设置将上载到GCS的对象的名称
destination_object_name=“”
#设置blob名称并上载导出的文件
blob\u to\u upload=bucket.blob(目标对象名称)
blob_to_upload.从文件名(/tmp/)上载

您将找到更多有关如何使用GCS客户端库的示例。

谢谢您的建议。根据你的回答,我用GCS而不是AWS S3解决了这个问题。