Contents

FileLocaleReference textExpected outcomeAudio source
speech-zh-nihao.oggzh-CN你好200, compact schema, 1 crediteSpeak NG 1.52 (synthetic)
speech-zh-maishu.oggzh-CN我想买书200, compact schema, 1 credit; tone units per syllableeSpeak NG 1.52 (synthetic)
speech-en-sunny.oggen-USI like sunny days.200, compact schema, 1 crediteSpeak NG 1.52 (synthetic)
speech-zh-nihao.oggzh-CN你好Same result, Idempotent-Replayed: true, no new chargeeSpeak NG 1.52 (synthetic)
silence-1s.wavzh-CN你好200, assessable false, 0 creditsgenerated by the build (synthetic)
silence-1s.wavzh-CN我有3个422 invalid_assessment, 0 creditsgenerated by the build (synthetic)
too-short-0.1s.waven-USHello422 invalid_audiogenerated by the build (synthetic)
too-long-31s.waven-USHello422 invalid_audiogenerated by the build (synthetic)
not-audio.waven-USHello422 invalid_audiogenerated by the build (synthetic)
silence-1s.wavxx-XXHello422 unsupported_languagegenerated by the build (synthetic)

Plus manifest.json (the table above, machine-readable), compact.schema.json (JSON Schema of toneperfect.compact.v1), errors.json (every error code with its meaning) and run_capsule.py (standard-library Python).

Run it

Shell
mkdir tp-capsule && cd tp-capsule
for f in manifest.json compact.schema.json errors.json run_capsule.py $(curl -s https://api.toneperfect.app/capsule/manifest.json | python3 -c "import json,sys;print(' '.join(x['file'] for x in json.load(sys.stdin)['fixtures']))"); do curl -sO https://api.toneperfect.app/capsule/$f; done
export TONEPERFECT_API_KEY=tp_live_...
python3 run_capsule.py            # about 3 credits of your 50 free ones
python3 run_capsule.py --dry-run  # list what would be sent
# with a tp_test_ key: checks the request path and schema only, free

Each line of output shows the fixture, the HTTP status, the error code or score, the credits charged and the time taken, and whether it matched the expected outcome. Every recording is synthetic: tones and noise generated by the build script, and speech from the open-source eSpeak NG synthesizer, which sounds robotic, so its scores say nothing about how real learners score. The point is the path, not the number.