Alexa versteht meine Zahlen nicht

Manuel Rülke
DAVE42
Published in
4 min readMar 26, 2018
Photo: Nick Hillier

Der Sprachassistent Alexa von Amazon arbeitet mit sogenannten „Skills“, kleinen Programmen, die die Interaktion zwischen Mensch und Maschine steuern. Die Möglichkeit, dabei größere Zahlenkolonnen zu diktieren, ist zum Beispiel für die Erfassung von Postleitzahlen und Telefon-, Tracking- oder Artikelnummern von großem Wert. Allerdings ist die technische Umsetzung einer solchen Eingabe eine echte Herausforderung. Insbesondere bei der Erkennung von Zahlen in der deutschen Sprachversion zeigt das System von Amazon eine ganze Menge Schwächen. Die eingebaute Zahlenerkennung ist schwer zu benutzen, da Nutzer lange Zahlen komplett aussprechen müssen (z.B. “Dreimillionenvierhundertzwölftausenddreihundert und Eins” für 3.412.301). Das Zerlegen von Zahlen in kleinere Bestandteile ist technisch nur bedingt möglich, da Alexa die Zahl “Null” nicht erkennen kann (z.B. 3, 41, 23, 0, 1).

Wir haben uns das Problem angeschaut und stellen hier eine mögliche Lösung vor. Unseren Prototypen stellen wir auf https://github.com/DAVE-42/vui_alexa_number_test/ zur Verfügung.

Wie funktioniert Spracherkennung bei Alexa?

Die Implementierung von Sprachdialogen im Alexa-Ökosystem basiert auf vordefinierten Sprachfragmenten. Diese Fragmente sind Wortgruppen oder Sätze, welche den kompletten Sprachraum für alles definieren, was ein Nutzer sagen kann. Nur diese definierten Fragmente, die sogenannten „Utterances“, können später von der Alexa-Software erkannt werden. Innerhalb der Fragmente können Platzhalter für Variablen, auch „Slots“ genannt, eingesetzt werden. Für diese Platzhalter muss ein Variablen-Typ, der „Slot Type“, festgelegt werden. Für Zahlen stellt Amazon den eingebauten Typ „AMAZON.NUMBER“ zur Verfügung.

Wo liegen die Probleme in der Spracherkennung?

Der erste Schwachpunkt bei der Erkennung von großen Zahlen ist weniger ein technisches Problem, als vielmehr eine Frage der Nutzerfreundlichkeit. Nehmen wir an, der Nutzer möchte eine Bestellung per Artikelnummer vornehmen. Lautet die Artikelnummer 2652017, wäre der Nutzer gezwungen die Zahl komplett auszusprechen: „Alexa, bestelle mir das Produkt mit der Artikelnummer Zweimillionensechshundertzweiundfünfzigtausend Siebzehn“. Das ist nicht praktikabel, da es für den Nutzer anstrengend ist und darüber hinaus sehr fehleranfällig sein dürfte.

Ein erster Lösungsansatz, der das Problem lindern sollte, ist das Verwenden von mehreren Zahlen-Variablen („Number Slots“) in den vordefinierten Sprachfragmenten. Da unklar ist, in wie viele Teile ein Nutzer eine Zahl trennen wird, benötigen wir für jede mögliche Anzahl eine Sprachfragment-Definition. Für unsere Testanwendung haben wir die Möglichkeit eingebaut, eine lange Zahl in bis zu acht Teile zu trennen.

Dies kann dann zum Beispiel so aussehen:

Zahlenerkennung für {NUM_A}
Zahlenerkennung für {NUM_A} {NUM_B}
Zahlenerkennung für {NUM_A} {NUM_B}
Zahlenerkennung für {NUM_A} {NUM_B} {NUM_C}
Zahlenerkennung für {NUM_A} {NUM_B} {NUM_C} {NUM_D}
Zahlenerkennung für {NUM_A} {NUM_B} {NUM_C} {NUM_D} {NUM_E}

Damit ist es möglich, die Zahlen aufzubrechen und hinterher im Skill-Code wieder zusammenzusetzen. Ein Nutzer wäre nun in der Lage, eine Bestellung mit „Alexa, bestelle mir das Produkt mit der Artikelnummer 26, 52, 0, 17“ abzuschicken. Allerdings kommen hier aber die Probleme, die speziell mit dem Variablentyp „AMAZON.NUMBER“ zusammenhängen, zum Vorschein.

Folgende Fehler beim Erkennen haben wir besonders häufig beobachtet:

  • Nullen werden ignoriert (weggelassen)
  • Zahlen werden nach einer Null abgeschnitten
  • Statt „Null“ wird „Neun“ erkannt

Ein Beispiel illustriert den Sachverhalt:

Für unseren Zahlenerkennungs-Test produzieren wir beispielhaft eine Ton-Aufnahme für die Zahleneingabe „26 52 0 17“. Die Aufnahme stellt sicher, dass jeder Testdurchlauf mit den gleichen Bedingungen abläuft und nicht durch subtile Änderungen der Aussprache beeinflusst wird.

Bei 10 exemplarischen Durchläufen stellen wir folgende Ergebnisse fest:

- 4-mal wird „26 52“ erkannt
- 3-mal wird „6 21 52 17“ erkannt
- 2-mal wird „26 52 17“ erkannt
- 1-mal wird „26 52 9 17“ erkannt

Kein einziges Mal wird im Test die Zahlenkombination richtig erkannt. Zusätzlich ist die Erkennung nicht einmal konsistent falsch. Die Ergebnisse zeigen eine breite Streuung. Damit ist trotz der geringen Stichprobengröße klar, dass dieser Variablen-Typ keine Option für diesen Anwendungsfall ist.

Die Lösung ist ein benutzerdefinierter Variablentyp („Custom Slot Type“)

Um die Erkennungsleistung für Zahlenkolonnen zu verbessern, definieren wir im Sprachmodell unseren eigenen Variablentypen „CUSTOM_NUMBER“. Um diesen mit möglichen Optionen zu füllen, ist einiges an Fleißarbeit nötig. Wir hinterlegen für alle Zahlen von 0 bis 100 jeweils einen Eintrag. Der Eintrag definiert zu jedem Zahlenwert eine Entsprechung als Wort und eine Liste von Synonymen, wie dialektische Entsprechungen:


{
"id":"8",
"name":{
"value":"acht",
"synonyms":[
"ocht", "ochte", "achten", "achte", "ochde"
]
}
},

Das komplette Sprachmodell haben wir unter https://github.com/DAVE-42/vui_alexa_number_test/blob/master/models/de-DE.json#L6 abgelegt.

Eine „Utterance“ mit mehreren dieser „CUSTOM_NUMBER“-Variablen, erzeugt erfreulicherweise ein konsistentes Ergebnis bei der Spracherkennung. Die Erkennungsleistung ist bei nahezu 100%. Bei der Wiederholung des vorherigen Tests hat dieses System jedes Mal die Zahlenkolonne richtig erkannt.

Leider hat das System trotz aller positiver Aspekte einen Pferdefuß: Das Sprachmodell bei Amazon Alexa unterliegt einer Größenbeschränkung. In der Entwickler-Dokumentation unter https://developer.amazon.com/docs/custom-skills/custom-interaction-model-reference.html#custom-slot-type-values erklärt Amazon, dass ein Skill nur insgesamt 50.000 verschiedene Werte für Variablentypen verarbeiten kann. Je mehr Entsprechungen und Zahlenwerte ein Skill unterstützen soll, desto weniger Werte stehen für andere benutzerdefinierte Variablentypen zur Verfügung. Hier muss entsprechend genau abgewogen werden, wie viele Zahlen erkannt werden sollen. Wir haben uns als Kompromiss für die Zahlen 0 bis 100 entschieden, um nicht zu viele Optionen für andere Variablentypen zu blockieren.

Wir sind überzeugt, dass die Lösung im praktischen Einsatz bestehen kann. Wir werden das System natürlich weiter testen und ausbauen, um die Erkennungsleistung zu verbessern.

Wer sind wir?

Wir sind DAVE42, das Voice-Team der Sitewards GmbH. Wir entwickeln Anwendungen für Sprachassistenten, Chatbots und Beraten rund um das Thema Voice.
https://dave42.com

--

--

Manuel Rülke
DAVE42
Editor for

Working at DAVE42, doing voice and chatbot applications