📜  使用 pytts 直接播放声音 - Python (1)

📅  最后修改于: 2023-12-03 15:22:16.094000             🧑  作者: Mango

使用 pytts 直接播放声音 - Python

在 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 库来控制音频输出。