Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Прив'язка до зовнішніх бібліотек
Модулі
Приклад Summator у Спеціальні модулі в C++ чудово підходить для невеликих спеціальних модулів, але що, якщо ви хочете використовувати більшу зовнішню бібліотеку? Давайте розглянемо приклад використання Festival, бібліотеки синтезу мовлення (перетворення тексту в мовлення), написаної на C++.
Щоб підключитися до зовнішньої бібліотеки, налаштуйте каталог модуля, подібний до прикладу Summator:
godot/modules/tts/
Далі ви створите файл заголовка з класом TTS:
#pragma once
#include "core/object/ref_counted.h"
class TTS : public RefCounted {
GDCLASS(TTS, RefCounted);
protected:
static void _bind_methods();
public:
bool say_text(String p_txt);
TTS();
};
Потім ви додасте файл cpp.
#include "tts.h"
#include <festival.h>
bool TTS::say_text(String p_txt) {
//convert Godot String to Godot CharString to C string
return festival_say_text(p_txt.ascii().get_data());
}
void TTS::_bind_methods() {
ClassDB::bind_method(D_METHOD("say_text", "txt"), &TTS::say_text);
}
TTS::TTS() {
festival_initialize(true, 210000); //not the best way to do it as this should only ever be called once.
}
Як і раніше, новий клас потрібно якось зареєструвати, тому необхідно створити ще два файли:
register_types.h
register_types.cpp
Важливо
Ці файли мають бути у папці верхнього рівня вашого модуля (поруч із файлами SCsub і config.py), щоб модуль було зареєстровано належним чином.
Ці файли повинні містити наступне:
void initialize_tts_module(ModuleInitializationLevel p_level);
void uninitialize_tts_module(ModuleInitializationLevel p_level);
/* yes, the word in the middle must be the same as the module folder name */
#include "register_types.h"
#include "core/object/class_db.h"
#include "tts.h"
void initialize_tts_module(ModuleInitializationLevel p_level) {
if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
return;
}
ClassDB::register_class<TTS>();
}
void uninitialize_tts_module(ModuleInitializationLevel p_level) {
// Nothing to do here in this example.
}
Далі вам потрібно створити файл SCsub, щоб система збірки скомпілювала цей модуль:
Import('env')
env_tts = env.Clone()
env_tts.add_source_files(env.modules_sources, "*.cpp") # Add all cpp files to the build
Вам потрібно буде встановити зовнішню бібліотеку на свій комп’ютер, щоб отримати файли бібліотеки .a. Дивіться офіційну документацію бібліотеки, щоб отримати конкретні інструкції щодо того, як це зробити для вашої операційної системи. Нижче ми навели команди встановлення для Linux для довідки.
sudo apt-get install festival festival-dev # Installs festival and speech_tools libraries
apt-cache search festvox-* # Displays list of voice packages
sudo apt-get install festvox-don festvox-rablpc16k festvox-kallpc16k festvox-kdlpc16k # Installs voices
Важливо
Голоси, які використовує Фестиваль (та будь-який інший потенційний зовнішній/сторонній ресурс), усі мають різні ліцензії та умови використання; деякі (якщо не більшість) із них можуть бути проблематичними з Godot, навіть якщо сама бібліотека фестивалю сумісна з ліцензією MIT. Перевірте ліцензії та умови використання.
Зовнішню бібліотеку також потрібно буде встановити всередині вашого модуля, щоб зробити вихідні файли доступними для компілятора, а також зберегти код модуля автономним. Бібліотеки festival та speech_tools можна встановити з каталогу modules/tts/ через git за допомогою таких команд:
git clone https://github.com/festvox/festival
git clone https://github.com/festvox/speech_tools
Якщо ви не хочете, щоб вихідні файли зовнішнього сховища надсилалися у ваш репозиторій, ви можете натомість зв’язатися з ними, додавши їх як підмодулі (з каталогу modules/tts/), як показано нижче:
git submodule add https://github.com/festvox/festival
git submodule add https://github.com/festvox/speech_tools
Важливо
Зауважте, що субмодулі Git не використовуються в репозиторії Godot. Якщо ви розробляєте модуль, який буде об’єднано з основним репозиторієм Godot, вам не слід використовувати підмодулі. Якщо ваш модуль не об’єднується, ви завжди можете спробувати реалізувати зовнішню бібліотеку як GDExtension.
Щоб додати каталоги include для перегляду компілятором, ви можете додати його до шляхів середовища:
# These paths are relative to /modules/tts/
env_tts.Append(CPPPATH=["speech_tools/include", "festival/src/include"])
# LIBPATH and LIBS need to be set on the real "env" (not the clone)
# to link the specified libraries to the Godot executable.
# This is an absolute path where your .a libraries reside.
# If using a relative path, you must convert it to a
# full path using a utility function, such as `Dir('...').abspath`.
env.Append(LIBPATH=[Dir('libpath').abspath])
# Check with the documentation of the external library to see which library
# files should be included/linked.
env.Append(LIBS=['Festival', 'estools', 'estbase', 'eststring'])
Якщо ви хочете додати спеціальні позначки компілятора під час створення вашого модуля, вам потрібно спочатку клонувати env, щоб він не додавав ці прапорці до всієї збірки Godot (що може спричинити помилки). Приклад SCsub із спеціальними прапорцями:
Import('env')
env_tts = env.Clone()
env_tts.add_source_files(env.modules_sources, "*.cpp")
# Append CCFLAGS flags for both C and C++ code.
env_tts.Append(CCFLAGS=['-O2'])
# If you need to, you can:
# - Append CFLAGS for C code only.
# - Append CXXFLAGS for C++ code only.
Кінцевий модуль має виглядати так:
godot/modules/tts/festival/
godot/modules/tts/libpath/libestbase.a
godot/modules/tts/libpath/libestools.a
godot/modules/tts/libpath/libeststring.a
godot/modules/tts/libpath/libFestival.a
godot/modules/tts/speech_tools/
godot/modules/tts/config.py
godot/modules/tts/tts.h
godot/modules/tts/tts.cpp
godot/modules/tts/register_types.h
godot/modules/tts/register_types.cpp
godot/modules/tts/SCsub
Користування модулем
Тепер ви можете використовувати ваш щойно створений модуль з будь-якого сценарію:
var t = TTS.new()
var script = "Hello world. This is a test!"
var is_spoken = t.say_text(script)
print('is_spoken: ', is_spoken)
І результат буде is_spoken: True, якщо текст озвучено.