2016-04-20 3 views
0

Я искал решение для воспроизведения mp3-файлов в python, и многие ответы stackoverflow (на другие вопросы), казалось, рекомендовали pyglet. Я пишу программу, которая берет фрагмент текста, разбивает его на отдельные слова, а затем загружает mp3-файлы этих слов (если они еще не загружены) с использованием gTT и воспроизводит их.Pyglet не уйдет после игры mp3

from pyglet import media, app, clock 
from gtts import gTTS 
import os 
import time 
from num2words import num2words 

cwd = os.getcwd() 
beep = media.load('beep.mp3', streaming = False) 

def get_mp3(text): 
    player = media.Player() 
    lowertext = text.lower()  
    words = lowertext.split()  
    player.queue(beep) 
    for word in words: 
     save_path = cwd + '\\tts_downloads\\{}.mp3'.format(word) 
     if os.path.isfile(save_path) == False: 
      tts = gTTS(word, 'en-us') 
      tts.save(save_path) 
     mp3 = media.load(save_path) 
     player.queue(mp3) 
    player.queue(beep) 
    player.play() 
    app.run() 

Однако я обнаружил, что после воспроизведения файлов пиглет не позволит моей программе прогрессировать. Как я могу выйти из приложения pyglet после завершения воспроизведения, чтобы мой код мог прогрессировать?

В качестве альтернативы есть другой способ, которым я могу воспроизводить mp3-файлы в python?

ответ

0

Это сумо, потому что app.run() - это бесконечный цикл, чтобы сохранить контекст GL в живом. Есть только один способ обойти это, и это создать свой собственный класс, который наследует свойства Pyglet.

Я дам вам образец кода, и если у вас возникнут вопросы, вы можете попросить прощения.

import pyglet 
from pyglet.gl import * 

# Optional audio outputs (Linux examples): 
# pyglet.options['audio'] = ('alsa', 'openal', 'silent') 
key = pyglet.window.key 

class main(pyglet.window.Window): 
    def __init__ (self): 
     super(main, self).__init__(800, 800, fullscreen = False) 
     self.x, self.y = 0, 0 

     self.bg = pyglet.sprite.Sprite(pyglet.image.load('background.jpg')) 
     self.sprites = {} 
     self.player = pyglet.media.Player() 
     self.alive = 1 

    def on_draw(self): 
     self.render() 

    def on_close(self): 
     self.alive = 0 

    def on_key_press(self, symbol, modifiers): 
     # Do something when a key is pressed? 
     # Pause the audio for instance? 
     # use `if symbol == key.SPACE: ...` 

     # This is just an example of how you could load the audio. 
     # You could also do a standard input() call and enter a string 
     # on the command line. 
     if symbol == key.ENTER: 
      self.player.queue(media.load('beep.mp3', streaming = False)) 
      if nog self.player.playing: 
       self.player.play() 
     if symbol == key.ESC: # [ESC] 
      self.alive = 0 

    def render(self): 
     self.clear() 
     self.bg.draw() 

     # self.sprites is a dictionary where you store sprites 
     # to be rendered, if you have any. 
     for sprite_name, sprite in self.sprites.items(): 
      sprite.draw() 

     self.flip() 

    def run(self): 
     while self.alive == 1: 
      self.render() 

      # -----------> This is key <---------- 
      # This is what replaces pyglet.app.run() 
      # but is required for the GUI to not freeze 
      # 
      event = self.dispatch_events() 
     self.player.delete() # Free resources. (Not really needed but as an example) 

x = main() 
x.run() 

Теперь это всего лишь самый простой пример загрузки аудиоисточников и воспроизведения их. Вы нажимаете Введите и что триггеры beep.mp3.

Как правило, вы также хотите подключить функцию к self.player.eos(), которая что-то делает, когда у вас заканчиваются источники.

Также обратите внимание, что он только звонит play() один раз, если он еще не воспроизводится. Это атрибуты, которые вы хотите соблюдать.

Ah и Escape выходит из приложения.

Смежные вопросы