提问人:DiogoSaraiva 提问时间:10/25/2015 更新时间:1/17/2019 访问量:5262
使用 HTTP GET 获取音频文件,然后在 python 3 中播放。python 3 中的 TTS?
Get an audio file with HTTP GET and then play it in python 3. TTS in python 3?
问:
基本上我想要的是 python 3 中的 TTS...... 我已经尝试过 pyttsx,但它仅适用于 python 2 我也已经尝试过其他东西了...... 现在我正在尝试使用 voicerss.org 的 api,但我无法弄清楚如何 HTTP GET 它,然后用 python 和 pyglet 玩它......
这是我到目前为止的代码:
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>
我想它没有将 WAV 文件返回给 python 不知道为什么,因为。如果我在 Internet Explorer 中输入“http://api.voicerss.org/?key=04f49802d32d442ca997d4d2ea76d3d5&hl=pt-pt&c=wav&src=texto”,它会返回一个 wav 文件......
所以,我的问题是:
我的代码做错了什么,或者如果不可能这样,python怎么能说话?
请耐心等待我,我只有 18 岁,我不会说英语,因为我是葡萄牙人......
答:
3赞
jfs
10/25/2015
#1
您可以将远程 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
在 Windows 上,您可以在没有外部应用程序的情况下直接在 Python 中使用 wav 文件来代替或播放 wav 文件:os.startfile()
webbrowser.open()
import winsound
winsound.PlaySound('speech.wav', winsound.SND_FILENAME)
您的代码至少存在两个问题:
- 您应该将文件名(字符串)传递给函数,而不是对象。
pyglet.media.load()
HTTPResponse
pyglet
无论如何都可能无法播放:我的系统出现错误。pyglet.media.riff.RIFFFormatException: Size of format chunk is incorrect.
您也可以在不保存磁盘的情况下播放远程 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()
import wave
from contextlib import closing
import pyaudio # Windows: py -m pip install pyaudio
# $ sudo apt-get install python{,3}-pyaudio
player = None
def playwav(path_or_file):
global player
if player is None:
player = pyaudio.PyAudio()
with closing(wave.open(path_or_file, 'rb')) as wavfile, \
closing(player.open(
format=player.get_format_from_width(wavfile.getsampwidth()),
channels=wavfile.getnchannels(),
rate=wavfile.getframerate(),
output=True)) as stream:
while True:
data = wavfile.readframes(1024) # read 1024 frames at once
if not data: # EOF
break
stream.write(data)
评论
0赞
DiogoSaraiva
10/25/2015
非常感谢,它现在正在工作......再次感谢你,祝你有美好的一天
0赞
jfs
10/25/2015
@DiogoSaraiva:顺便说一句,如果你不需要本地WAV文件,那么你可以直接传递HTTP URL,而不必先将音频文件保存到磁盘。webbrowser.open()
0赞
DiogoSaraiva
10/25/2015
好的,但我不想打开外部应用程序来播放 wav...谢谢
评论