Pour les développeurs

Référence de l'API

Chaque endpoint, avec ses paramètres, les champs qu'il renvoie et un exemple curl à lancer. Cherche-le ci-dessous par nom ou chemin ; ce que signifie chaque erreur est dans Erreurs de l'API.

Opérations

POST/api/assess

Évaluer la prononciation

Envoie un enregistrement et le texte lu ; récupère les scores, chaque mot et chaque son.

Envoi de formulaire multipart. Renvoie six scores de 0 à 100 (accuracy, native_likeness, completeness, fluency, clarity et speech_rate_ratio), le détail de chaque mot avec chaque son attendu et entendu, et aligned_phonemes : l'enregistrement découpé en sons, avec leur minutage, pour le dessiner.

Ta clé API. Obligatoire : un en-tête de requête X-API-Key avec la clé de ta console opérateur.

Paramètres

NomEmplacementTypeObligatoireDescription
reference_textformstring✓Le texte que l'apprenant a lu. 1 à 300 caractères ; un texte fait uniquement d'espaces est refusé.
languageformstring✓Langue du texte, exactement l'un de ces codes : en-GB, en-US, es-ES, de-DE, fr-FR, it-IT, ca-ES. La casse compte : en-gb est refusé avec 400 assess.unsupportedLanguage. en-GB est l'anglais britannique, en-US l'américain.
audioformfile✓L'enregistrement. Le WAV (16 kHz, 16 bits, mono) est idéal ; les autres formats comme WebM ou OGG sont convertis. Les envois de plus d'environ 1 Mo reçoivent HTTP 413, et seules les 15 premières secondes d'un enregistrement sont évaluées.
X-API-Keyheader<customer key>✓Ta clé API depuis la console opérateur.

Réponse

ChampTypeDescription
accuracynumber (0–100)À quel point les sons correspondaient à ceux attendus.
native_likenessnumber (0–100)Part des sons attendus prononcés comme les natifs les prononcent, détails fins compris ; un son juste sans le détail natif compte dans accuracy, pas ici.
completenessnumber (0–100)Part des sons attendus qui ont été prononcés.
fluencynumber (0–100)Une parole régulière sans longues pauses, pondérée par la précision.
claritynumber (0–100)Clarté : à quel point un auditeur le comprendrait clairement.
speech_rate_rationumber (0–100)Part du temps entre le premier et le dernier son passée à parler plutôt qu'en pause.
durationnumber (s)Durée de l'enregistrement en secondes.
analyzed_textobject[]Une entrée par mot du texte, avec les champs ci-dessous.
analyzed_text[].wordstringLe mot tel qu'il est écrit dans reference_text.
analyzed_text[].accuracy, claritynumber (0–100)La précision et la clarté propres au mot.
analyzed_text[].start_time, end_timenumber (s) | nullDébut et fin en secondes depuis le début de l'enregistrement ; null s'il n'a pas été entendu.
analyzed_text[].user_audio_base64string (base64 WAV) | nullL'enregistrement de ce mot, en WAV base64 ; null s'il n'a pas été entendu.
analyzed_text[].grapheme_to_phonemeobject[]Quelles lettres forment chaque son : pour chaque phoneme_index, les graphemes (positions des lettres dans le mot).
analyzed_text[].phoneme_detailsobject[]Une entrée par son attendu, et par son supplémentaire entendu, avec les champs ci-dessous.
analyzed_text[].phoneme_details[].phonemestringLe son attendu en IPA ; vide pour un son supplémentaire.
analyzed_text[].phoneme_details[].predictedstringLe son entendu, en IPA ; vide ("") quand il a été omis.
analyzed_text[].phoneme_details[].confidencenumber (0–1)À quel point le modèle est sûr du son entendu, de 0 à 1.
analyzed_text[].phoneme_details[].is_insertionbooleanUn son supplémentaire que le texte n'a pas.
analyzed_text[].phoneme_details[].is_closebooleanUn son faux, mais proche du son attendu.
analyzed_text[].phoneme_details[].is_referencebooleanLe son fait partie du texte (false pour un son supplémentaire).
analyzed_text[].phoneme_details[].expected_phone, heard_phonestring | nullLe son attendu et le son entendu avec le détail que lui donnent les natifs, par ex. tʰ ou d̪ ; null quand il n'y en a pas.
analyzed_text[].phoneme_details[].detail_offbooleantrue quand le bon son a été dit sans son détail natif (t pour tʰ) : il compte dans accuracy mais pas dans native_likeness.
analyzed_text[].phoneme_details[].user_audio_base64string (base64 WAV) | nullL'enregistrement de ce son, en WAV base64 ; null quand il n'a pas de minutage.
analyzed_text[].phoneme_details[].start_time, end_timenumber (s) | nullDébut et fin en secondes depuis le début de l'enregistrement ; null s'il n'a pas été entendu.
aligned_phonemesobject[]L'enregistrement comme suite de sons : symbol, start, end, duration, word_start, les candidates les plus probables et un extrait.
waveformnumber[]Des échantillons d'amplitude pour dessiner l'enregistrement.
processed_audio_base64string (base64 WAV)L'enregistrement nettoyé qui a été évalué.

Exemple de requête

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

Exemple de réponse

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…"
}

Remarques

  • L'audio d'exemple pour le même texte vient de /api/assess/synthesize, que tu peux appeler en même temps.