2017-05-27 15 views
1

私はPygameのミキサーシステムが初期化されているので、終了するタイミングを知ることができるようにする必要があります。Pygameが正しく終了していないようです。私は現在、Windows Media Playerに依存する前のように、すべてのオペレーティングシステムで動作するようになっているPythonのテキスト読み上げプログラムを使用しています。私はこの目的を達成するためにPygameを使用しようとしていますが、2回目にPygameを使用した後は正しく終了しません。最初に.mp3ファイルを読み込むと、Pygameを正常に終了してプログラムがファイルを削除できるようになりますが、ユーザーがもう一度試して、別のテキスト読み上げを選択すると、Pygameが再初期化され、ファイルを開き、ファイルを再生します。ファイルの再生が終了すると、Pygameを終了しようとしますが、Pygameは正常に終了せず、プ​​ログラムは現在使用中の.mp3ファイルを削除できません。Pygameでミキサーシステムが初期化されているかどうかを確認するには?

import os 
import time 
import sys 
import getpass 
import pip 
from contextlib import contextmanager 


my_file = "Text To Speech.mp3" 
username = getpass.getuser() 


@contextmanager 
def suppress_output(): 

    with open(os.devnull, "w") as devnull: 
     old_stdout = sys.stdout 
     sys.stdout = devnull 
     try: 
      yield 
     finally: 
      sys.stdout = old_stdout 


def check_and_remove_file(): 

    if os.path.isfile(my_file): 
     os.remove(my_file) 


def input_for_tts(message): 

    try: 

     tts = gTTS(text = input(message)) 
     tts.save('Text To Speech.mp3') 
     audio = MP3(my_file) 
     audio_length = audio.info.length 
     pygame.mixer.init() 
     pygame.mixer.music.load(my_file) 
     pygame.mixer.music.play() 
     time.sleep((audio_length) + 0.5) 
     pygame.mixer.music.stop() 
     pygame.mixer.quit() 
     pygame.quit() 
     check_and_remove_file() 

    except KeyboardInterrupt: 

     check_and_remove_file() 
     print("\nGoodbye!") 
     sys.exit() 


with suppress_output(): 

    pkgs = ['mutagen', 'gTTS', 'pygame'] 
    for package in pkgs: 
     if package not in pip.get_installed_distributions(): 
      pip.main(['install', package]) 


import pygame 
from pygame.locals import * 
from gtts import gTTS 
from mutagen.mp3 import MP3 


check_and_remove_file() 


input_for_tts("Hello there " + username + ". This program is\nused to output the user's input as speech.\nPlease input something for the program to say: ") 


while True: 

    try: 

     answer = input("\nDo you want to repeat? (Y/N) ").strip().lower() 
     if answer in ["n", "no", "nah", "nay", "course not"] or "no " in answer or "nah " in answer or "nay " in answer or "course not " in answer: 
      check_and_remove_file() 
      sys.exit() 
     elif answer in ["y", "yes", "yeah", "course", "ye", "yea", "yh"] or "yes " in answer or "yeah " in answer or "course " in answer or "ye " in answer or "yea " in answer or "yh " in answer: 
      input_for_tts("\nPlease input something for the program to say: ") 
     else: 
      print("\nSorry, I didn't understand that. Please try again with either Y or N.") 

    except KeyboardInterrupt: 

     check_and_remove_file() 
     print("\nGoodbye!") 
     sys.exit() 

答えて

1

pygame.mixerが初期化されるかどうかを確認するには、あなたがする必要があるすべては、それが初期化されていないされていない限り、それはNoneを返します。その場合には、現在再生中の音声のデータが返されるpygame.mixer.get_init()です。

出典:あなたはミキサーを初期化しようとするかのhttps://www.pygame.org/docs/ref/mixer.html#pygame.mixer.get_init

+0

が、私はむしろちょうど(私は、オーディオデバイスが接続されているかどうかを知ることができ、それは初期化かされるためのフラグを宣言したときに何のオーディオありません出力が有効な場合、pygame.error例外が発生します)。 – Frogboxe

+0

ありがとう、それは非常に有用です。 Pygame.errorを呼び出すと、コードが完了して終了できないことをユーザーに伝えるように、単に初期化するときに 'try-except'を追加しました。 'pygame.mixer.get_init()'が必要なので、コードが使用するファイルを削除しようとしたときに 'pygame.mixer'を終了する必要があるかどうかを知ることができます。 – Gameskiller01

関連する問題