Cómo usar el plugin
El plugin Runtime Text To Speech sintetiza texto en voz utilizando modelos de voz descargables. Estos modelos se gestionan en la configuración del plugin dentro del editor, se descargan y empaquetan para su uso en tiempo de ejecución. Sigue los pasos a continuación para comenzar.
Lado del editor
Descarga los modelos de voz apropiados para tu proyecto como se describe aquí. Puedes descargar múltiples modelos de voz al mismo tiempo.
Lado de ejecución
Crea el sintetizador usando la función CreateRuntimeTextToSpeech
. Asegúrate de mantener una referencia a él (por ejemplo, como una variable separada en Blueprints o UPROPERTY en C++) para evitar que sea recolectado por el recolector de basura.
- Blueprint
- C++
// Create the Runtime Text To Speech synthesizer in C++
URuntimeTextToSpeech* Synthesizer = URuntimeTextToSpeech::CreateRuntimeTextToSpeech();
// Ensure the synthesizer is referenced correctly to prevent garbage collection (e.g. as a UPROPERTY)
Una vez que el sintetizador está creado, puedes llamar a cualquiera de las siguientes funciones para sintetizar texto:
Text To Speech (By Name)
(TextToSpeechByName
in C++)Text To Speech (By Object)
(TextToSpeechByObject
in C++)
Por nombre
- Blueprint
- C++
La función Text To Speech (Por nombre)
es más conveniente en Blueprints a partir de UE 5.4. Permite seleccionar modelos de voz desde una lista desplegable de los modelos descargados. En versiones de UE inferiores a 5.3, esta lista desplegable no aparece, por lo que si estás utilizando una versión más antigua, tendrás que iterar manualmente sobre la matriz de modelos de voz devuelta por GetDownloadedVoiceModels
para seleccionar el que necesites.
En C++, la selección de modelos de voz puede ser un poco más compleja debido a la falta de una lista desplegable. Puedes usar la función GetDownloadedVoiceModelNames
para recuperar los nombres de los modelos de voz descargados y seleccionar el que necesitas. Después, puedes llamar a la función TextToSpeechByName
para sintetizar texto usando el nombre del modelo de voz seleccionado.
// Assuming "Synthesizer" is a valid and referenced URuntimeTextToSpeech object (ensure it is not eligible for garbage collection during the callback)
TArray<FName> DownloadedVoiceNames = URuntimeTTSLibrary::GetDownloadedVoiceModelNames();
// If there are downloaded voice models, use the first one to synthesize text, just as an example
if (DownloadedVoiceNames.Num() > 0)
{
const FName& VoiceName = DownloadedVoiceNames[0]; // Select the first available voice model
Synthesizer->TextToSpeechByName(VoiceName, 0, TEXT("Text example 123"), FOnTTSResultDelegateFast::CreateLambda([](bool bSuccess, const TArray<uint8>& AudioData, int32 SampleRate, int32 NumChannels)
{
UE_LOG(LogTemp, Log, TEXT("TextToSpeech result: %s, AudioData size: %d, SampleRate: %d, NumChannels: %d"), bSuccess ? TEXT("Success") : TEXT("Failed"), AudioData.Num(), SampleRate, NumChannels);
}));
return;
}
Por Objeto
- Blueprint
- C++
La función Text To Speech (By Object)
funciona en todas las versiones de Unreal Engine, pero presenta los modelos de voz como una lista desplegable de referencias de activos, lo cual es menos intuitivo. Este método es ideal para UE 5.3 y versiones anteriores, o si tu proyecto requiere una referencia directa a un activo de modelo de voz por cualquier razón.
Si has descargado los modelos pero no puedes verlos, abre el menú desplegable de Voice Model, haz clic en la configuración (icono de engranaje), y habilita tanto Show Plugin Content como Show Engine Content para que los modelos sean visibles.
En C++, la selección de modelos de voz puede ser un poco más compleja debido a la falta de una lista desplegable. Puedes usar la función GetDownloadedVoiceModelNames
para obtener los nombres de los modelos de voz descargados y seleccionar el que necesites. Luego, puedes llamar a la función GetVoiceModelFromName
para obtener el objeto del modelo de voz y pasarlo a la función TextToSpeechByObject
para sintetizar texto.
// Assuming "Synthesizer" is a valid and referenced URuntimeTextToSpeech object (ensure it is not eligible for garbage collection during the callback)
TArray<FName> DownloadedVoiceNames = URuntimeTTSLibrary::GetDownloadedVoiceModelNames();
// If there are downloaded voice models, use the first one to synthesize text, for example
if (DownloadedVoiceNames.Num() > 0)
{
const FName& VoiceName = DownloadedVoiceNames[0]; // Select the first available voice model
TSoftObjectPtr<URuntimeTTSModel> VoiceModel;
if (!URuntimeTTSLibrary::GetVoiceModelFromName(VoiceName, VoiceModel))
{
UE_LOG(LogTemp, Error, TEXT("Failed to get voice model from name: %s"), *VoiceName.ToString());
return;
}
Synthesizer->TextToSpeechByObject(VoiceModel, 0, TEXT("Text example 123"), FOnTTSResultDelegateFast::CreateLambda([](bool bSuccess, const TArray<uint8>& AudioData, int32 SampleRate, int32 NumChannels)
{
UE_LOG(LogTemp, Log, TEXT("TextToSpeech result: %s, AudioData size: %d, SampleRate: %d, NumChannels: %d"), bSuccess ? TEXT("Success") : TEXT("Failed"), AudioData.Num(), SampleRate, NumChannels);
}));
return;
}
Selección de Vocero
Ambas funciones de Texto a Voz aceptan un parámetro opcional de ID de vocero, lo cual es útil cuando se trabaja con modelos de voz que soportan múltiples voceros. Puedes usar las funciones GetSpeakerCountFromVoiceModel o GetSpeakerCountFromModelName para verificar si tu modelo de voz elegido soporta múltiples voceros. Si hay múltiples voceros disponibles, simplemente especifica el ID del vocero deseado al llamar a las funciones de Texto a Voz. Algunos modelos de voz ofrecen gran variedad - por ejemplo, English LibriTTS incluye más de 900 diferentes voceros para elegir.
Reproducción
El delegado On Speech Result
proporciona el audio sintetizado como datos PCM en formato flotante (como un arreglo de bytes en Blueprints o TArray<uint8>
en C++), junto con la Frecuencia de Muestreo
y el Número de Canales
. Puedes procesar estos datos según sea necesario.
Para la reproducción, se recomienda utilizar el plugin Runtime Audio Importer para convertir datos de audio en bruto en una onda de sonido reproducible. Sin embargo, esto es opcional, y puedes manejar los datos de audio PCM en bruto con tu propia solución si lo deseas.
Para usar Runtime Audio Importer, llama a Import Audio From RAW Buffer
con el RAW Buffer
(del delegado On Speech Result
), la Frecuencia de Muestreo
, y el Número de Canales
para generar una onda de sonido.
Una vez que tengas la onda de sonido, puedes usarla como cualquier onda de sonido regular en Unreal Engine - reproduciéndola, guardándola en un archivo de juego guardado, o procesándola más.
- Blueprint
- C++
Aquí tienes un ejemplo de cómo podrían verse los nodos de Blueprint para sintetizar texto y reproducir el audio (Nodos copiables):
Aquí tienes un ejemplo de cómo sintetizar texto y reproducir el audio en C++:
// Assuming "Synthesizer" is a valid and referenced URuntimeTextToSpeech object (ensure it is not eligible for garbage collection during the callback)
// Ensure "this" is a valid and referenced UObject (must not be eligible for garbage collection during the callback)
TArray<FName> DownloadedVoiceNames = URuntimeTTSLibrary::GetDownloadedVoiceModelNames();
// If there are downloaded voice models, use the first one to synthesize text, for example
if (DownloadedVoiceNames.Num() > 0)
{
const FName& VoiceName = DownloadedVoiceNames[0]; // Select the first available voice model
Synthesizer->TextToSpeechByName(VoiceName, 0, TEXT("Text example 123"), FOnTTSResultDelegateFast::CreateLambda([this](URuntimeTextToSpeech* TextToSpeechInstance, bool bSuccess, const TArray<uint8>& AudioData, int32 SampleRate, int32 NumOfChannels)
{
if (!bSuccess)
{
UE_LOG(LogTemp, Error, TEXT("TextToSpeech failed"));
return;
}
// Create the Runtime Audio Importer to process the audio data
URuntimeAudioImporterLibrary* RuntimeAudioImporter = URuntimeAudioImporterLibrary::CreateRuntimeAudioImporter();
// Prevent the RuntimeAudioImporter from being garbage collected by adding it to the root (you can also use a UPROPERTY, TStrongObjectPtr, etc.)
RuntimeAudioImporter->AddToRoot();
RuntimeAudioImporter->OnResultNative.AddWeakLambda(RuntimeAudioImporter, [this](URuntimeAudioImporterLibrary* Importer, UImportedSoundWave* ImportedSoundWave, ERuntimeImportStatus Status)
{
// Once done, remove it from the root to allow garbage collection
Importer->RemoveFromRoot();
if (Status != ERuntimeImportStatus::SuccessfulImport)
{
UE_LOG(LogTemp, Error, TEXT("Failed to import audio, status: %s"), *UEnum::GetValueAsString(Status));
return;
}
// Play the imported sound wave (ensure a reference is kept to prevent garbage collection)
UGameplayStatics::PlaySound2D(GetWorld(), ImportedSoundWave);
});
RuntimeAudioImporter->ImportAudioFromRAWBuffer(AudioData, ERuntimeRAWAudioFormat::Float32, SampleRate, NumOfChannels);
}));
return;
}
El plugin Runtime Audio Importer también ofrece características adicionales, como exportar datos de audio a un archivo, pasarlos a SoundCue, MetaSound y más. Para más detalles, consulta la documentación de Runtime Audio Importer.