Как и спользовать плагин
Плагин Runtime Text To Speech синтезирует текст в речь с использованием загружаемых моделей голоса. Эти модели управляются в настройках плагина внутри редактора, загружаются и упаковываются для использования во время выполнения. Следуйте приведённым ниже шагам, чтобы начать.
Сторона редактора
Загрузите соответствующие модели голоса для вашего проекта, как описано здесь. Вы можете загружать несколько моделей голоса одновременно.
Сторона выполнения
Создайте синтезатор с помощью функции CreateRuntimeTextToSpeech
. Убедитесь, что сохранили на него ссылку (например, как отдельную переменную в Blueprints или UPROPERTY в C++), чтобы предотвратить его сборку мусора.
- 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)
После создания синтезатора вы можете вызвать одну из следующих функций для синтеза текста:
Text To Speech (By Name)
(TextToSpeechByName
в C++)Text To Speech (By Object)
(TextToSpeechByObject
в C++)
По имени
- Blueprint
- C++
Функция Text To Speech (By Name)
более удобна в Blueprints начиная с UE 5.4. Она позволяет выбирать голосовые модели из выпадающего списка загруженных моделей. В UE версиях ниже 5.3 этот список не отображается, поэтому, если вы используете более старую версию, вам нужно вручную перебирать массив голосовых моделей, возвращаемый GetDownloadedVoiceModels
, чтобы выбрать нужную.
В C++ выбор голосовых моделей может быть немного сложнее из-за отсутствия выпадающего списка. Вы можете использовать функцию GetDownloadedVoiceModelNames
, чтобы получить имена загруженных голосовых моделей и выбрать нужную. Затем вы можете вызвать функцию TextToSpeechByName
, чтобы синтезировать текст, используя выбранное имя голосовой модели.
// 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;
}
По Объекту
- Blueprint
- C++
Функция Text To Speech (By Object)
работает во всех версиях Unreal Engine, но представляет голосовые модели в виде выпадающего списка с ссылками на ассеты, что менее интуитивно. Этот метод идеально подходит для UE 5.3 и более ранних версий, или если вашему проекту требуется прямая ссылка на ассет голосовой модели по какой-либо причине.
Если вы загрузили модели, но не видите их, откройте выпадающий список Voice Model, нажмите на значок настроек (шестерёнка) и включите Show Plugin Content и Show Engine Content, чтобы модели стали видимыми.
В C++ выбор голосовых моделей может быть немного сложнее из-за отсутствия выпадающего списка. Вы можете использовать функцию GetDownloadedVoiceModelNames
, чтобы получить список загруженных голосовых моделей и выбрать нужную. Затем вызовите функцию GetVoiceModelFromName
, чтобы получить объект голосовой модели и передать его в функцию TextToSpeechByObject
для синтеза текста.
// 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;
}
Выбор диктора
Обе функции Text To Speech принимают необязательный параметр ID диктора, что полезно при работе с голосовыми моделями, поддерживающими несколько дикторов. Вы можете использовать функции GetSpeakerCountFromVoiceModel
или GetSpeakerCountFromModelName
, чтобы проверить, поддерживает ли выбранная вами голосовая модель несколько дикторов. Если доступно несколько дикторов, просто укажите желаемый ID диктора при вызове функций Text To Speech. Некоторые голосовые модели предоставляют широкий выбор – например, English LibriTTS включает более 900 различных дикторов.
Воспроизведение
Делегат On Speech Result
предоставляет синтезированное аудио в формате PCM (в виде массива байтов в Blueprints или TArray<uint8>
в C++), а также параметры Sample Rate
и Num Of Channels
. Вы можете обработать эти данные по своему усмотрению.
Для воспроизведения рекомендуется использовать плагин Runtime Audio Importer
, чтобы конвертировать необработанные аудиоданные в воспроизводимую sound wave. Однако это необязательно, и вы можете обработать RAW PCM аудио своими средствами.
Чтобы использовать Runtime Audio Importer, вызовите функцию Import Audio From RAW Buffer
, передав RAW Buffer (из делегата On Speech Result
), а также Sample Rate
и Num Of Channels
для генерации sound wave.
После получения sound wave, можно использовать его как любой стандартный sound wave в Unreal Engine – проигрывать, сохранять в save game file или выполнять дополнительную обработку.
- Blueprint
- C++
Вот пример, как могут выглядеть Blueprint-ноды для синтеза текста и воспроизведения аудио (Копируемые ноды):
Вот пример того, как синтезировать текст и воспроизводить аудио в 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;
}
Плагин Runtime Audio Importer также предоставляет дополнительные возможности, такие как экспорт аудиоданных в файл, передача их в SoundCue, MetaSound и другие. Для получения дополнительной информации ознакомьтесь с документацией Runtime Audio Importer.