DE10029904A1 - Verfahren und Sprachansagemodul zur Ausgabe einer Sprachansage sowie Programm-Modul dafür - Google Patents
Verfahren und Sprachansagemodul zur Ausgabe einer Sprachansage sowie Programm-Modul dafürInfo
- Publication number
- DE10029904A1 DE10029904A1 DE10029904A DE10029904A DE10029904A1 DE 10029904 A1 DE10029904 A1 DE 10029904A1 DE 10029904 A DE10029904 A DE 10029904A DE 10029904 A DE10029904 A DE 10029904A DE 10029904 A1 DE10029904 A1 DE 10029904A1
- Authority
- DE
- Germany
- Prior art keywords
- program
- announcement
- segment
- voice announcement
- voice
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Withdrawn
Links
Classifications
-
- G—PHYSICS
- G10—MUSICAL INSTRUMENTS; ACOUSTICS
- G10L—SPEECH ANALYSIS OR SYNTHESIS; SPEECH RECOGNITION; SPEECH OR VOICE PROCESSING; SPEECH OR AUDIO CODING OR DECODING
- G10L13/00—Speech synthesis; Text to speech systems
- G10L13/02—Methods for producing synthetic speech; Speech synthesisers
- G10L13/027—Concept to speech synthesisers; Generation of natural phrases from machine-based concepts
Abstract
Die Erfindung betrifft ein Verfahren zur Ausgabe einer Sprachansage, deren Inhalt vom Daten-Inhalt mindestens eines Datenstzes abhängt, bei dem mittels eines ersten Programmsegments aufgrund des Daten-Inhalts ein Ansagetyp ausgewählt wird, bei dem ein zweites Programmsegment zur programmgesteuerten Ausgabe bereitgestellt wird, das für den ausgewählten Ansagetyp geeignet ist, bei dem die für das bereitgestellte zweite Programmsegment erforderlichen Parameter ermittelt werden und bei dem die dem ausgewählten Ansagetyp unter Berücksichtigung der ermittelten Parameter entsprechende Sprachansage ausgegeben wird. Die Erfindung betrifft weiter ein Sprachansagemodul und ein Programm-Modul dafür.
Description
Die Erfindung betrifft ein Verfahren zur Ausgabe einer
Sprachansage nach dem Oberbegriff des Anspruchs 1, ein Sprach
ansagemodul nach dem Oberbegriff des Anspruchs 2 und ein Pro
gramm-Modul nach dem Oberbegriff des Anspruchs 3.
Bekannte Sprachansagemodule sind konzipiert, um Ansagen mit
einer einfachen Struktur auszugeben. Diese bestehen vorwiegend
aus einem, möglicherweise geteilten, festen Teil und einem va
riablen Teil. Beispiele hierfür sind Zeitansagen ("Es ist
jetzt", "fünf", "Uhr", "zweiunddreißig".), auch als Teil einer
Fahrplanauskunft, die Ansage einer geänderten Rufnummer oder
die Nennung der Kosten eines soeben beendeten Ferngesprächs.
Bei den bekannten Sprachansagemodulen sind Ansagen mit kom
plizierterer Struktur, etwa mit Alternativen, nicht automati
sierbar möglich.
Der Erfindung liegt die Aufgabe zugrunde, auch Ansagen mit
komplizierterer Struktur, etwa mit Alternativen, automatisier
bar zu ermöglichen.
Diese Aufgabe wird erfindungsgemäß gelöst durch ein Verfahren
nach der Lehre des Anspruchs 1, ein Sprachansagemodul nach der
Lehre des Anspruchs 2 und ein Programm-Modul nach der Lehre des
Anspruchs 3.
Der Erfindung liegt letztlich der Gedanke zugrunde, eine Pro
grammiersprache zur Programmierung von Ansagen zu schaffen und
diese dann zur Steuerung der Sprachansage zu verwenden.
Weitere Ausgestaltungen der Erfindung sind den Unteransprü
chen und der nachfolgenden Beschreibung zu entnehmen.
Die vorgestellte Erfindung hat auch noch den Vorteil, daß die
Programmsegmente nicht nur für die Steuerung von Ansagen ver
wendet werden können, sondern daß damit darüber hinaus auch die
Dokumentation eines Sprachansagemoduls direkt möglich ist.
Im folgenden wird die Erfindung unter Zuhilfenahme der bei
liegenden Zeichnungen weiter erläutert:
Fig. 1 zeigt eine Reihe von Beispielen von Ansagetypen, aus
denen durch das erfindungsgemäße Verfahren in einem
erfindungsgemäßen Sprachansagemodul ausgewählt und die
entsprechend den aktuellen Parametern variiert und
ausgegeben werden,
Fig. 2 zeigt eine weitere Reihe von Beispielen wie in Fig.
1,
Fig. 3 zeigt mehr symbolisch ein Ausführungsbeispiel eines
PCs mit einem erfindungsgemäßen Sprachansagemodul.
Anhand von Beispiel 1 der Fig. 1 wird zunächst kurz aufge
zeigt, wie sich die Erfindung äußern kann.
Vorab soll aber zunächst ein Wort zur Sprache gesagt werden.
(Dies ist gleichzeitig ein Hinweis an diejenigen Übersetzer,
die später von der englischen Version ausgehend in weitere
Sprachen übersetzen müssen.) Einerseits betrifft die Erfindung
eine Sprachansage und beschäftigt sich schon deshalb mit Spra
che und andererseits äußert sich die Erfindung in der Form ei
ner Programmiersprache. Hier tritt die Sprache also nicht nur
als Mittel zur Beschreibung der Erfindung, sondern auch als In
halt und Ausdrucksform der Erfindung in Erscheinung.
Hier, im Beispiel 1 der Fig. 1, wie auch in den meisten an
deren Beispielen, wird unterstellt, daß die Sprachausgabe in
englischer Sprache erfolgen soll. Die auszugebenden Sprachele
mente, z. B. "Good morning, Good afternoon, Good evening" sind
deshalb, als Ausdrucksform der Erfindung, in englisch wiederge
geben, obwohl die Beschreibung der Erfindung hier in deutscher
Sprache erfolgt. Das Gleiche gilt erst recht für den Programm
code als solchen, beispielsweise die Variablennamen, wie "<Area
Code<", oder Anweisungen, wie "loop infinite". Es gilt aber
auch für Anmerkungen, wie "where ThreeToneSuite is defined
like" im Beispiel 8 in Fig. 2, weil erfindungsgemäß auch
nichtausführbare "Anweisungen" als Kommentare zulässig sind und
diese dann in der Regel eben in englisch geschrieben werden.
Eine Ausnahme ist anhand der Beispiele 9 und 10 in Fig. 2
dargestellt und wird im Zusammenhang mit der Beschreibung die
ser Beispiele besprochen.
Was also in der ursprünglichen deutschsprachigen Version in
deutscher Sprache zum Ausdruck gebracht wird, ist Beschreibung
der Erfindung, während das, was in englischer Sprache zum Aus
druck gebracht wird, Inhalt oder Ausdrucksform der Erfindung
ist. (In den weiteren Übersetzungen kann dies dann wieder eben
so unterschieden werden.) Aber auch in der englischsprachigen
Version wird zumindest das, was in der Zeichnung in den Bei
spielen genannt und in der Beschreibung aus den Beispielen der
Zeichnung zitiert wird, als Inhalt oder Ausdrucksform der Er
findung klar zu erkennen sein.
Selbstverständlich sind damit, wie bei Erfindungen in anderen
Bereichen der Technik, länderspezifische Anpassungen nicht aus
geschlossen. Hier jedoch würden sich solche länderspezifischen
Anpassungen in erster Linie durch das Ersetzen der Syntaxele
mente durch solche äußern, die auf der jeweiligen Landessprache
basieren.
Doch nun zurück zu Beispiel 1 der Fig. 1:
Zunächst wird mit "[Good morning, Good afternoon, Good even ing]" eine Anrede entsprechend der Tageszeit ausgewählt und ausgegeben, wobei die Auswahl automatisch erfolgt. Anschließend wird eine neue Rufnummer einschließlich der erforderlichen Vor wahl angesagt, indem zwei feste Satzbestandteile, "the number you have dialled has changed. Please dial the area code" und "followed by the new number", mit zwei Variablen, "<Area Code<" und "<B-party number<", abwechseln. In einer Endlosschleife, "{loop infinite|<halfsecond pause< I repeat, please dial the area code <Area Code< followed by the new number <B-party num ber< }", wird daraufhin solange die Ausgabe unter Hinzufügung einer Pause, "<halfsecond pause<", und des Hinweises auf die Wiederholung, "I repeat", wiederholt, bis der Adressat der Aus gabe diese abbricht. Die Pause wird hier der Einfachheit halber als eine Variable mit vorgebbarer Länge, jedoch ohne Sprachin halt ausgegeben.
Zunächst wird mit "[Good morning, Good afternoon, Good even ing]" eine Anrede entsprechend der Tageszeit ausgewählt und ausgegeben, wobei die Auswahl automatisch erfolgt. Anschließend wird eine neue Rufnummer einschließlich der erforderlichen Vor wahl angesagt, indem zwei feste Satzbestandteile, "the number you have dialled has changed. Please dial the area code" und "followed by the new number", mit zwei Variablen, "<Area Code<" und "<B-party number<", abwechseln. In einer Endlosschleife, "{loop infinite|<halfsecond pause< I repeat, please dial the area code <Area Code< followed by the new number <B-party num ber< }", wird daraufhin solange die Ausgabe unter Hinzufügung einer Pause, "<halfsecond pause<", und des Hinweises auf die Wiederholung, "I repeat", wiederholt, bis der Adressat der Aus gabe diese abbricht. Die Pause wird hier der Einfachheit halber als eine Variable mit vorgebbarer Länge, jedoch ohne Sprachin halt ausgegeben.
In diesem Beispiel werden die Syntaxelemente "Anrede", "feste
Satzbestandteile", "Variablen" und "Schleifen" benutzt und bei
spielhaft vorgestellt. Bevor auf weitere Beispiele eingegangen
wird, wird kurz die Syntax dieser Programmiersprache zusammen
fassend, jedoch nicht unbedingt vollständig, dargestellt; eine
Ergänzung, Abwandlung oder auch eine Reduzierung soll nicht
ausgeschlossen sein.
Beim Vergleich mit einer üblichen Programmiersprache wie C,
C++ oder Pascal zeigt sich, daß die Programmiersprache, in der
sich das erfindungsgemäße Verfahren äußert, ohne ausdrückliche
Befehle ("explicit commands") auskommt. Sie besteht vielmehr
aus Verweisen ("references") und Trennungen ("separators"). Die
Verweise stellen dabei die Verbindungen (links) dorthin dar, wo
sich die erforderliche Information befindet, während die Tren
nungen den Kontext definieren, in den die Verweise gestellt
sind. Die Verweise, etwa eine Textfolge, sind nur im Zusammen
hang mit einem Kontext von Bedeutung. Durch Verwendung einer
bestimmten Trennung, etwa "<" oder "<", kann der Kontext und
damit die Bedeutung des Verweises geändert werden.
In der Praxis wird ein automatischer Übersetzer die in natür
licher Sprache vorliegenden Verweise unter Zuhilfenahme einer
besonderen Tabelle je nach vorliegendem Kontext in ein anwen
dungsspezifisches Format übertragen, das dann vom erfindungsge
mäßen Sprachansagemodul gelesen werden kann. Um die Eingabe
flexibler und lesbarer zu gestalten, unterstützt diese Program
miersprache auch Zeichensetzungssymbole ("punctuation sym
bols"). Dies sind unveränderliche Zeichen, die bei der Überset
zung keine Bedeutung haben. Sie können vom Benutzer hinzugefügt
oder entfernt werden, um das Aussehen und die Lesbarkeit zu
verbessern, haben aber keine technische Auswirkung.
Auf diese Weise kann sehr einfach und auch nach nur kurzer
Einarbeitung ein Sprachansagemodul programmiert werden, wobei
das Ergebnis, also das Programm, sowohl unmittelbar für die Do
kumentation geeignet ist als auch nach automatischer Überset
zung in eine niedrigere anwendungsspezifische Sprache übersetzt
werden kann.
Eine Ansage ist eine Sammlung von festen Elementen ("ele
ments"), wie "kein Anschluß unter dieser Nummer" und komplexen
Segmenten ("Complex_Segments"), für die bei der konkreten An
wendung noch laufzeitspezifische Angaben, wie Parameter, erfor
derlich sind. Beispielsweise steht bei der Ansage "Der Anruf
kostet <x< DM" das "<x<" für einen Parameter, der erst bekannt
ist, wenn die Ansage wirklich erfolgt. Dabei ist "Laufzeit",
(engl.: runtime) ein Ausdruck für denjenigen Augenblick, zu dem
die Zusammenstellung zu einer aktuell auszugebenden Sprachansa
ge tatsächlich erfolgt.
Im folgenden bedeutet (. . .) eine zusätzliche Möglichkeit
("option"), [. . .v. . .v. . .] eine Auswahl ("choice") und {. . .} ei
ne Erweiterung ("extension").
Damit weist eine Ansage den folgenden Aufbau auf:
Ansage = (Prefix), Segment_List, (Suffix),
wobei:
Prefix, Suffix = [Element_List]
Segment_List = Segment {, Segment}
Element_List = Element {, "; ", Element}
Parameter_List = Parameter {, "; ", Parameter}, wobei ein Pa rameter ein Element, ein Segment, eine Zahl oder eine Variable, beispielsweise eine Lauf zeitvariable, sein kann.
Element = [Textbeschreibung v "beliebiger Text"]
Segment = [Element_List v Complex Element v
Parameter_Fixed v Block Segment] (, Punctuation sign) (, Flush sign "\")
Complex_Element = "<", Complex Reference, "<"
Block_Segment = "{", Block_Reference, "|", Segment_List ({, "|", Segment_List}), "}
IfThenElse_Segment = "{", Block_Reference oder Expression, "|", Segment_List_If (, "|", Segment_List_Else), "}"
Branch_Segment = "{", Block_Reference oder Expression, "|", Number_List, ":", Segment_List ({, "|",
Number_List, ":", Segment_List}), (, "|",
"ELSE:", Segment_List), "}". Zur Laufzeit wird "Block_Reference" oder "Expression" er mittelt und ein Sprung zu demjenigen Zweig durchgeführt, der die in der "Number_List" de finierte Nummer trägt. Andernfalls erfolgt ein Sprung in den unter ELSE definierten Zweig, sofern ein solcher vorhanden ist.
Parameter_Fixed = "(", ("_", Element_Singular (, ["/" v "\"], Element_Plural1 (["/" v "\"]
Element Plural2)), ("_"), ")". Das "_"-Zeichen steht für die Unterdrückung des vorausgehenden und/oder nachfolgenden Parameters, während das "/"-Zeichen für eine Übereinstimmung mit dem vorausgehenden oder nachfolgenden Parameter steht. Bei slavischen Sprachen muß ein zweiter Plural, Plural2, definiert werden.
Macro = "<<", Macro Reference ({, "|",
Parameter_List}), "<<"
Macro_Parameter = "[", Parameter Number, "]". Steht für jede Einzelheit der Macro-Definition selbst.
Damit weist eine Ansage den folgenden Aufbau auf:
Ansage = (Prefix), Segment_List, (Suffix),
wobei:
Prefix, Suffix = [Element_List]
Segment_List = Segment {, Segment}
Element_List = Element {, "; ", Element}
Parameter_List = Parameter {, "; ", Parameter}, wobei ein Pa rameter ein Element, ein Segment, eine Zahl oder eine Variable, beispielsweise eine Lauf zeitvariable, sein kann.
Element = [Textbeschreibung v "beliebiger Text"]
Segment = [Element_List v Complex Element v
Parameter_Fixed v Block Segment] (, Punctuation sign) (, Flush sign "\")
Complex_Element = "<", Complex Reference, "<"
Block_Segment = "{", Block_Reference, "|", Segment_List ({, "|", Segment_List}), "}
IfThenElse_Segment = "{", Block_Reference oder Expression, "|", Segment_List_If (, "|", Segment_List_Else), "}"
Branch_Segment = "{", Block_Reference oder Expression, "|", Number_List, ":", Segment_List ({, "|",
Number_List, ":", Segment_List}), (, "|",
"ELSE:", Segment_List), "}". Zur Laufzeit wird "Block_Reference" oder "Expression" er mittelt und ein Sprung zu demjenigen Zweig durchgeführt, der die in der "Number_List" de finierte Nummer trägt. Andernfalls erfolgt ein Sprung in den unter ELSE definierten Zweig, sofern ein solcher vorhanden ist.
Parameter_Fixed = "(", ("_", Element_Singular (, ["/" v "\"], Element_Plural1 (["/" v "\"]
Element Plural2)), ("_"), ")". Das "_"-Zeichen steht für die Unterdrückung des vorausgehenden und/oder nachfolgenden Parameters, während das "/"-Zeichen für eine Übereinstimmung mit dem vorausgehenden oder nachfolgenden Parameter steht. Bei slavischen Sprachen muß ein zweiter Plural, Plural2, definiert werden.
Macro = "<<", Macro Reference ({, "|",
Parameter_List}), "<<"
Macro_Parameter = "[", Parameter Number, "]". Steht für jede Einzelheit der Macro-Definition selbst.
Ein Ausdruck, "Expression", ist ein algebraischer Ausdruck,
der zur Laufzeit ausgewertet wird und bekannte Operatoren auf
weist, wie beispielsweise +, -, /, *, % (modulo), ! (not), and,
or, xor, = , <<, <= , <= , <, < oder irgendwelche anderen system
spezifischen Operatoren. Beispielsweise ist "(Month = 2) and
(day<15)" ein gültiger Ausdruck.
Eine "Block_Reference" ist ein Verweis auf eine Einzelheit
wie
- 1. eine Schleifenanweisung wie "loop 5 times" oder "loop in finite" (nur bei Ausgabe von Wörtern): ({loop|. . .}),
- 2. eine Anweisung für eine Dauer wie "10 seconds" (nur bei Ausgabe von Wörtern): <{duration|. . .}),
- 3. eine Anweisung zur Wiederholung wie "loop as long the pa rameter buffer is not empty": ({repetitive|. . .}) oder
- 4. ein Ausdruck, der zur Laufzeit auszuwerten ist, wie "Eu ro = 0 and Cent<<0", der zusammen mit dem IfThenElse_Segment ({Euro = 0 and Cent<<0|(then)/(else)}) oder dem Branch_Segment ({Key pressed|1,2: . . .|5: . . .|ELSE: . . .}) be nutzt wird.
Eine Complex_Reference ist ein Verweis auf eine komplexe Ein
zelheit wie
- 1. ein Parameterwert und die dazugehörige Regel, nach der er erzeugt wird,
- 2. eine (große) "Element_List" oder
- 3. jede komplexe Einzelheit, die als Merkmal vorliegt.
Eine "Macro_Reference" ist ein Verweis auf ein Makro, welches
wiederum eine Sammlung von Elementen und Segmenten ist, sowie
jede Ansage, bei der ein Element oder ein Teil davon symbolisch
durch einen Parameter ersetzt werden kann. Ein Makro wird bei
der Kompilation aufgelöst, wobei jeder Macro_Parameter durch
seinen aus der Parameterliste "Parameter_List" entnommenen Wert
ersetzt wird. Ein Makro arbeitet hier genauso wie in jeder be
kannten höheren Programmiersprache, beispielsweise C++.
Eine "Parameter_Number" ist eine natürliche Zahl, die den
n-ten Parameter der "Parameter_List" repräsentiert.
Ein "Punctuation sign" ist jedes Zeichen, das nicht dem Zei
chensatz "/; <<{}()|" angehört. Es kann separat gespeichert
werden und muß nicht Teil eines Elements sein (ein Element kann
Bestandteil verschiedener Ansagen sein). Dieses Zeichen ist für
die gesprochene Ansage ohne Bedeutung.
Das "Flush sign" soll wie ein Zeichen für Wagenrücklauf oder
für eine neue Zeile behandelt werden. Es ist nur von Bedeutung,
wenn, beispielsweise zusätzlich zur Sprachausgabe, eine Text
ausgabe erfolgt. Beispielsweise kann als "Flush sign" der soge
nannte "Backslash", "\", verwendet werden, ein Zeichen, das für
andere Zwecke nicht gebraucht wird.
Bevor auf die technische Implementierung eingegangen wird,
soll noch kurz auf die in den Fig. 1 und 2 gezeigten weite
ren Beispiele eingegangen werden:
Beispiel 2 nach Fig. 1 zeigt die Programmierung für die An sage eines Preises, wobei unterstellt wird, daß der Anruf nicht völlig umsonst ist oder war. Dabei wird die Syntax des "Parameter_Fixed" verwendet. Zunächst erfolgt ein fester Ansa gebestandteil, "Your call costs", gefolgt von einer Angabe in Dollar und Cent. Die aktuellen Werte hierfür, <Dollar< und <Cent<, werden dann eingesetzt, wenn diese Ansage abgerufen wird. Die zugehörigen Einheiten, Dollar, Dollars, Cent oder Cents, werden jeweils anschließend hinzugefügt, wobei noch je nach Wert die Singularform, Dollar oder Cent, oder die Plural form, Dollars oder Cents, der Einheit ausgegeben wird. Ist ei ner der beiden Werte Null, so wird dieser nicht ausgegeben und auch die zugehörige Einheit unterdrückt. Das verbindende "and" wird sowohl unterdrückt, wenn der vorausgehende Wert, <Dollar<, Null ist als auch, wenn der nachfolgende Wert, <Cent<, Null ist.
Beispiel 2 nach Fig. 1 zeigt die Programmierung für die An sage eines Preises, wobei unterstellt wird, daß der Anruf nicht völlig umsonst ist oder war. Dabei wird die Syntax des "Parameter_Fixed" verwendet. Zunächst erfolgt ein fester Ansa gebestandteil, "Your call costs", gefolgt von einer Angabe in Dollar und Cent. Die aktuellen Werte hierfür, <Dollar< und <Cent<, werden dann eingesetzt, wenn diese Ansage abgerufen wird. Die zugehörigen Einheiten, Dollar, Dollars, Cent oder Cents, werden jeweils anschließend hinzugefügt, wobei noch je nach Wert die Singularform, Dollar oder Cent, oder die Plural form, Dollars oder Cents, der Einheit ausgegeben wird. Ist ei ner der beiden Werte Null, so wird dieser nicht ausgegeben und auch die zugehörige Einheit unterdrückt. Das verbindende "and" wird sowohl unterdrückt, wenn der vorausgehende Wert, <Dollar<, Null ist als auch, wenn der nachfolgende Wert, <Cent<, Null ist.
Beispiel 3 in Fig. 1 zeigt eine Ansage ähnlich der im Bei
spiel 2, jedoch nur auf ganze Dollar auf- oder abgerundet. Hier
ist ein einfaches Unterdrücken von Angaben nicht mehr ausrei
chend. Deshalb werden hier durch das Branch Segment
DollarUnequalZero die Fälle unterschieden, daß etwas zu zahlen
ist, "costs <Dollar< (Dollar/Dollars)", und daß insgesamt
nichts zu zahlen ist, "is free". Die Unterdrückung der Einheit
ist hier nicht erforderlich, weil dieser Zweig ohnehin nur an
gesprungen wird, wenn der Wert ungleich Null ist.
Für den Fall, daß einerseits genau abgerechnet werden soll,
andererseits aber auch kostenlose Gespräche möglich sind, kann
selbstverständlich eine Kombination beider Beispiele erfolgen,
wobei dann aber das Branch_Segment DollarunequalZero anders de
finiert oder durch ein anderes Branch_Segment, etwa
PriceUnequalZero ersetzt werden muß. Die Anweisungen
DollarUnequalZero und PriceUnequalZero müssen dabei, wie bei
Programmiersprachen üblich, an anderer Stelle, etwa als Funkti
on oder Unterprogramm definiert werden. Anstelle des
Branch Segments DollarUnequalZero könnte hier auch direkt die
dahinter stehende Gleichung (Dollar.Zero) eingegeben werden.
In solch einfachen Fällen mag es sich nicht lohnen, eine sepa
rate Funktion bereitzustellen und diese jeweils aufzurufen. In
wieweit dies auch für ein abgewandeltes Branch_Segment, etwa
PriceUnequalZero gelten würde, hinge von dem hier nicht näher
definierten inneren Aufbau ab.
Die folgenden drei Beispiele, Beispiel 4 und Beispiel 5 aus
Fig. 1 und Beispiel 6 aus Fig. 2, zeigen Beispiele für mögli
che Bestätigungen auf vom Benutzer vorgenommene Änderungen sei
nes Benutzerprofils. Diese drei Beispiele zeigen jeweils einen
ersten Ansageteil, in dem die Art der vorgenommenen Änderung
bestätigt wird, "Your calls will be forwarded" oder "You en
tered a filter for the following directory numbers", und einen
zweiten Teil, der den Inhalt der vorgenommenen Änderung bestä
tigt, nämlich im Falle der Rufum- oder -weiterleitung das je
weilige Ziel, "to your mobile telephone!" oder "to your answer
machine." und im Falle der Eingabe einer Reihe von Rufnummern
für ein Rufnummernfilter werden durch die Block_Reference {Re
petitive|<DN<} alle eingegebenen Rufnummern zur Kontrolle aus
gegeben.
Anhand des Beispiels 7 in Fig. 2 soll eine komplexer aufge
baute Ansage dargestellt werden. Gezeigt wird eine Aussage für
einen Wartenden in einer Warteschlange. Zunächst erfolgt eine
Begrüßung: "Hello, welcome by XYZ. All lines are busy. Your
call is being queued.", auf die hin wiederholt durch eine
Block Reference, {loop infinite|. . .}, auf die Tatsache hinge
wiesen wird, daß man sich gerade in einer Warteschlage befin
det: "You are the <xth< iri the queue". Dabei wird noch, als Va
riable "<xth<" angegeben, der wievielte man in dieser Warte
schlange ist. Aus der Geschwindigkeit, mit der hier zurückge
zählt wird, kann man abschätzen, wie lange man noch etwa warten
muß. Um das Herannahen des Endes der Warteschlange deutlicher
zu machen, ist durch eine weitere Block_Reference, {pool|1:
<music1<|2: <music2<|ELSE: <wait tone<}, für eine Abwand
lung der Aussage gegen Schluß gesorgt. Bei jedem Durchlauf der
unendlichen Schleife "loop infinite" wird noch ein akustisches
Zeichen ausgegeben, das aus einem Pool, "pool", ausgewählt wird
und das im Normalfall, "ELSE", ein Wartezeichen, "<wait tone<",
ist und das gegen Ende der Warteschlange durch zwei verschiede
ne Musikfolgen, erst "<music2<", dann "<music1<" ersetzt wird.
Das Wartezeichen könnte dabei, wie im nachfolgenden Beispiel,
aus einer vorab definierten Tonfolge bestehen.
Das Beispiel 8 in Fig. 2 zeigt eine einfache Ausgabe für den
Fall, daß unter der gewählten Rufnummer kein Anschluß besteht.
Die Ausgabe wird zunächst durch die Ausführung eines Makrobe
fehls "<<ThreeToneSuite<<" angeführt und dann durch eine einfa
che Ausgabe "No abonnee on this number" abgeschlossen. In die
sem Beispiel ist noch eine Möglichkeit angedeutet, Kommentare
zu verwenden. Wie in jeder Programmiersprache kann auch hier
vorgesehen werden, daß Kommentare eingefügt werden. Eine in
vielen Programmiersprachen vorgesehene Möglichkeit, besteht
darin, daß alles unbeachtet bleibt, was nach einem Anführungs
zeichen, "'", folgt; hier wird auf diese Weise der Kommentar
'where ThreeToneSuite is defined like "<Tone800Hz<;
<Tone1000Hz<; <Tone1200Hz<; <Pause500ms<"' angefügt, um kurz
den Inhalt dieses Makros zu erklären. Das Makro selbst muß
selbstverständlich an anderer Stelle definiert werden.
Die letzten beiden Beispiele, Beispiel 9 und Beispiel 10 aus
Fig. 2, zeigen im Ergebnis dieselbe Ausgabe, nämlich die Anga
be eines Kostenbetrags in einer slawischen Sprache, nämlich in
Russisch. Slawische Sprachen haben zwei verschiedene Pluralbil
dungen, die bei der Ausgabe berücksichtigt werden müssen. (Ge
naugenommen wird hier der Genitiv Singular als zweite Plural
bildung verwendet.).
Um dies hier in einem nicht in einer slawischen Sprache vor
liegenden Text zu zeigen, werden die Währungsangaben,
"Roubel/Roublei/Roublia", um die es hier geht, in russischer
Sprache, aber ins Englische transliteriert, wiedergegeben. Der
Rest, sowohl die Ansagen selbst, "Your call costs", wie auch
Kommentare, ((Russian announcement)), und andere Programmele
mente, <Costs<, werden in englischer Sprache dargestellt. Hier
wird die Verwendung doppelter runder Klammern als weitere Art
betrachtet, einen Kommentar einzufügen. Ein solcher Kommentar
soll einfach überlesen werden, während bei einem Anführungszei
chen "'" als Zeichen für einen Kommentar alles folgende nicht
mehr beachtet werden soll.
Im Beispiel 10 in Fig. 2 sind beide Arten von Kommentaren zu
sehen. Im Beispiel 9 wird hier unterstellt, daß mit dem Aufruf
der Variablen <Costs< automatisch das Makro für die Auswahl der
richtigen Währungseinheit mit aufgerufen wird, während dies im
Beispiel 10 explizit durch den Makroaufruf <<SlavicParFixed|<Costs<;
Roubel; Roublei; Roublia<< erfolgt. In diesem Bei
spiel 10 sind auch ausführlichere Kommentare hinzugefügt, bei
spielsweise ist die Definition des Makros als Kommentar beige
fügt.
Nur wenn der Wert der Variablen <Costs< gleich "1" ist, wird
als Währungseinheit die Singularform "Roubel" ausgegeben. En
det, bei einem Wert ungleich "1", der Wert der Variablen
<Costs< auf 1, 2, 3 oder 4, nicht jedoch auf 11, 12, 13 oder
14, so wird die Form "Roublia" verwendet, während in allen an
deren Fällen die Form "Roublei" verwendet wird.
Die verschiedenen Ansagen werden natürlich nicht so abgespei
chert, wie in den Fig. 1 und 2 dargestellt. Insbesondere
dient die hier verwendete graphische Darstellung, unter anderem
auch mit verschiedenen Schriften, zwar dem besseren Verständ
nis, kann aber so nicht abgespeichert werden. Eine Sichtbarma
chung in genau dieser Form ist aber mit einem entsprechend aus
gebildeten Editor möglich. Die tatsächliche Speicherung erfolgt
aber in Form von Tabellen.
So ist beispielsweise eine erste Tabelle für das Abspeichern
von Ansagen als solchen vorgesehen. Diese Tabelle weist eine
erste Spalte mit eindeutigen Kennungen, eine zweite Spalte mit
den Bezeichnungen der jeweiligen Ansagen, eine dritte Spalte
mit der jeweils verwendeten Sprache, letztlich ein Kommentar,
und eine vierte Spalte mit den Definitionen der Ansagen auf.
Weiter kann eine Spalte mit Kommentaren vorgesehen sein. Statt
dessen kann aber auch eine weitere Tabelle vorgesehen sein, die
nur Kommentare enthält und über die eindeutigen Kennungen mit
Zeilen dieser Tabelle oder auch mit Zeilen anderer Tabellen
verknüpft ist.
Eine zweite Tabelle enthält die "Block Segments", die Spalten
für eindeutige Kennungen, für die Bezeichnungen, die
"Block_References", und für die Definitionen dieser
"Block_Segments" aufweist. Weitere Definitionen sind in weite
ren Tabellen abgespeichert.
Abschließend soll noch kurz auf die mehr äußere Form der Rea
lisierung eingegangen werden. Fig. 3 zeigt hierzu einen an sich
bekannten PC, der durch geeignete Ausstattung als erfindungsge
mäßes Sprachansagemodul mit einem erfindungsgemäßen Programm-
Modul ausgestattet ist. Der in diesem Beispiel gezeigte Bild
schirm als Ausgabemittel und die hier gezeigte Tastatur als
Eingabemittel sind in der Grundausstattung nicht zwingend er
forderlich. Das Sprachansagemodul ist dann Bestandteil eines
sogenannten Servers, also eines Rechners, der nur im Verbund
mit anderen Rechnern arbeitet und für diese bestimmte Aufgaben
übernimmt.
Beispielsweise kann es ein Gebührenrechner des Betreibers ei
nes Telekommunikationsnetzes sein, an den laufend Gebührenin
formationen gesendet werden und der nicht nur für die monatli
chen Gebührenabrechnungen verwendet werden soll, sondern nach
Beendigung eines Gesprächs jeweils die angefallenen Kosten als
Sprache ausgibt. Diese Kosten können aus dem Daten-Inhalt eines
die Verbindungsdaten dieses Gesprächs enthaltenden Datensatzes
ermittelt werden. Möglicherweise wird dann noch aus einem zwei
ten Datensatz, der spezifische Angaben über den Anschluß ent
hält, der diese Kosten verursacht hat, abgeleitet, in welcher
Sprache die Ausgabe erfolgen soll. Beispiele hierfür sind die
Beispiele 2, 3, 9 und 10 aus den Fig. 1 und 2.
Dieser "Server" kann aber auch ein Vermittlungsrechner sein,
der in einem sogenannten Call Center die ankommenden Anrufe auf
die einzelnen Bedienplätze verteilt. Dabei muß ein Zugriff von
Seiten des Sprachansagemoduls auf die Datensätze der in der
Warteschleife wartenden Anrufe möglich sein, um für jeden ein
zelnen davon die aktuelle Position ermitteln und, wie im Bei
spiel 7 in Fig. 2 gezeigt, als Sprache ausgeben zu können.
In beiden Fällen, wie auch in jedem anderen Fall, sind außer
den angedeuteten Datenzugriffsmitteln noch Sprachausgabemittel
erforderlich, mit denen die durch das Sprachansagemodul gebil
deten Sprachansagen auch wirklich ausgegeben werden können. In
irgendeiner an sich bekannten Art und Weise muß die Umsetzung
der im Einzelfall zusammengestellten Sprachansage in gesproche
ne Sprache und deren Ausgabe über einen geeigneten (analogen
oder digitalen) Anschluß an ein Telekommunikationsnetz erfol
gen.
Der Datensatz, der die oben bereits erwähnten spezifischen
Angaben über einen Anschluß enthält, wird oft auch als "Benut
zerprofil" bezeichnet. Es kann nun zugelassen sein, daß ein Be
nutzer zumindest Teile dieses Datensatzes durch irgendeine Art
der Ferneingabe selbst beeinflußt, und daß das Ergebnis dieser
Ferneingabe anschließend als Sprache zur Kontrolle und Bestäti
gung wieder ausgegeben wird. Beispiele hierzu sind die Beispie
le 4, 5 und 6 der Fig. 1 und 2.
Die Beispiele 1 und 8 der Fig. 1 und 2 zeigen zwei mögli
che Ansagen eines Vermittlungsrechners, für den Fall, daß unter
der gewählten Rufnummer kein Teilnehmer über diesen Vermitt
lungsrechner erreicht werden kann. Hier wird dann entweder, so
fern bekannt, eine neue Teilnehmerrufnummer (Beispiel 1) ausge
geben oder es wird angesagt, daß unter dieser Teilnehmerrufnum
mer kein Eintrag vorliegt (Beispiel 8). Die Anfrage in der
Teilnehmerdatenbank dieses Vermittlungsrechners enthält dann
entweder einen Datensatz, der unter der bisherigen, jetzt ge
wählten Rufnummer einen Verweis auf die neue Rufnummer enthält
oder es kommt als Antwort auf den Datenzugriff des Daten
zugriffsmittels als Sonderform eines Datensatzes eine Fehler
meldung zurück, die besagt, daß kein Eintrag vorliegt.
Häufig werden solche Rechner, die mit erfindungsgemäßen
Sprachansagemodulen ausgerüstet sein können, aber auch gleich
zeitig zur Pflege zumindest eines Teils der Daten verwendet,
die Grundlage für die Sprachansagen sind. In all diesen Fällen,
beispielsweise in Hotels oder Krankenhäusern, ändern sich die
Daten laufend, wozu zwingend auch Ein- und Ausgabemittel, wie
in Fig. 3 auch dargestellt, erforderlich sind. Hier ändern
sich auch häufig die organisatorischen Abläufe, was dann wie
derum eine Anpassung der Sprachansagen erfordert. Gerade bei
der vorliegenden Erfindung ist aber die Programmierung neuer
oder die Abänderung bestehender Ansagen verhältnismäßig einfach
und auch von wenig geschultem Personal durchführbar. Deshalb
ist es für solche Fälle vorteilhaft, wenn das Sprachansagemodul
auch mit geeigneten Editiermitteln ausgestattet ist. Hierfür
können meist die in beinahe allen Rechnern ohnehin vorhandenen
Editoren oder auch ein Schreibprogramm verwendet werden. In
diesem Fall sollte der verwendete Rechner zusätzlich über Ein-
und Ausgabemöglichkeiten (Mikrofon, Lautsprecher) für gespro
chene Sprache verfügen, um Texte aufzusprechen und programmier
te Ansagen zu testen.
Der Aufbau des erfindungsgemäßen Programm-Moduls zur Verwen
dung in einem erfindungsgemäßen Sprachansagemodul zur Durchfüh
rung des erfindungsgemäßen Verfahrens zur Ausgabe einer Sprach
ansage ist an sich üblich. Es liegt im Rahmen üblicher Program
miertätigkeit, ein Programm in Segmente (Subroutines, Proce
dures) aufzuteilen, wobei einzelne Segmente mehr für die Steue
rung des Ablaufs und andere für die Durchführung einzelner Tä
tigkeiten bestimmt sind, dieses Programm mit Treibern zum Da
tenzugriff und zur Sprachausgabe zu verbinden und mit den oben
dargestellten erfinderischen Inhalten zu füllen.
Claims (4)
1. Verfahren zur Ausgabe einer Sprachansage, deren Inhalt
vom Daten-Inhalt mindestens eines Datensatzes abhängt, da
durch gekennzeichnet, daß mittels eines ersten Programm
segments aufgrund des Daten-Inhalts ein Ansagetyp ausge
wählt wird, daß ein zweites Programmsegment zur programm
gesteuerten Ausgabe bereitgestellt wird, das für den aus
gewählten Ansagetyp geeignet ist, daß die für das bereit
gestellte zweite Programmsegment erforderlichen Parameter
ermittelt werden, und daß die dem ausgewählten Ansagetyp
unter Berücksichtigung der ermittelten Parameter entspre
chende Sprachansage ausgegeben wird.
2. Sprachansagemodul zur Ausgabe einer Sprachansage, deren
Inhalt vom Daten-Inhalt mindestens eines Datensatzes ab
hängt, dadurch gekennzeichnet, daß das Sprachansagemodul
eine Programmsteuerung aufweist, daß ein erstes Programm
segment vorhanden ist, mittels dessen aufgrund des Daten-
Inhalts ein Ansagetyp auswählbar ist, daß jedem Ansagetyp
ein zweites Programmsegment aus einer Vielzahl zweiter
Programmsegmente zugeordnet ist, daß Datenzugriffsmittel
vorhanden sind, um die für ein ausgewähltes zweites Pro
grammsegment erforderlichen Parameter aus dem mindestens
einen Datensatz zu ermitteln, und daß Sprachausgabemittel
vorhanden sind, um die dem ausgewählten Ansagetyp unter
Berücksichtigung der ermittelten Parameter entsprechende
Sprachansage auszugeben.
3. Programm-Modul zur Verwendung in einem Sprachansagemodul
zur Ausgabe einer Sprachansage, deren Inhalt vom Daten-
Inhalt mindestens eines Datensatzes abhängt, dadurch ge
kennzeichnet, daß das Programm-Modul ein Programmsteue
rungssegment, ein erstes Programmsegment und eine Vielzahl
zweiter Programmsegmente aufweist, daß das Programmsteue
rungssegment zur Steuerung des Zugriffs auf Datenzugriffs
mittel und Sprachausgabemittel sowie zur Steuerung des
Aufrufs des ersten Programmsegments und eines Programmseg
ments aus der Vielzahl der zweiten Programmsegmente aus
gestaltet ist, daß das erste Programmsegment derart aus
gestaltet ist, daß damit ein Ansagetyp und ein diesem An
sagetyp zugeordnetes zweites Programmsegment aus der Viel
zahl zweiter Programmsegmente auswählbar ist, und daß je
des der zweiten Programmsegmente aus der Vielzahl zweiter
Programmsegmente derart ausgestaltet ist, daß es unter Zu
hilfenahme der erforderlichen Parameter, die mittels des
Programmsteuerungssegments und der Datenzugriffsmittel aus
dem mindestens einen Datensatz ermittelt werden, eine ak
tuelle Sprachansage formt, und daß es mittels des Pro
grammsteuerungssegments und der Sprachausgabemittel diese
Sprachansage zur Ausgabe bringt.
4. Sprachansagemodul nach Anspruch 2, dadurch gekennzeich
net, daß Editiermittel vorhanden sind, mittels derer be
stehende Ansagetypen mit zugehörigen zweiten Programmseg
menten verändert oder gelöscht oder neue Ansagetypen mit
zugehörigen zweiten Programmsegmenten erzeugt werden kön
nen, und daß Ein- und Ausgabemittel vorhanden sind, über
die mit den Editiermitteln kommuniziert werden kann.
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
DE10029904A DE10029904A1 (de) | 2000-06-17 | 2000-06-17 | Verfahren und Sprachansagemodul zur Ausgabe einer Sprachansage sowie Programm-Modul dafür |
EP01440138A EP1164575A3 (de) | 2000-06-17 | 2001-05-18 | Ausgabe einer Sprachansage |
US09/880,753 US20020026317A1 (en) | 2000-06-17 | 2001-06-15 | Process and spoken announcement module for outputting a spoken announcement and a program module therefor |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
DE10029904A DE10029904A1 (de) | 2000-06-17 | 2000-06-17 | Verfahren und Sprachansagemodul zur Ausgabe einer Sprachansage sowie Programm-Modul dafür |
Publications (1)
Publication Number | Publication Date |
---|---|
DE10029904A1 true DE10029904A1 (de) | 2001-12-20 |
Family
ID=7646104
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
DE10029904A Withdrawn DE10029904A1 (de) | 2000-06-17 | 2000-06-17 | Verfahren und Sprachansagemodul zur Ausgabe einer Sprachansage sowie Programm-Modul dafür |
Country Status (3)
Country | Link |
---|---|
US (1) | US20020026317A1 (de) |
EP (1) | EP1164575A3 (de) |
DE (1) | DE10029904A1 (de) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
FR2836260B1 (fr) * | 2002-02-21 | 2005-04-08 | Sanef Sa | Procede de diffusion de messages annoncant au moins un evenement |
US20040215461A1 (en) * | 2003-04-24 | 2004-10-28 | Visteon Global Technologies, Inc. | Text-to-speech system for generating information announcements |
DE102004013855A1 (de) * | 2004-03-16 | 2005-10-13 | Deutsche Telekom Ag | Verfahren und Vorrichtung zur kostengünstigen Umleitung von Anrufen |
US7742833B1 (en) | 2006-09-28 | 2010-06-22 | Rockwell Automation Technologies, Inc. | Auto discovery of embedded historians in network |
US8181157B2 (en) * | 2006-09-29 | 2012-05-15 | Rockwell Automation Technologies, Inc. | Custom language support for project documentation and editing |
US7930261B2 (en) * | 2007-09-26 | 2011-04-19 | Rockwell Automation Technologies, Inc. | Historians embedded in industrial units |
US20090089671A1 (en) * | 2007-09-28 | 2009-04-02 | Rockwell Automation Technologies, Inc. | Programmable controller programming with embedded macro capability |
Family Cites Families (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
DE69327446T2 (de) * | 1992-11-18 | 2000-05-11 | Canon Information Syst Inc | Verfahren und Gerät zur Gewinnung von Text aus einer strukturierten Datei und zu dessen Umsetzung in Sprache |
DE69417279T2 (de) * | 1993-02-10 | 1999-10-14 | Ibm | Verfahren und Anordnung zum automatischen Aktualisieren von Telephonbeantwortervorrichtungen |
US5572625A (en) * | 1993-10-22 | 1996-11-05 | Cornell Research Foundation, Inc. | Method for generating audio renderings of digitized works having highly technical content |
US5493606A (en) * | 1994-05-31 | 1996-02-20 | Unisys Corporation | Multi-lingual prompt management system for a network applications platform |
GB9424887D0 (en) * | 1994-12-09 | 1995-02-08 | Univ Oxford Brookes | Computer apparatus with dialogue-based input system |
US5721827A (en) * | 1996-10-02 | 1998-02-24 | James Logan | System for electrically distributing personalized information |
AU2655399A (en) * | 1998-02-02 | 1999-09-06 | Pulsepoint Communications | Dynamically loadable phrase book libraries for spoken language grammars in an interactive system |
AU2789499A (en) * | 1998-02-25 | 1999-09-15 | Scansoft, Inc. | Generic run-time engine for interfacing between applications and speech engines |
US6144938A (en) * | 1998-05-01 | 2000-11-07 | Sun Microsystems, Inc. | Voice user interface with personality |
-
2000
- 2000-06-17 DE DE10029904A patent/DE10029904A1/de not_active Withdrawn
-
2001
- 2001-05-18 EP EP01440138A patent/EP1164575A3/de not_active Withdrawn
- 2001-06-15 US US09/880,753 patent/US20020026317A1/en not_active Abandoned
Also Published As
Publication number | Publication date |
---|---|
EP1164575A3 (de) | 2004-02-11 |
US20020026317A1 (en) | 2002-02-28 |
EP1164575A2 (de) | 2001-12-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
DE3317325A1 (de) | Durch stimm-eingabe gesteuerter computer | |
DE10220521B4 (de) | Verfahren und System zur Verarbeitung von Sprachdaten und Klassifizierung von Gesprächen | |
DE69532883T2 (de) | Mehrsprachige betriebs- und wartungsschnittstelle für eine fernmeldevermittlung | |
DE102004036976A1 (de) | Verfahren zur Generierung von Internetseiten, zugehöriges Computerprogramm und Computersystem | |
EP1035707A2 (de) | Verfahren, Erzeugungsmodul, Server, Steuermodul und Speichermittel zum Erstellen von Validierungsregeln | |
DE10029904A1 (de) | Verfahren und Sprachansagemodul zur Ausgabe einer Sprachansage sowie Programm-Modul dafür | |
EP1005215B1 (de) | Verfahren und Vorrichtung zum Editieren von Konfigurationsdaten für Telekommunikationssysteme | |
DE10220522B4 (de) | Verfahren und System zur Verarbeitung von Sprachdaten mittels Spracherkennung und Frequenzanalyse | |
WO1996013782A1 (de) | Computergestützte umwandlung von tabellen | |
WO2012017056A1 (de) | Verfahren und vorrichtung zur automatischen verarbeitung von daten in einem zellen-format | |
DE60126948T2 (de) | Interaktive dialoge | |
WO2009012802A1 (de) | System und verfahren zur steuerung der generierung und verteilung von publikationen | |
EP1505399A2 (de) | Verfahren zum Erzeugen von Testdaten zum Austesten der Funktionsfähigkeit einer datenverarbeitenden Schaltung | |
DE10127852A1 (de) | Verfahren zur Erkennung von Sprachinformationen | |
DE102004059045B4 (de) | Verfahren zur Kommunikation zwischen einem Management Information System und einem ausführenden System und Kommunikationsmodul | |
EP1240775A2 (de) | Kommunikationssystem und verfahren zum bereitstellen eines internet-zugangs über ein telefon | |
DE60014718T2 (de) | Verfahren zum senden einer selektion auf einer webseite und dieser webseite zu einem anderen benutzer durch einen server | |
DE10220518B4 (de) | Verfahren und System zur Verarbeitung und Speicherung von Sprachinformation | |
EP0740257B1 (de) | Verfahren zum Konvertieren von betriebstechnischen Informationen in einer programmgesteuerten Kommunikationseinrichtung | |
DE10220519A1 (de) | Verfahren und System zur Verarbeitung von Sprachinformation | |
DE19946580A1 (de) | Automatisches Informations- und Bestellsystem | |
DE19949736A1 (de) | Verfahren zum Auffinden eines Datensatzes | |
DE19714345A1 (de) | Simulation von Maus- und/oder Tastenoperation bei einem Computersystem | |
WO2003039122A1 (de) | Verfahren und system zum dynamischen generieren von ansageinhalten | |
EP1326174A2 (de) | Verfahren und System zum Erzeugen einer produktbezogenen Darstellung |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
8139 | Disposal/non-payment of the annual fee |