• Zuhause
  • Artikel
  • Übersetzen und synthetisieren Sie Text mit Rust und gRPC
Veröffentlicht am 18-02-2019

Übersetzen und synthetisieren Sie Text mit Rust und gRPC

gRPC- und Protokollpuffer

gRPC ist eine der besten Möglichkeiten, RPC-Dienste zu erstellen. Es wurde von Google als leistungsfähiges, verkaufsfähiges und dauerhaftes RPC-Framework entwickelt. Neben den Leistungsvorteilen können Clients und Server in vielen verschiedenen Sprachen geschrieben werden. Wenn zum Beispiel ein Server in Rust geschrieben ist, bedeutet dies nicht, dass nur Rust-Clients mit dem Dienst kommunizieren können. Wie bei anderen RPC-Frameworks definieren Sie einen Vertrag für die verschiedenen verfügbaren Typen und Dienste. In einer Service-Definition gibt es Methoden und deren Rückgabe- und Parametertypen. Benutzerdefinierte Nachrichtentypen können auch verwendet werden, um Daten, die zwischen einem Server und einem Client gesendet werden, besser darzustellen. Standardmäßig verwendet gRPC Protokollpuffer als IDL (Interface Definition Language), um diesen Vertrag zu definieren. Protokollpuffer sind ein Mechanismus zur Serialisierung strukturierter Daten. Es ist wie JSON und XML, aber viel schneller, kleiner und einfacher. Weitere Informationen zu Protokollpuffern finden Sie hier.

Voraussetzungen

Reponieren Sie von hier aus.

In diesem Beitrag werden wir einen in Rust geschriebenen gRPC-Server und -Kunden erstellen. Eine der Methoden kann Text übersetzen und die andere kann Text in eine MP3-Datei übersetzen und synthetisieren. Der Kunde wird Fragen stellen und entweder übersetzen oder synthetisieren.

Da unsere Server- und Client-Implementierungen in Rust geschrieben werden, sollten sie auf Ihrem System installiert werden. Die gRPC-Kiste, die wir verwenden werden, hat Anforderungen, stellen Sie also sicher, dass auch diese installiert sind. Sie können den Protoc-Compiler hier herunterladen. Um loslegen zu können, führen Sie cargo new translate-service aus und passen Sie die Baumstruktur unten an.

$ Baum
.
├── Cargo.toml
└── src
    ├── client.rs
    ├── Protos
    ├── ├── sprache.proto
    └── └── mod.rs
    └── server.rs
2 Verzeichnisse, 5 Dateien

Stellen Sie sicher, dass Cargo.toml mit dem angezeigten übereinstimmt, um sicherzustellen, dass alle Abhängigkeiten installiert sind.

Server-Implementierung

In einem ersten Schritt erstellen Sie die Protokollpufferdatei, um unseren Service und unsere Nachrichten zu definieren. Fügen Sie in language.proto den folgenden Inhalt hinzu.

Wie ich bereits erwähnt habe, gibt es für unseren Service nur zwei Methoden. Es werden auch benutzerdefinierte Nachrichtentypen verwendet, um die übergebenen Daten besser darzustellen. An diesem Punkt müssen wir nun den Rust-Code aus unseren Protokollpufferdefinitionen generieren. Im Allgemeinen ist dieser Codegenerierungsprozess erforderlich, um die in Proto-Dateien definierten Dienste und Nachrichten zu verwenden und zu implementieren. Wenn Sie diese Dateien generieren können, können Sie sicher feststellen, ob die von Ihnen verwendete Sprache gRPC unterstützt. In unserem Fall können wir die Ladung entweder mit einem Build-Skript für uns erzeugen lassen oder manuell generieren. Führen Sie dazu manuell protoc --rust_out = aus. --grpc_out =. --plugin = protoc-gen-grpc = `which grpc_rust_plugin` language.proto in src / protos.

Die Verwendung des Build-Skript-Ansatzes erfordert zusätzliche Abhängigkeiten. Weitere Details zum Einrichten finden Sie hier. Das in den Anweisungen erwähnte build.rs sollte folgendermaßen aussehen.

Fügen Sie Folgendes hinzu, um die Module aus dem generierten Code zu deklarieren.

// Zwei Zeilen brauchen keinen eigenen Kern
Pub-Mod-Sprache;
pub mod language_grpc;

Nun sind wir endlich bereit, unseren Server zu implementieren. Der Grund, den wir „implementieren“ nennen, ist, dass in Sprachen wie Go und Rust die Dienste in Schnittstellen / Merkmale generiert werden. Es würde mich nicht wundern, wenn es auch für andere Sprachen sehr ähnlich wäre. Für das eigentliche Übersetzen und Synthetisieren verwenden wir das AWS SDK für Rust (rusoto). Öffnen Sie src / server.rs und fügen Sie den folgenden Inhalt hinzu.

Die erste wichtige Bemerkung ist, dass wir die Struktur definieren, die für die Implementierung des Sprachmerkmals in src / protos / language_grpc.rs verantwortlich ist. Beachten Sie, dass wir sowohl bei der Übersetzungs- als auch bei der Synthetisiermethode AWS synchron aufrufen. Die Verwendung von Futures in diesem einfachen Kontext würde uns keine Vorteile bringen.

Jetzt schreiben wir unseren Kunden. Öffnen Sie src / client.rs und fügen Sie Folgendes hinzu.

Der Client ist eine Befehlszeilenanwendung, die dem Benutzer mehrere Fragen stellt und den übersetzten Text oder die Audio-Bytes zurückgibt. Es ist erwähnenswert, dass der Client die Bytes als MP3-Datei auf Ihrem System speichert. Wenn Sie dies nicht möchten, kommentieren Sie den Aufruf fs :: write aus.

Um alles zu testen, öffnen Sie zwei Terminalfenster oder Registerkarten. In einem Lauf laufen der Frachtlauf -bin-Server und der andere Frachtlauf -bin-Client. Beantworten Sie einfach die Fragen der Clientanwendungen. Wenn alles geklappt hat, sollten Sie Ausgaben wie die folgenden Screenshots sehen.

server.rs

Ich hoffe, Sie fanden diesen Beitrag hilfreich, wenn Sie eine der Möglichkeiten zur Verwendung von gRPC mit Rust sehen. Fühlen Sie sich frei, zu kommentieren, Fragen zu stellen oder ein Thema vorzuschlagen, über das ich als nächstes schreiben kann.

P.S. Folge mir auf Twitter

Siehe auch

So veröffentlichen Sie eine React Native-Komponente in NPM - es ist einfacher als Sie denkenMein erstes Jahr als Software Engineer: Ein RückblickLernen Sie verschiedene JavaScript-Umgebungen in React Native kennenWarum ein README erstellt wurde, ist zu meinem Lieblingsteil der Entwicklung gewordenWir sind was wir tunRedux Free gehen