コード例 #1
0
class TextToSpeech():
    def __init__(self,
                 azureSpeechServiceKey,
                 voice='en-US-GuyNeural',
                 enableMemCache=False,
                 enableDiskCache=False):
        self.text2Speech = AzureSpeechServices(azureSpeechServiceKey, voice)
        self.voice = voice
        self.enableMemCache = enableMemCache
        self.enableDiskCache = enableDiskCache

        self.ttsAudio = {}

        self.startSoundTime = datetime.min
        self.soundLength = 0.0

        mixer.pre_init(frequency=16000, size=-16, channels=1)

        if not Path('.cache-audio').is_dir():
            os.mkdir('.cache-audio')

    def play(self, text):
        if text is None or text == '':
            return

        digestKey = hashlib.md5(text.encode()).hexdigest()

        audio = self.ttsAudio.get(digestKey) if self.enableMemCache else None

        if audio is None:
            cacheFileName = "{}-{}.wav".format(self.voice, digestKey)

            cacheFileName = os.path.join('.cache-audio', cacheFileName)

            if self.enableDiskCache and Path(cacheFileName).is_file():
                with open(cacheFileName, 'rb') as audiofile:
                    audio = audiofile.read()
            else:
                audio = self.text2Speech.get_audio(text)
                if audio is None:
                    print(
                        'Text to Speech problem: Check internet connection or Speech key'
                    )
                    return

                if self.enableDiskCache and audio is not None:
                    with open(cacheFileName, 'wb') as audiofile:
                        audiofile.write(audio)
            if self.enableMemCache:
                self.ttsAudio[digestKey] = audio

        mixer.init()

        self.sound = mixer.Sound(audio)
        self.sound.play()
        time.sleep(self.sound.get_length())

        mixer.quit()
コード例 #2
0
class TextToSpeech():
    def __init__(self,
                 azureSpeechServiceKey,
                 voice='en-US-Guy24kRUS',
                 azureTranslatorServiceKey=None,
                 translateToLanguage=None,
                 enableMemCache=False,
                 enableDiskCache=False):
        self.text2Speech = AzureSpeechServices(azureSpeechServiceKey, voice)
        self.translateText = AzureTranslationServices(
            azureTranslatorServiceKey, translateToLanguage)

        self.azureTranslatorServiceKey = azureTranslatorServiceKey
        self.translateToLanguage = translateToLanguage
        self.voice = voice
        self.enableMemCache = enableMemCache
        self.enableDiskCache = enableDiskCache

        self.ttsAudio = {}

        self.startSoundTime = datetime.min
        self.soundLength = 0.0

        if not Path('.cache-audio').is_dir():
            os.mkdir('.cache-audio')

    def _playAudio(self, audio):
        CHUNK = 1024

        f = io.BytesIO()
        f.write(audio)
        f.seek(0)
        wf = wave.Wave_read(f)

        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 != b'':
            stream.write(data)
            data = wf.readframes(CHUNK)

        stream.stop_stream()
        stream.close()
        p.terminate()

    def play(self, text):
        if text is None or text == '':
            return

        digestKey = hashlib.md5(text.encode()).hexdigest()

        audio = self.ttsAudio.get(digestKey) if self.enableMemCache else None

        if audio is None:
            cacheFileName = "{}-{}.wav".format(self.voice, digestKey)

            cacheFileName = os.path.join('.cache-audio', cacheFileName)

            if self.enableDiskCache and Path(cacheFileName).is_file():
                with open(cacheFileName, 'rb') as audiofile:
                    audio = audiofile.read()
            else:
                if self.azureTranslatorServiceKey is not None and self.translateToLanguage is not None:
                    translatedText = self.translateText.translate(text)
                    if translatedText is None:
                        print(
                            'Text to Speech problem: Check internet connection or Translation key or language'
                        )
                        return
                else:
                    translatedText = text

                audio = self.text2Speech.get_audio(translatedText)
                if audio is None:
                    print(
                        'Text to Speech problem: Check internet connection or Speech key'
                    )
                    return

                if self.enableDiskCache and audio is not None:
                    with open(cacheFileName, 'wb') as audiofile:
                        audiofile.write(audio)
            if self.enableMemCache:
                self.ttsAudio[digestKey] = audio

        self._playAudio(audio)