Für Entwickler

API-Referenz

Jeder Endpunkt mit seinen Parametern, den Feldern seiner Antwort und einem curl-Beispiel, das du ausführen kannst. Such ihn unten nach Name oder Pfad; was jeder Fehler bedeutet, steht unter API-Fehler.

Operationen

POST/api/assess

Aussprache bewerten

Schick eine Aufnahme und den gelesenen Text; erhalte Werte, jedes Wort und jeden Laut zurück.

Multipart-Formular-Upload. Liefert sechs Werte von 0 bis 100 (accuracy, native_likeness, completeness, fluency, clarity und speech_rate_ratio), eine Aufschlüsselung jedes Wortes mit jedem erwarteten und gehörten Laut, und aligned_phonemes: die Aufnahme in Laute zerlegt, mit Zeitangaben, zum Zeichnen.

Dein API-Schlüssel. Pflicht: ein Request-Header X-API-Key mit dem Schlüssel aus deiner Operator-Konsole.

Parameter

NameOrtTypPflichtBeschreibung
reference_textformstring✓Der Text, den die lernende Person gelesen hat. 1 bis 300 Zeichen; ein Text nur aus Leerzeichen wird abgelehnt.
languageformstring✓Sprache des Textes, genau einer dieser Codes: en-GB, en-US, es-ES, de-DE, fr-FR, it-IT, ca-ES. Groß- und Kleinschreibung zählt: en-gb wird mit 400 assess.unsupportedLanguage abgelehnt. en-GB ist britisches Englisch, en-US amerikanisches.
audioformfile✓Die Aufnahme. WAV (16 kHz, 16 Bit, mono) ist am besten; andere Formate wie WebM oder OGG werden umgewandelt. Uploads über etwa 1 MB erhalten HTTP 413, und bewertet werden nur die ersten 15 Sekunden einer Aufnahme.
X-API-Keyheader<customer key>✓Dein API-Schlüssel aus der Operator-Konsole.

Antwort

FeldTypBeschreibung
accuracynumber (0–100)Wie genau die Laute den erwarteten entsprachen.
native_likenessnumber (0–100)Anteil der erwarteten Laute, die so gesprochen wurden, wie Muttersprachler sie sprechen, mit allen feinen Details; ein richtiger Laut ohne das muttersprachliche Detail zählt in accuracy, nicht hier.
completenessnumber (0–100)Anteil der erwarteten Laute, die gesprochen wurden.
fluencynumber (0–100)Gleichmäßiges Sprechen ohne lange Pausen, gewichtet nach Genauigkeit.
claritynumber (0–100)Deutlichkeit: wie deutlich jemand Zuhörendes es verstehen würde.
speech_rate_rationumber (0–100)Anteil der Zeit zwischen dem ersten und dem letzten Laut, die gesprochen statt pausiert wurde.
durationnumber (s)Länge der Aufnahme in Sekunden.
analyzed_textobject[]Ein Eintrag pro Wort des Textes, mit den Feldern unten.
analyzed_text[].wordstringDas Wort, wie es in reference_text steht.
analyzed_text[].accuracy, claritynumber (0–100)Genauigkeit und Deutlichkeit dieses Wortes.
analyzed_text[].start_time, end_timenumber (s) | nullAnfang und Ende in Sekunden ab Beginn der Aufnahme; null, wenn es nicht gehört wurde.
analyzed_text[].user_audio_base64string (base64 WAV) | nullDie Aufnahme dieses Wortes, Base64-WAV; null, wenn es nicht gehört wurde.
analyzed_text[].grapheme_to_phonemeobject[]Welche Buchstaben jeden Laut bilden: für jeden phoneme_index die graphemes (Positionen der Buchstaben im Wort).
analyzed_text[].phoneme_detailsobject[]Ein Eintrag pro erwartetem Laut und pro zusätzlich gehörtem Laut, mit den Feldern unten.
analyzed_text[].phoneme_details[].phonemestringDer erwartete Laut in IPA; leer bei einem zusätzlichen Laut.
analyzed_text[].phoneme_details[].predictedstringDer gehörte Laut in IPA; leer (""), wenn er ausgelassen wurde.
analyzed_text[].phoneme_details[].confidencenumber (0–1)Wie sicher sich das Modell beim gehörten Laut ist, von 0 bis 1.
analyzed_text[].phoneme_details[].is_insertionbooleanEin zusätzlicher Laut, den der Text nicht hat.
analyzed_text[].phoneme_details[].is_closebooleanEin falscher Laut, aber nah am erwarteten.
analyzed_text[].phoneme_details[].is_referencebooleanDer Laut gehört zum Text (false bei einem zusätzlichen Laut).
analyzed_text[].phoneme_details[].expected_phone, heard_phonestring | nullDer erwartete und der gehörte Laut mit dem Detail, das Muttersprachler ihm geben, z. B. tʰ oder d̪; null, wenn es keinen gibt.
analyzed_text[].phoneme_details[].detail_offbooleantrue, wenn der richtige Laut ohne sein muttersprachliches Detail gesprochen wurde (t für tʰ): Er zählt in accuracy, aber nicht in native_likeness.
analyzed_text[].phoneme_details[].user_audio_base64string (base64 WAV) | nullDie Aufnahme dieses Lautes, Base64-WAV; null, wenn er keine Zeitangabe hat.
analyzed_text[].phoneme_details[].start_time, end_timenumber (s) | nullAnfang und Ende in Sekunden ab Beginn der Aufnahme; null, wenn es nicht gehört wurde.
aligned_phonemesobject[]Die Aufnahme als Folge von Lauten: symbol, start, end, duration, word_start, die wahrscheinlichsten candidates und ein Ausschnitt.
waveformnumber[]Amplitudenwerte zum Zeichnen der Aufnahme.
processed_audio_base64string (base64 WAV)Die bereinigte Aufnahme, die bewertet wurde.

Beispielanfrage

curl
curl https://spelly.ch/api/assess \
  -H 'X-API-Key: YOUR_KEY' \
  -F 'reference_text=The weather is lovely' \
  -F language=en-GB \
  -F audio=@recording.wav

Beispielantwort

JSON
{
  "accuracy": 100,
  "native_likeness": 92,
  "completeness": 100,
  "fluency": 100,
  "clarity": 98,
  "speech_rate_ratio": 100.0,
  "analyzed_text": [
    {
      "word": "the",
      "accuracy": 100.0,
      "clarity": 97.93445765972137,
      "phoneme_details": [
        {
          "phoneme": "ð",
          "predicted": "ð",
          "confidence": 0.9709068536758423,
          "is_insertion": false,
          "is_close": false,
          "is_reference": true,
          "expected_phone": "ð",
          "heard_phone": "ð",
          "detail_off": false,
          "user_audio_base64": "UklGRo…",
          "start_time": 0.042020833333333334,
          "end_time": 0.10505208333333334
        },
        {
          "phoneme": "ə",
          "predicted": "ə",
          "confidence": 0.9877822995185852,
          "is_insertion": false,
          "is_close": false,
          "is_reference": true,
          "expected_phone": "ə",
          "heard_phone": "ə",
          "detail_off": false,
          "user_audio_base64": "UklGRi…",
          "start_time": 0.08404166666666667,
          "end_time": 0.16808333333333333
        }
      ],
      "start_time": 0.042020833333333334,
      "end_time": 0.16808333333333333,
      "user_audio_base64": "UklGRu…",
      "grapheme_to_phoneme": [
        {
          "graphemes": [
            0,
            1,
            2
          ],
          "phoneme_index": 0
        },
        {
          "graphemes": [
            0,
            1,
            2
          ],
          "phoneme_index": 1
        }
      ]
    }
  ],
  "waveform": [
    0.00019696683739311993,
    -0.00015526238712482154,
    -0.00024423340801149607,
    1.6281235730275512e-05
  ],
  "duration": 1.387,
  "aligned_phonemes": [
    {
      "index": 0,
      "start": 0.042020833333333334,
      "duration": 0.06303125000000001,
      "end": 0.10505208333333334,
      "symbol": "ð",
      "word_start": false,
      "candidates": [
        {
          "symbol": "ð",
          "confidence": 0.8176507949829102
        }
      ],
      "user_audio_base64": "UklGRo…"
    },
    {
      "index": 1,
      "start": 0.08404166666666667,
      "duration": 0.08404166666666667,
      "end": 0.16808333333333333,
      "symbol": "ə",
      "word_start": false,
      "candidates": [
        {
          "symbol": "ə",
          "confidence": 0.9877822995185852
        }
      ],
      "user_audio_base64": "UklGRi…"
    }
  ],
  "processed_audio_base64": "UklGRn…"
}

Hinweise

  • Beispiel-Audio für denselben Text kommt von /api/assess/synthesize, das du gleichzeitig aufrufen kannst.