Проблема в том, что vl c не читает весь файл, но понемногу, поэтому, если вы удалите файл только тогда, когда он начнет воспроизводиться, он потерпит неудачу. Решение состоит в том, чтобы удалить файл в конце воспроизведения, и когда вы укажете, что хотите использовать PyQt5, вы можете использовать QTimer, который постоянно проверяет состояние проигрывателя.
from datetime import datetime
import os
import sys
import threading
from gtts import gTTS
from vlc import MediaPlayer
from PyQt5 import QtCore, QtWidgets
CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
class ConverterWorker(QtCore.QObject):
finished = QtCore.pyqtSignal(str)
def convert(self, text, lang):
threading.Thread(target=self._convert, args=(text, lang), daemon=True).start()
def _convert(self, text, lang):
tts = gTTS(text=text, lang=lang)
now = datetime.now()
file_name = "sample_{}.mp3".format(now.strftime("%b-%d-%Y-%H%M%S"))
path = os.path.join(CURRENT_DIR, file_name)
tts.save(path)
self.finished.emit(path)
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.converter = ConverterWorker()
self.player = MediaPlayer()
self.timer = QtCore.QTimer(interval=100, timeout=self.on_timeout)
self.path = ""
self.lineedit = QtWidgets.QLineEdit()
self.button = QtWidgets.QPushButton(self.tr("Start"))
lay = QtWidgets.QHBoxLayout(self)
lay.addWidget(self.lineedit)
lay.addWidget(self.button)
self.button.clicked.connect(self.on_clicked)
self.converter.finished.connect(self.on_finished)
text = (
"Bonjour je m'appelle Antoine et j'habite à Montréal au Québec. Ce soir je serai à "
"la maison et je pourrai enfin voir mes enfants."
)
self.lineedit.setText(text)
@QtCore.pyqtSlot()
def on_clicked(self):
self.converter.convert(self.lineedit.text(), "fr")
self.button.setEnabled(False)
@QtCore.pyqtSlot(str)
def on_finished(self, path):
self.path = path
media = self.player.get_instance().media_new(path)
self.player.set_media(media)
self.player.play()
self.timer.start()
@QtCore.pyqtSlot()
def on_timeout(self):
if not self.player.is_playing():
self.timer.stop()
self.button.setEnabled(True)
if os.path.isfile(self.path):
os.remove(self.path)
self.path = ""
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.resize(640, 60)
w.show()
sys.exit(app.exec_())