Localefr-FR
Scored dimensionsPronunciation · Completeness · Fluency · Rhythm
LevelsSentence · word · phoneme
InputAudio ≤ 30 s + reference text

French learners' most common errors are the four nasal vowels (un, on, an, in), the uvular r, and final consonants that should be silent. The French pack returns each word's score with the expected and estimated heard phoneme underneath, so a learner who said un as a plain è sees exactly that.

Sentence-level dimensions

Alongside pronunciation and completeness, the French pack scores fluency (pausing and pace) and rhythm at sentence level — useful for liaison-heavy sentences where word scores alone miss the point.

Learner errors this pack is built to show

  • The four nasal vowels produced as oral vowels or as vowel + n.
  • u / ou (tu / tout) and é / è confusions.
  • The uvular r produced as an English or Spanish r.
  • Final consonants pronounced where they should be silent (petit, trop) — appears as an inserted sound.
  • Word-final stress carried over from English, which lowers the rhythm score.

Phoneme rows are evidence, not validated corrections: they show a learner where a word went wrong, while the word-level decision is what your app should act on.

Coverage notes

Calibrated against native fr-FR references. Some consonants and glides in the grapheme-to-phoneme step remain unassessed and are marked as such in the response. Stress and intonation are not scored. The pack is labelled experimental.

Example request

Reference text: Je voudrais un café. Send the recording, the text and the locale; nothing else is required.

cURL
curl https://api.toneperfect.app/v1/assess \
  -H "Authorization: Bearer $TONEPERFECT_API_KEY" \
  -H "Idempotency-Key: lesson-42-attempt-1" \
  -F "audio=@take.wav" \
  -F "text=Je voudrais un café" \
  -F "language=fr-FR"

What comes back

The same structure as every other language: sentence-level scores, a words[] array with timestamps and, under each word, phones[] with expected and heard values. Abbreviated to the one flagged word:

JSON (abbreviated)
{
  "language": "fr",
  "locale": "fr-FR",
  "task": "scripted_speech",
  "status": "completed",
  "assessable": true,
  "model_version": "multilingual-native-v1-fr-…",
  "scores": {
    "overall": 84,
    "pronunciation": 83,
    "completeness": 100,
    "fluency": 88,
    "rhythm": 85
  },
  "words": [
    {
      "word": "un",
      "expected_ipa": "œ̃",
      "score": 64,
      "start_ms": 1020,
      "end_ms": 1400,
      "decision": "review",
      "phones": [
        {
          "phone": "œ̃",
          "expected": "œ̃",
          "heard": "ɛ",
          "score": 64,
          "diagnosis_status": "experimental"
        }
      ]
    }
  ],
  "billing": {
    "credits": 1,
    "balance_credits": 2499
  }
}

Reference text goes in as text: The French sentence the learner was asked to read, up to 40 words. See the response reference for every field.