Compare (blind ratings)
POST /v1/ratings
Record which of two voices read a sentence better.
{ "language": "en", "text": "The quick brown fox…",
"a": {"engine": "kokoro", "voice": "af_nova"}, "b": {"engine": "chatterbox", "voice": "cv_ab12cd34"},
"winner": "a" }
winner is a, b or tie. The language is stored in lower case. Returns 201 with the rating, plus id and at. Comparing a voice with itself returns 400 invalid_request.
GET /v1/ratings/leaderboard?language=en
Voices ranked by Elo: every voice starts at 1000, with K = 32, replayed over all ratings in order. Leave out language to rank across all languages.
{ "language": "en", "ratings": 6,
"voices": [{"engine": "kokoro", "voice": "bm_fable", "score": 1030.0, "games": 4, "wins": 2, "losses": 0, "ties": 2}, …] }
DELETE /v1/ratings?language=en
Forget ratings, for one language or all of them. Returns {"deleted": 6}.
Event: ratings.changed ({"language"}).