📅  最后修改于: 2023-12-03 15:22:16.094000             🧑  作者: Mango
在 Python 中,我们可以使用 pyttsx 模块来进行语音合成,实现电脑读出文字的效果。不过,如果我们只是想直接播放一段音频,该怎么办呢?这时,pyttsx 就会有一些不必要的开销,效率也会降低。我们可以使用另外一个称为 pyttsx3 的模块,它专门用于文本转语音的库,在 Windows、Mac 和 Linux 上都可以使用。本文将介绍如何使用 pyttsx3 模块来播放音频。
在使用 pyttsx3 模块之前,需要先安装它。可以使用 pip 工具来安装:
pip install pyttsx3
pyttsx3 模块提供了一个简单的接口来完成语音合成。我们可以使用 pyttsx3.init()
方法来初始化语音合成引擎,并调用 say()
方法来播放文本。调用 runAndWait()
方法可以让引擎等待播放完成。
import pyttsx3
engine = pyttsx3.init()
engine.say('Hello, World!')
engine.runAndWait()
运行这段代码,我们可以听到电脑朗读出 "Hello, World!"。
如果我们想要播放一段长音频,而不是每次调用都等待播放完成,可以使用 engine.startLoop()
方法来开启循环,engine.iterate()
方法来处理每个事件,engine.endLoop()
方法来关闭循环。这样可以使程序在后台持续运行,并且可以及时响应用户的其他操作。
import pyaudio
import wave
import time
import threading
import pyttsx3
class AudioPlayer:
def __init__(self):
self.is_playing = False
self.thread = None
def play(self):
self.is_playing = True
filename = "file.wav"
chunk = 1024
wf = wave.open(filename, 'rb')
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
data = wf.readframes(chunk)
while data and self.is_playing:
stream.write(data)
data = wf.readframes(chunk)
stream.stop_stream()
stream.close()
p.terminate()
self.is_playing = False
def start(self):
if not self.is_playing:
self.thread = threading.Thread(target=self.play, args=())
self.thread.start()
def stop(self):
self.is_playing = False
def text_to_speech(text):
engine = pyttsx3.init()
engine.setProperty('rate', 150)
engine.setProperty('voice', 'zh')
engine.say(text)
engine.save_to_file(text, 'file.wav')
engine.runAndWait()
if __name__ == '__main__':
text = '测试音频播放!This is a test for audio playing!'
text_to_speech(text)
player = AudioPlayer()
player.start()
time.sleep(5)
player.stop()
使用 pyttsx3 模块直接播放音频非常简单。只需要使用 pyttsx3.init()
方法进行初始化,然后使用 pyttsx3.runAndWait()
或 pyttsx3.startLoop()
方法进行语音合成和播放。如果需要播放长音频,我们可以使用线程来持续播放,并用 pyaudio
库来控制音频输出。