在循环中下载多个音频文件失败(python)
一,;我正在尝试使用python中的循环从AWS polly(文本到语音服务)下载mp3文件 我使用的代码如下:在循环中下载多个音频文件失败(python),python,loops,amazon,amazon-polly,Python,Loops,Amazon,Amazon Polly,一,;我正在尝试使用python中的循环从AWS polly(文本到语音服务)下载mp3文件 我使用的代码如下: for i in range(0, 3): filename = str(i) + ".mp3" response = polly_client.synthesize_speech(VoiceId='Joanna', OutputFormat='mp3', Text = "
for i in range(0, 3):
filename = str(i) + ".mp3"
response = polly_client.synthesize_speech(VoiceId='Joanna',
OutputFormat='mp3',
Text = "blah blah blah"
file = open(filename, 'wb')
file.write(response['AudioStream'].read())
file.close()
这最终给了我1kb的文件,这意味着每个文件中都没有任何内容。。
如何改进代码,使循环暂停,直到每个音频文件完全下载
提前感谢您。请在亚马逊网站上查看此信息。它演示了如何将与关闭(…)
结合使用,以确保正确关闭响应流
以下是一些未经测试的代码,应该适合您:
from contextlib import closing
for i in range(3):
filename = f'{i}.mp3'
response = polly_client.synthesize_speech(VoiceId='Joanna',
OutputFormat='mp3',
Text = "blah blah blah"
if 'AudioStream' in response:
with closing(response['AudioStream']) as stream, open(filename, 'wb') as file:
while data := stream.read():
file.write(data)
else:
print(f'Problem streaming audio: {response=}')
我找到了这个问题的解决办法,但方法有点不同 正如我所猜测的,使用subprocess函数可能是关键 在子流程中使用命令(aws命令行)可以生成良好的mp3文件 代码如下
import pandas as pd
import subprocess
import codecs
for i in range (0,3):
word = 'blah blah blah'
file_name = '0' + str(i) + '.mp3'
print(word)
command = 'aws polly synthesize-speech --text-type ssml --output-format "mp3" --voice-id "Salli" --text "<speak>' + word + '</speak>" ' + file_name
print(command)
subprocess.call(command, shell=True)
将熊猫作为pd导入
导入子流程
导入编解码器
对于范围(0,3)内的i:
word=‘废话废话’
文件名='0'+str(i)+'.mp3'
打印(word)
command='aws polly synthesis speech--text type ssml--output format“mp3”--voice id“Salli”--text“'+word+'''+文件名
打印(命令)
subprocess.call(命令,shell=True)
如果您在任何循环之外对单个文件执行此操作,是否会像预期的那样工作?是的,它工作得很好我相信我需要使用子流程。。。但是我不知道怎么做..嗯,我认为你不需要子流程
。我没有AWS凭据,否则我会自己尝试,但从文档来看,它看起来像是response[“AudioStream”]
是一个botocore.response.StreamingBody
对象,它表示一个实时的异步套接字连接,数据可以通过该连接流传输。您的循环进行得如此之快,以至于一旦有机会第一次开始读取,套接字实际上就关闭了。似乎存在这些特殊的water
对象,它们等待异步进程-不确定它们如何工作,但值得研究。您还可以为synthesis\u speech
方法设置自定义InvocationType
关键字参数。将其从Event
更改为RequestResponse
会将一些异步函数更改为同步函数,但同样,我对AWS了解不多。不幸的是,这也不起作用。。这个案例导致所有三个文件都有0kb。但是,我找到了另一种方法。我使用命令和子流程,而不是直接在Python中处理它。。成功了。谢谢你的帮助。@johnley:我认为你应该进一步研究文档。使用子流程不是处理文件的好方法。问题基本上是您的代码没有读取完成返回的流-单个读取操作可能只会产生1K的数据。您应该在流上循环,直到读取0字节。@johnley:我已经更新了我的答案,以便在流数据上循环,直到它关闭为止。