Преобразование текста в речь и сохранение в переменную
Пробую преобразование текста в речь на python. Использовал вариант через pyttsx3 и через win api win32com.client.Dispatch("SAPI.SpVoice")
. В целом реализация не сложная, но единственное не могу найти способ засунуть полученный объект в переменную, а точнее текст → аудио → аудио в переменной.
Подскажите варианты, или идеи, хотя бы, куда копать.
Пример через pyttsx3:
import pyttsx3
engine = pyttsx3.init()
engine.save_to_file('Hello World' , 'test.mp3')
engine.runAndWait()
У этой библиотеки есть сохранение в файл, сама переменная engine - это объект класса pyttsx3. Его нет смысла засовывать в переменную.
Второй вариант - через WinApi:
speaker = win32com.client.Dispatch("SAPI.SpVoice")
text = "Введите текст, который вы хотели бы озвучить"
print(speaker.SpeakStream)
Тут получается воспроизвести текст с помощью встроенного в windows голоса. Но только лишь воспроизведение. Не пойму, как преобразовать объект speaker в аудио.
В целом, вопрос такой - как с помощью python перевести речь в аудио, и это аудио засунуть в переменную, что бы дальше с ней работать. И условие таково, что необходимо использовать синтезатор самого ПК (библиотеки наподобие gTTS не подходят).
Ответы (2 шт):
Не считаю, что время записи/чтения файла хоть сколько нибудь сравнимы с временем генерациии аудио потока. Однако вот пример кода с использованием библиотеки gtts
from gtts import gTTS
import io
tts = gTTS('hello', lang='en')
b = io.BytesIO()
tts.write_to_fp(b)
print(b.getvalue()) // выведет b'\xff\xf3D\xc4\x00\x11\xa1*\x10...'
import comtypes.client
tts = comtypes.client.CreateObject("SAPI.SPVoice")
stream = comtypes.client.CreateObject("SAPI.SpMemoryStream")
constants = comtypes.client.Constants(tts)
stream.Format.Type = constants.enums.get('SpeechAudioFormatType')['SAFT16kHz16BitMono']
tts.AudioOutputStream = stream
tts.Speak(str("hello word").encode("utf-8").decode("utf-8"))
stream.Seek(0)
sound = bytes(stream.GetData())
Использованы SAPI.SPVoice и SAPI.SpMemoryStream для сохранения в оперативку. Байты без заголовка WAV - поэтому указывайте формат когда пошлёте их в кодек.
Другие форматы wav в SpeechAudioFormatType