
Lebst du in Moskau und fährst dein Auto? Wenn ja, wie bezahlen Sie für das Parken? SMS senden? Mit der Moscow Parking App bezahlen? Verwenden Sie den Bot in Telegramm? "Das ist alles unangenehm", entschied ich und schuf meine Fähigkeit für Alice, das Parken per Stimme zu bezahlen. Außerdem ist Alice bereits in Yandex.Navigator integriert. Jetzt können Sie dem Navigator einfach etwas sagen wie "Alice, bitten Sie
Moscow Parking, das Parken 3209 für 30 Minuten zu bezahlen ."
Was habe ich bei der Entwicklung einer Fertigkeit erlebt?
Die Sitzung
Um die Fertigkeit von einem Drittanbieter zu starten, muss Alice sagen: "Alice, starte die Fertigkeit so und so." Dies ist gut und praktisch, wenn Sie eine lange Kommunikation mit der Fertigkeit haben - zum Beispiel beginnt das Spiel. Wenn Sie eine Phrase sagen müssen, eine Antwort erhalten und das ist alles, dann ist das Eingeben einer Fertigkeit unpraktisch. Wenn Sie mit dieser Eingabe fertig sind, müssen Sie sie mit dieser Eingabe beenden.
Für einen Satz gibt es eine Lösung von Alices Entwicklern - Sie müssen sagen: „Alice bittet um die Fähigkeit,
dies und das zu
tun . Das
Python-Beispiel von Alices Entwicklern unterstützt einen solchen Skill-Start jedoch nicht:
if req['session']['new']:
Jedes Mal, wenn eine Fertigkeit gestartet wird, inkl. und mit dem Befehl "Alice frage nach einer
Fähigkeit ..." ist der Wert von
session.new True . Daher wird nicht der gesamte weitere Verarbeitungscode ausgeführt. Die Lösung besteht darin, den Text von
session.command zu überprüfen - er sollte leer sein.
Übrigens, wenn Sie eine Fertigkeit „eingegeben“ haben, unterstützt Alice standardmäßig für alle Fertigkeiten Ausstiegssätze - „Alice, hör auf“ und „Alice, komm zurück“. Wenn Sie die Sitzung mit der Fähigkeit zwangsweise beenden möchten, müssen Sie
end_session in der Antwort gleich
True übergeben . Dies funktioniert jedoch nur mit Yandex.Station - auf anderen Geräten funktioniert das Beenden der Fertigkeit in diesem Fall nicht.
Arbeite mit Zahlen
Meine Fähigkeit besteht darin, mit Nummern zu arbeiten - zuerst die Telefonnummer des Benutzers und dann die Parknummer zu erkennen.
Im obigen Beispiel von Yandex verwendet
req['request']['original_utterance'].lower()
mit einer Benutzeranfrage arbeiten. Zuerst habe ich dieses Feld aus der Anfrage verwendet. Um die Telefonnummer des Benutzers zu erkennen, musste ich den Benutzer bitten, jede Ziffer der Nummer separat zu benennen - zum Beispiel „neun eins sechs eins zwei drei vier fünf sechs sieben“. Und im Code - ersetzen Sie Textwerte ("neun") durch numerische (9). Mit dem Parkcode wurde es noch lustiger - ich nenne den Code "3209" "zweiunddreißig null neun", der Code hatte eine Reihe von Typersatz
s.replace(' ', '32').replace(' ', '31').replace('', '0')
Da ich basierend auf dem Anforderungstext im Skill-Code versucht habe zu verstehen, was der Benutzer will (die Zustandsmaschine wird in der Skill nicht verwendet), musste ich diese Konvertierung bei fast jeder (!) Benutzeranforderung durchführen.
Es stellte sich heraus, dass Alices Server bereits alles für Sie tun (und noch mehr). Anstelle von
request.original_utterance müssen Sie
request.command verwenden . Ja, dies ist in der Dokumentation angegeben. Im Tooltip im Antwortbeispiel.
Servicefeld: Benutzeranforderung für die interne Verarbeitung von Alice konvertiert. Während der Konvertierung wird insbesondere der Text von Satzzeichen befreit und die Ziffern in Zahlen konvertiert.
Es ist seltsam, dass im Beispiel von Alices Entwicklern (Link oben) der Originaltext verwendet wird (
request.original_utterance ). Tatsächlich wird in
request.command (was in der Dokumentation nicht beschrieben ist) noch mehr getan. Zum Beispiel wird eine Telefonnummer in das Format
(916) 123-45-67 konvertiert - jetzt kann der Benutzer in meiner Fähigkeit das Telefon in jedem für ihn geeigneten Format anrufen. Auch die Sätze "Alice, frag nach so und so Geschicklichkeit", "Alice" -Nachrichten werden herausgeschnitten, Tippfehler werden korrigiert.
Auf Alices Seite können einzelne Teile von Abfragen (Nummern, Namen, Adressen, Daten) in
benannte Entitäten konvertiert werden. Aber es funktioniert komisch. Anforderung
79161234567 1234 in benannten Entitäten, die in zwei Nummern konvertiert wurden -
791612345 70 und
1234 . Warum sich die erste Zahl als anders herausstellt, konnte man nicht herausfinden - diese. Die Unterstützung von Yandex.Dialog denkt immer noch über die Antwort nach.
Reaktionszeit der Fertigkeiten
Alice wartet innerhalb von 3 Sekunden auf eine Antwort des Skills (Google hat dieses Limit -
5/10 Sekunden ). Meine Fähigkeit besteht darin, auf Server von Drittanbietern zuzugreifen, um das Parken zu starten und zu beenden. Sie antworten langsam. Manchmal hat meine Fähigkeit in 3 Sekunden keine Zeit, eine Antwort zu geben. Individuell war es nicht möglich, die Zeit für die Reaktion der Fertigkeit zu verlängern. In einigen Fällen war es daher erforderlich, auf Bequemlichkeit zu verzichten. Beispielsweise fordert die Fertigkeit zu Beginn des Parkens nicht das im Profil der Moskauer Parkanwendung angegebene tatsächliche Fahrzeug an, sondern verwendet dasjenige, das sie während der Benutzerautorisierung beibehalten hat.
Nun, zu den Rechten von "Ich bin PR";) -