使用HTTP Get获取音频文件,然后在python 3中播放。python 3中的TTS?

使用HTTP Get获取音频文件,然后在python 3中播放。python 3中的TTS?,python,python-3.x,get,text-to-speech,pyttsx,Python,Python 3.x,Get,Text To Speech,Pyttsx,基本上我想要的是python 3中的TTS。。。 我已经尝试过pyttsx,但它只适用于Python2 我也试过其他东西了。。。 现在我正在尝试使用来自的api,但我不知道HTTP如何获得它,然后使用pyglet与python一起使用它 以下是我目前的代码: import pyglet import urllib3 http = urllib3.PoolManager() speechrequest = http.request('GET', 'http://api.voicerss.org/

基本上我想要的是python 3中的TTS。。。 我已经尝试过pyttsx,但它只适用于Python2 我也试过其他东西了。。。 现在我正在尝试使用来自的api,但我不知道HTTP如何获得它,然后使用pyglet与python一起使用它

以下是我目前的代码:

import pyglet
import urllib3

http = urllib3.PoolManager()
speechrequest = http.request('GET', 'http://api.voicerss.org/?key=04f49802d32d442ca997d4d2ea76d3d5&hl=pt-pt&c=wav&src=texto')
speech = pyglet.media.load(speechrequest)
speech.play()
pyglet.app.run()
错误是:

Traceback (most recent call last):
  File "C:/Users/Diogo/Documents/test.py", line 6, in <module>
    speech = pyglet.media.load(speechrequest)
  File "C:\Users\Diogo\AppData\Local\Programs\Python\Python35\lib\site-packages\pyglet\media\__init__.py", line 1429, in load
    source = get_source_loader().load(filename, file)
  File "C:\Users\Diogo\AppData\Local\Programs\Python\Python35\lib\site-packages\pyglet\media\__init__.py", line 1410, in load
    return riff.WaveSource(filename, file)
  File "C:\Users\Diogo\AppData\Local\Programs\Python\Python35\lib\site-packages\pyglet\media\riff.py", line 185, in __init__
    file = open(filename, 'rb')
TypeError: invalid file: <urllib3.response.HTTPResponse object at 0x0000002EB0730D30>
回溯(最近一次呼叫最后一次):
文件“C:/Users/Diogo/Documents/test.py”,第6行,在
speech=pyglet.media.load(speechrequest)
文件“C:\Users\Diogo\AppData\Local\Programs\Python\35\lib\site packages\pyglet\media\uuuuu init\uuuuu.py”,第1429行,已加载
source=get\u source\u loader().load(文件名,文件名)
文件“C:\Users\Diogo\AppData\Local\Programs\Python\35\lib\site packages\pyglet\media\uuuuu init\uuuuu.py”,第1410行,已加载
返回riff.WaveSource(文件名,文件名)
文件“C:\Users\Diogo\AppData\Local\Programs\Python\35\lib\site packages\pyglet\media\riff.py”,第185行,在uu init中__
文件=打开(文件名“rb”)
TypeError:无效文件:
我猜它不会向python返回wav文件,我不知道为什么,因为。如果我在internet explorer中输入“”,它将返回一个wav文件

因此,我的问题是:
我对代码做了什么错误,或者如果不可能这样做,python如何说话


请耐心等待我,我才18岁,不会说英语,因为我是葡萄牙语…

您可以将远程wav文件保存在本地,并使用默认应用程序播放:

#!/usr/bin/env python3
from urllib.request import urlretrieve
import webbrowser

filename = 'speech.wav'
urlretrieve("http://api.voicerss.org/?key=04f49802d32d442ca997d4d2ea76d3d5"
            "&hl=pt-pt&c=wav&src=texto", filename)
webbrowser.open(filename) # play the file using default application
import winsound

winsound.PlaySound('speech.wav', winsound.SND_FILENAME)
在Windows上,您可以使用
os.startfile()
而不是
webbrowser.open()
,或者在不使用外部应用程序的情况下直接在Python中播放wav文件:

#!/usr/bin/env python3
from urllib.request import urlretrieve
import webbrowser

filename = 'speech.wav'
urlretrieve("http://api.voicerss.org/?key=04f49802d32d442ca997d4d2ea76d3d5"
            "&hl=pt-pt&c=wav&src=texto", filename)
webbrowser.open(filename) # play the file using default application
import winsound

winsound.PlaySound('speech.wav', winsound.SND_FILENAME)

您的代码至少有两个问题:

  • 您应该将文件名(字符串)传递给
    pyglet.media.load()
    函数,而不是
    HTTPResponse
    对象
  • pyglet
    可能无法播放:我得到了
    pyglet.media.riff.RIFFFormatException:格式块的大小不正确。
    我的系统出错

  • 您还可以播放远程wav文件而不将其保存到磁盘,即,您可以播放流媒体内容:

    #!/usr/bin/env python3
    from urllib.parse import quote
    from urllib.request import urlopen
    
    api_key = open('api.key', encoding='ascii').read().strip()
    language = 'pt-pt'
    text = quote("1 2 3")
    playwav(urlopen('https://api.voicerss.org/?c=wav&f=8khz_8bit_mono&ssml=false&'
                    'key={api_key}&src={text}&hl={language}'.format(**vars())))
    
    其中
    playwav()


    非常感谢,它现在正在工作。。。再次感谢您,祝您愉快day@DiogoSaraiva:顺便说一句,如果您不需要本地wav文件,则可以直接将http url传递到
    webbrowser.open()
    ,而无需先将音频文件保存到磁盘。好的,但我不想打开外部应用程序来播放wav。。。谢谢