直接从 python 程序播放音频(文本到语音)

Playing audio directly from a python program (text to speech)

我想知道如何从 python 程序播放音频而不需要将音频保存到我的计算机。声音是在 python 程序中创建的,只需要播放并在之后立即停止。

我已经尝试使用 pygame、playsound、subprocess、gTTS 和其他各种方法,但都没有成功。

gTTS "works" 但只保存音频不播放

我也在使用 python 3(我更新于 6/18/18)

PyAudio 尝试对我不起作用。但这是我的代码:

import subprocess 
from gtts import gTTS 
if choose in card.keys(): 
  tts = gTTS(text = choose, lang = 'en') 
  tts.save(audio_eng) 
  checker(guess, choose, card, pract_one, good_count, bad_count, pract_two) 
  return_code = subprocess.call(["afplay", audio_eng])#, shell= True) 

我认为用于这种事情的主要库是PyAudio。它建立在我用过很多次的 portaudio(一个 C 库)之上。

如果您已经在 Python 中生成了音频,那么您可以简单地将其传递给输出,类似于 PyAudio 文档 (Blocking mode Audio I/O) 中的示例。这将停止其他进程的发生,直到音频文件播放完毕。

"""PyAudio Example: Play a wave file."""

import pyaudio
import wave
import sys

CHUNK = 1024


# wf = wave.open(sys.argv[1], 'rb') # Original example
wf = your_audio_data_array

# instantiate PyAudio (1)
p = pyaudio.PyAudio()

# open stream (2)
stream = p.open(format=p.get_format_from_width(your_audio_data_samplewidth),
                channels=your_audio_data_nChannels,
                rate=your_audio_data_framerate,
                output=True)

# read data
data = wf # your_audio_data_array

# play stream (3)
while len(data) > 0:
    stream.write(data)
    # data = wf.readframes(CHUNK) # read more data if you want to stream another buffer

# stop stream (4)
stream.stop_stream()
stream.close()

# close PyAudio (5)
p.terminate()

我已将此示例修改为您解释问题的方式;所以你只需将音频数据缓冲区传递给 PyAudio(你说你已经在 Python 中生成)。

要同时进行多个进程,请参阅他们的文档中的PyAudio回调模式I/O。