Localeja-JP
Scored dimensionsPronunciation · Completeness
LevelsSentence · word · phoneme
InputAudio ≤ 30 s + reference text

Japanese learners lose points on length, not on exotic sounds: おばさん vs おばあさん, きて vs きって. The Japanese pack expects long vowels and double consonants as distinct sounds, so a shortened ō in ありがとう shows as an expected oː heard as o.

Words are bunsetsu units

Japanese text has no spaces, so the API splits the reference into bunsetsu-like units — a content word plus its particles or endings, such as 日本語を / 勉強しています. Each unit is one entry in words[] with its score, timestamps and phoneme rows, and carries the correction decision. Kanji are read with a dictionary.

Learner errors this pack is built to show

  • Long vowels shortened or short vowels lengthened (ありがとう, おばあさん / おばさん).
  • Double consonants (っ) not held (きって, ちょっと).
  • ら行 produced as an English r or l instead of a tap.
  • ふ and つ produced as fu / tsu with English consonants.
  • Moraic ん dropped or merged into the next sound.

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

The pack is new (October 2026) and labelled experimental, built on native read speech like the Spanish, German, Italian and Portuguese packs, with calibration still being tuned. Pitch accent is not scored: はし (chopsticks) and はし (bridge) are the same target. Kanji readings come from a dictionary and can miss readings that depend on context — 今日は may be read as こんにちは or きょうは — so send kana for words whose reading is ambiguous. A recording of a different sentence scores near zero.

Example request

Reference text: ありがとうございます. 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=ありがとうございます" \
  -F "language=ja-JP"

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": "ja",
  "locale": "ja-JP",
  "task": "scripted_speech",
  "status": "completed",
  "assessable": true,
  "model_version": "multilingual-native-v1-ja-…",
  "scores": {
    "overall": 86,
    "pronunciation": 85,
    "completeness": 100
  },
  "words": [
    {
      "word": "ありがとう",
      "expected_ipa": "aɾiɡatoː",
      "score": 71,
      "start_ms": 180,
      "end_ms": 560,
      "decision": "review",
      "phones": [
        {
          "phone": "ɾ",
          "expected": "ɾ",
          "heard": "ɾ",
          "score": 91,
          "diagnosis_status": "experimental"
        },
        {
          "phone": "ɡ",
          "expected": "ɡ",
          "heard": "ɡ",
          "score": 93,
          "diagnosis_status": "experimental"
        },
        {
          "phone": "t",
          "expected": "t",
          "heard": "t",
          "score": 94,
          "diagnosis_status": "experimental"
        },
        {
          "phone": "oː",
          "expected": "oː",
          "heard": "o",
          "score": 58,
          "diagnosis_status": "experimental"
        }
      ]
    }
  ],
  "billing": {
    "credits": 1,
    "balance_credits": 2499
  }
}

Reference text goes in as text: The Japanese sentence the learner was asked to read, in kana and/or kanji, with no spaces needed. The API splits it into bunsetsu-like units (日本語を / 勉強しています) and reads kanji with a dictionary; it can miss context-dependent readings such as 今日は, so write those in kana when the reading matters. See the response reference for every field.