Как использовать плагин
Плагин 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
in C++)Text To Speech (By Object)
(TextToSpeechByObject
in 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 в виде данных в формате float (как массив байт в Blueprints или TArray<uint8>
в C++), а также Sample Rate
и Num Of Channels
. Вы можете обработать эти данные по мере необходимости.
Для воспроизведения рекомендуется использовать плагин Runtime Audio Importer для преобразования необработанных аудиоданных в звуковую волну, пригодную для воспроизведения. Однако это необязательно, и вы можете обработать необработанные PCM аудиоданные с помощью собственно го решения, если хотите.
Чтобы использовать Runtime Audio Importer, вызовите Import Audio From RAW Buffer
с RAW Buffer
(из делегата On Speech Result
), Sample Rate
и Num Of Channels
, чтобы создать звуковую волну.
Как только у вас будет звуковая волна, вы можете использовать её, как любую обычную звуковую волну в Unreal Engine — воспроизводя, сохраняя в файл сохранения игры или проводя дальнейшую обработку.
- 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.