Synthèse vocale de Google

Utilisation de Google Text-to-Speech avec Python sans enregistrer dans un fichier.

C05348A3-9AB8-42C9-A6E0-81DB3AC59FEB
           

Le moteur Google Text-to-Speech est toujours de loin la voix la meilleure et la plus naturelle disponible sur le marché. Bien qu'il existe de nombreux exemples d'utilisation de la bibliothèque TTS avec Python, tous supposent que vous souhaitez enregistrer le clip audio résultant dans un fichier .mp3 afin que vous puissiez le lire.

Enregistrer le fichier pour lire le son puis le supprimer ne semble pas être un gros problème, mais sur un Raspberry Pi utilisant une carte SD avec un nombre limité de cycles de lecture et d'écriture, cela ne semble pas être une bonne idée. Je cherchais donc une solution pour lire le flux audio, et c'est le moyen le plus fiable que j'ai trouvé pour le faire.

Ce code suppose que vous êtes déjà inscrit au service Google Text-to-Speech et que vous avez obtenu le fichier GOOGLE_APPLICATION_CREDENTIALS .json approprié. Reportez-vous à la documentation Google pour savoir comment procéder.

Les bibliothèques Pygame seront également utilisées pour exécuter ce script, veuillez également vous référer à leur documentation pour savoir comment l'installer sur votre système.

from google.cloud import texttospeech
import pygame
import io
import os
os.putenv('DISPLAY', ':0.0')
os.environ["SDL_VIDEODRIVER"] = "dummy"
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = os.path.expanduser("~/<your_credential_file>.json")
 
# Instantiates a client
client = texttospeech.TextToSpeechClient()
# response = client.list_voices()
# print(response)
 
# Set the text input to be synthesized
synthesis_input = texttospeech.types.SynthesisInput(text="Knock knock! Why did the duck cross the road?")
 
# Build the voice request, select the language code ("en-US") and the ssml
voice = texttospeech.types.VoiceSelectionParams(
    language_code='en-US',
    name='en-US-Wavenet-F',
    ssml_gender=texttospeech.enums.SsmlVoiceGender.FEMALE)
 
# Select the type of audio file you want returned
audio_config = texttospeech.types.AudioConfig(
    audio_encoding=texttospeech.enums.AudioEncoding.MP3)
 
# Perform the text-to-speech request on the text input with the selected
# voice parameters and audio file type
response = client.synthesize_speech(synthesis_input, voice, audio_config)
 
# # The response's audio_content is binary.
# with open('output.mp3', 'wb') as out:
#     # Write the response to the output file.
#     out.write(response.audio_content)
#     print('Audio content written to file "output.mp3"')
 
freq = 24000    # audio CD quality
bitsize = -16   # unsigned 16 bit
channels = 2    # 1 is mono, 2 is stereo
buffer = 2048   # number of samples (experiment to get right sound)
pygame.mixer.init(freq, bitsize, channels, buffer)
pygame.mixer.music.set_volume(1.0)
pygame.display.set_mode((1, 1))
 
pygame.mixer.init()
pygame.init()  # this is needed for pygame.event.* and needs to be called after mixer.init() otherwise no sound is played
with io.BytesIO() as f:  # use a memory stream
    f.write(response.audio_content)
    f.seek(0)
    pygame.mixer.music.load(f)
    pygame.mixer.music.set_endevent(pygame.USEREVENT)
    pygame.event.set_allowed(pygame.USEREVENT)
    pygame.mixer.music.play()
    pygame.event.wait()  # play() is asynchronous. This wait forces the speaking to be finished before closing f and returning
    while pygame.mixer.music.get_busy():
        pygame.time.Clock().tick(10)
 
pygame.mixer.music.fadeout(1000)
pygame.mixer.music.stop()
Commentaires publiés : 0

Tagged with:
text-to-speech