Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在循环中下载多个音频文件失败(python)_Python_Loops_Amazon_Amazon Polly - Fatal编程技术网

在循环中下载多个音频文件失败(python)

在循环中下载多个音频文件失败(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 = "

一,;我正在尝试使用python中的循环从AWS polly(文本到语音服务)下载mp3文件 我使用的代码如下:

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:我已经更新了我的答案,以便在流数据上循环,直到它关闭为止。