Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Binden an externe Bibliotheken

Module

Das Summator-Beispiel in Benutzerdefinierte Module in C++ ist großartig für kleine, benutzerdefinierte Module, aber was ist, wenn Sie eine größere, externe Bibliothek verwenden wollen? Schauen wir uns ein Beispiel mit Festival an, einer in C++ geschriebenen Sprachsynthese-Bibliothek (Text-to-Speech).

Richten Sie zum Binden an eine externe Bibliothek ein Modulverzeichnis ein, das dem Summator-Beispiel ähnelt:

godot/modules/tts/

Als nächstes werden Sie eine Header-Datei mit einer TTS-Klasse erstellen:

/* tts.h */

#ifndef GODOT_TTS_H
#define GODOT_TTS_H

#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();
};

#endif // GODOT_TTS_H

Und dann fügen Sie die cpp-Datei hinzu.

/* 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.
}

Nach wie vor muss die neue Klasse irgendwie registriert werden, sodass zwei weitere Dateien erstellt werden müssen:

register_types.h
register_types.cpp

Wichtig

Diese Dateien müssen sich im obersten Ordner Ihres Moduls befinden (neben Ihren Dateien SCsub und config.py), damit das Modul ordnungsgemäß registriert werden kann.

Diese Dateien sollten Folgendes enthalten:

/* register_types.h */

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 */
/* register_types.cpp */

#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.
}

Als nächstes muss eine SCsub Datei erstellt werden, damit das Buildsystem dieses Modul kompiliert:

# SCsub

Import('env')

env_tts = env.Clone()
env_tts.add_source_files(env.modules_sources, "*.cpp") # Add all cpp files to the build

Um die .a-Bibliotheksdateien zu erhalten, müssen Sie die externe Bibliothek auf Ihrem Rechner installieren. In der offiziellen Dokumentation der Bibliothek finden Sie genaue Anweisungen, wie Sie dies für Ihr Betriebssystem tun. Wir haben die Installationsbefehle für Linux unten als Referenz eingefügt.

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

Wichtig

Die Stimmen, die Festival verwendet (und alle anderen potenziellen externen Ressourcen/Ressourcen von Drittanbietern), haben unterschiedliche Lizenzen und Nutzungsbedingungen. Einige (wenn nicht die meisten) von ihnen können mit Godot problematisch sein, selbst wenn die Festivalbibliothek selbst mit der MIT-Lizenz kompatibel ist. Bitte überprüfen Sie unbedingt die Lizenzen und Nutzungsbedingungen.

Die externe Bibliothek muss ebenfalls innerhalb Ihres Moduls installiert werden, damit der Compiler auf die Quelldateien zugreifen kann, während der Modulcode in sich geschlossen bleibt. Die Bibliotheken festival und speech_tools können mit den folgenden Befehlen aus dem Verzeichnis modules/tts/ über git installiert werden:

git clone https://github.com/festvox/festival
git clone https://github.com/festvox/speech_tools

Wenn Sie nicht möchten, dass die externen Repository-Quelldateien in Ihr Repository übernommen werden, können Sie stattdessen eine Verknüpfung zu ihnen herstellen, indem Sie sie als Submodule (aus dem Verzeichnis modules/tts/) hinzufügen (siehe unten):

git submodule add https://github.com/festvox/festival
git submodule add https://github.com/festvox/speech_tools

Wichtig

Bitte beachten Sie, dass Git-Submodule nicht im Godot-Repository verwendet werden. Wenn Sie ein Modul entwickeln, das in das Haupt-Godot-Repository eingebunden werden soll, sollten Sie keine Submodule verwenden. Wenn Ihr Modul nicht eingebunden wird, können Sie jederzeit versuchen, die externe Bibliothek als GDExtension zu implementieren.

Um Include-Verzeichnisse hinzuzufügen, die der Compiler anzeigen kann, können Sie sie an die Pfade der Umgebungvariable anhängen:

# 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 a path relative to /modules/tts/ where your .a libraries reside.
# If you are compiling the module externally (not in the godot source tree),
# these will need to be full paths.
env.Append(LIBPATH=['libpath'])

# Check with the documentation of the external library to see which library
# files should be included/linked.
env.Append(LIBS=['Festival', 'estools', 'estbase', 'eststring'])

Wenn Sie beim Erstellen Ihres Moduls benutzerdefinierte Compiler-Flags hinzufügen möchten, müssen Sie zuerst env klonen, damit diese Flags nicht zum gesamten Godot-Build hinzugefügt werden (was zu Fehlern führen kann). Beispiel SCsub mit benutzerdefinierten Flags:

# 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.

Des endgültige Modul sollte wie folgt aussehen:

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

Das Modul verwenden

Sie können Ihr neu erstelltes Modul jetzt in jedem Skript verwenden:

var t = TTS.new()
var script = "Hello world. This is a test!"
var is_spoken = t.say_text(script)
print('is_spoken: ', is_spoken)

Und die Ausgabe wird is_spoken: True sein, wenn der Text gesprochen wird.