Bräuchte Ganz Dringend Hilfe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
alexthebest27
User
Beiträge: 8
Registriert: Dienstag 14. August 2012, 19:03

Hallöchen erstmal,
hab vor langer zeit mal ein kleines Plugin geschrieben das eine Art Wecker einstellen sollte und der dann auch naja Wecken sollte. Läuft alles Super. Jetzt wollte ich es International machen d.h. Übersetzten doch ich hab ein kleines Proble.
Ich hab keine Ahnung wie ich es erklären soll(hab 5 Minuten dran gesesen)
Es soll halt so Funktionieren

Wenn das Gesagte "Sechzehn" ist soll das Plugin das Wort "Sechzehn" in eine Zahl Uwandeln(halt im Plugin selbst nachschlagen) und dann einfach Weitergeben damit das Plugin mit der Zahl 16 und nicht mit dem Wort arbeitet.

Es sollte dann in dieses Plugin passen:

Code: Alles auswählen

class alarmPlugin(Plugin):

    localizations = {
        'Alarm': {
            "settingAlarm": {
                "de-DE": u"Stelle deinen Alarm\u2026"
            }, "alarmWasSet": {
                "de-DE": u"Ok, ich werde dich um {0}:{1} aufwecken."
            }, "alarmSetWithLabel": {
                "de-DE": u"Dein Wecker {0} {1} ist gestellt auf {2}:{3} {4}."
            }
        }
    }

    res = {
        'setAlarm': {
            'de-DE': u'.*Wecke mich um.* ([0-2]?[0-9]).*.* uhr ([0-9]\d)?\s?\s?(\bcalled|named|labeled\b)?\s?(([a-z0-9]{1,7}\s)?([a-z0-9]{1,7})\s?([a-z0-9]{1,7}))?'
        }
    }

    @register("de-DE", res['setAlarm']['de-DE'])
    def setAlarm(self, speech, language):
        alarmString = re.match(alarmPlugin.res['setAlarm'][language], speech, re.IGNORECASE)
        
        alarmHour = int(alarmString.group(1))
        alarm24Hour = alarmHour
        alarmMinutes = alarmString.group(2)
        alarmAMPM = alarmString.group(3)
        alarmLabelExists = alarmString.group(4)
        
        #check if we are naming the alarm
        if alarmLabelExists == None:
            alarmLabel = None
        else:
            alarmLabel = alarmString.group(5)
        
        


        if alarmMinutes == None:
            alarmMinutes = "00"
        else:
            alarmMinutes = int(alarmMinutes.strip())

        view = AddViews(self.refId, dialogPhase="Reflection")
        view.views = [
            AssistantUtteranceView(
                speakableText=alarmPlugin.localizations['Alarm']['settingAlarm'][language],
                dialogIdentifier="Alarm#settingAlarm")]
        self.sendRequestWithoutAnswer(view)

        #create the alarm
        alarm = AlarmObject(alarmLabel, int(alarmMinutes), alarm24Hour, None, 1)
        response = self.getResponseForRequest(AlarmCreate(self.refId, alarm))
        
        print(alarmPlugin.localizations['Alarm']['alarmWasSet'][language].format(alarmHour, alarmMinutes, alarmAMPM))
        view = AddViews(self.refId, dialogPhase="Completion")
        
        if alarmLabel == None:
            view1 = AssistantUtteranceView(speakableText=alarmPlugin.localizations['Alarm']['alarmWasSet'][language].format(alarmHour, alarmMinutes, alarmAMPM), dialogIdentifier="Alarm#alarmWasSet")
        else:
            view1 = AssistantUtteranceView(speakableText=alarmPlugin.localizations['Alarm']['alarmSetWithLabel'][language].format(alarmLabelExists, alarmLabel, alarmHour, alarmMinutes, alarmAMPM), dialogIdentifier="Alarm#alarmSetWithLabel")
        
        view2 = AlarmSnippet(alarms=[alarm])
        view.views = [view1, view2]
        self.sendRequestWithoutAnswer(view)
        self.complete_request()
Wäre super nett
Danke im Vorraus.
alexthebest27
User
Beiträge: 8
Registriert: Dienstag 14. August 2012, 19:03

Ich hab dran gedacht

Code: Alles auswählen

alarmHour = speech.replace('a ','b ')
zu benutzten aber ich hab wirklich kein plan wo ich das einsetzten kann.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Vielleicht wäre es eine gute Idee, den Kontext mehr zu beschreiben! Wenn ich das Wort "Plugin" lese, dann frage ich mich sofort, für welches Programm das Plugin bestimmt ist. Aus Deinem Posting kann ich nichts an solchen Informationen entnehmen.

Zudem "klatscht" Du uns hier einen eher längeren Quellcode hin, mit dem man ohne obige Infos sicher nichts anfangen kann. Er ist ja so nicht mal lauffähig.

Abgesehen davon, dass PEP8 extrem verletzt wird, ist der Code an sich auch eher wirr und teilweise unpythonisch (Auf ``None`` sollte man mit ``is`` vergleichen).

Also, gib uns ein paar mehr Infos rund herum, dann kann man Dir vielleicht auch helfen. Ich kapiere aktuell das Problem nicht mal wirklich...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
alexthebest27
User
Beiträge: 8
Registriert: Dienstag 14. August 2012, 19:03

Kurz erklärt ist das ein Plugin für ein Text to Speech und Speech to Text Program an dem ich arbeite. Es soll einfach so ganz alltägliche Dinge (Wecker/Wetter/InternetSuche...) ausführen und dann Antworten. Für dieses Plugin sind ziemlich viele Komponenten benötigt. Deswegen hat es jetzt den Anschein das es nicht funktioniert(tut es aber). Mein Problem ist wie folgt:
Ich versuche das "Gesagte" in andere Sprachen zu übersetzten, doch es gibt ein kleines Problem.
z.b. im Deutschen sagt man " Wecke mich um Vierzehn Uhr Dreißig" also erkennt er die Vierzehn als 14 und die Dreißig als 30. Bis jetzt gibt es kein Problem. Aber wenn ich es ins Polnische Übersetzen will kommt das Problem auf das die nicht sagen "´Wecke mich um (Zahl) Uhr (Zahl)" sondern "Wecke mich um (zahl als wort)te uhr (zahl als wort)te". Deswegen hab ich gefragt ob jemand irgentwas weiß wie man die zahl als wort(vierzehn/zwanzig....) in eine Zahl(14/25/57.....) umwandelt und dann einfach weitergibt. Ich weiß ist schwer aber besser krieg ich es nicht hin zu erklären.
Zuletzt geändert von alexthebest27 am Sonntag 9. September 2012, 16:48, insgesamt 1-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Du redest von "Text to speech", also Text zu Sprache, willst aber die die Frage erkennen? Was denn nun?

Du wirst nicht darum herum kommen einen entsprechenden Parser zu schreiben, der das dann grammatisch richtig zusammen fügt. Ich weiß auch nicht warum du das ausschreiben willst, sollte ein Text to speech nicht automatisch "Fünf" vorlesen, wenn da eine 5 steht?
Um ein Anpassen der Ausgabe kommst du nicht herum, schon alleine der Unterschied zwischen Deutsch und Englisch:
"Es ist 17 Uhr 23" oder "Es ist 17 Uhr und 23 Minuten"
Und auf Englisch: "It's 5 23 pm"
Und wie ist es mit "17 Uhr 35"? Das wäre auf Englisch "It's 25 to 6 pm", zumindest im "Sprachgebrauch".
Speicher also die Uhrzeit in Stunden und Minuten und bau dir dafür die entsprechende Lokalisierung in der Ausgabe. Im Zweifelsfall für jede Sprache eine.
alexthebest27
User
Beiträge: 8
Registriert: Dienstag 14. August 2012, 19:03

Srry hab gedacht ich habs hingeschrieben es soll in beide Richtungen gehen also Speech to Text und Text to Speech. Mit dem Englischen hab ichs ja schon hinbeckommen war auch nicht zu schwer hab einfach alles kopiert und ein paar zeilen verändert, da aber Polnisch meine Muttersprache ist wollte ich es auch in das Übersetzten.
Im Grunde soll das So funktionieren:
1. Du sagst den Befehl z.b. Stelle den Wecker auf 14:25
2. Der Server bearbeitet die Anfrage
3. Du beckommst eine Antwort und den Wecker gestellt.
Und im Polnischen erkennt es mir die Zahl(14) nicht als Zahl sondern als Wort.
Deswegen hab ich gedacht man könnte es irgentwie mit dem speech.replace machen, dass falls er die 14 als wort beckommt sie in die Zahl umzuwandeln
z.b.:

Code: Alles auswählen

 speech.replace('vierzehn','14')
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Das ist also ein Problem der Spracherkennungssoftware.

Natürlich kannst du problemlos Teile von Strings ersetzen, je nach Komplexität bieten sich dafür auch reguläre Ausdrücke an.

Code: Alles auswählen

>>> replacements = {'eins': '1', 'zwei': '2', 'drei': '3', 'vier': '4'}
>>> a = "eins zwei eins drei vier"
>>> for key, replacement in replacements.items():
...  if key in a:
...   a = a.replace(key, replacement)
... 
>>> a
'1 2 1 3 4'
alexthebest27
User
Beiträge: 8
Registriert: Dienstag 14. August 2012, 19:03

Vielen Dank erstmal nur wie berreits oben erwähnt ist ein weiteres Problem, dass die Vierzehn nicht als Vierzehn ausgesprochen wird sondern als hätte man sie in der hälfte zerschnitten und irgentwas anderes ans ende gesetzt und das dann gesagt. Macht im Deutschen keinen sinn ich weiß. Deswegen erkennt mir die Spracherkennungssoftware das nicht an.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Gut, und wie ist jetzt deine konkrete Frage?
Du musst ja nicht Vierzehn durch 14 ersetzen, sonder von mir aus auch Vierweißderguckuckzehn was.
alexthebest27
User
Beiträge: 8
Registriert: Dienstag 14. August 2012, 19:03

Wie kann ich das jetzt so anpassen das es mit dem Code oben funktioniert ;)
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Wie stellst du dir das vor? Der Code in deinem ersten Beitrag ist eine syntaktisch stark verwirrende Klasse, die offensichtlich irgendwelche (wenig nach Python aussehenden) Methoden aufruft. Den Code kann man nicht einmal testen, weil ja keiner weiß für was das Plugin ist, und welche Methoden dahinter stehen.

Wenn dein Speech-To-Text Programm "falsche" Strings liefert, wäre es dann nicht zielführender die zusammen mit dem erwarteten Ergebnis zu zeigen, damit dir hier jemand helfen kann?

Ansonsten bist du wahrscheinlich in dem Forum der Software aufgehoben, für die du das Plugin schreibst. Die sollten wissen, was die Methoden tun.
Antworten