1

基本上我想要的是 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 岁,我不会说英语,因为我是葡萄牙人...

4

1 回答 1

3

您可以在本地保存远程 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 中使用os.startfile()而不是webbrowser.open()或在没有外部应用程序的情况下播放 wav 文件:

import winsound

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

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

  1. 您应该将文件名(字符串)传递给pyglet.media.load()函数,而不是HTTPResponse对象。
  2. 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)
于 2015-10-24T21:48:49.370 回答