安卓 com.stkouyu 与 iOS STKouyuEngine 两个平替层的接口与声通 SDK 一致。2.1.1 起麦克风录音与送流默认走声通兼容实时评测边录边传,结束帧之前连接失败时改用声通兼容整段评测,音频文件评测同样走整段评测。日志级别为 INFO 或 DEBUG 时请求带 timing=1,回调前去掉 timing,交给应用的结果 JSON 与不带时相同。回调里的结果 JSON 在兼容接口返回的基础上补齐声通外层字段:
JSON
{"tokenId": "3f0b6a1c9d2e4f5a8b7c6d5e4f3a2b1c", "recordId": "eval_xxx", "applicationId": "<appKey>",
"userId": "<userId>", "refText": "北京你好", "eof": 1, "dtLastResponse": "2026-10-08 12:00:00:123",
"result": {"overall": 85}}请求带 attachAudioUrl=1 时,兼容接口的返回体顶层另有 audioUrl,为本次录音的下载地址,形如 https://open.shengzhiai.com/rec/<yyyyMMdd>/<文件名>,保留 7 天,平替层把该地址原样放进回调 JSON。错误时回调 {"tokenId": "...", "errId": 20009, "error": "...", "eof": 1, "applicationId": "..."}。可重试的失败在重试用尽后统一给 errId 20009,其余服务端错误把平台错误码作为 errId,平替层本地错误为 60001 到 60009 与 90005,90011,见错误码。接入方式见从声通迁移。
兼容接口返回体#
平替层在外层补齐 tokenId,applicationId,userId,refText,dtLastResponse。段落逐字条目 sentences[].details[] 缺少 overall 时补上取自 scores.overall 的值,缺少 pronunciation 时一并补上,其余内容逐字节不变。
兼容接口返回体,节选
{
"recordId": "eval_9cd006ba7b68",
"result": {
"paragraphs": [],
"kernel_version": "1.0.0",
"resource_version": "1.0.0",
"overall": 94.6,
"pronunciation": 100,
"tone": 83,
"fluency": 96,
"rhythm": 78,
"integrity": 100,
"speed": 225,
"rear_tone": "fall",
"duration": "1.920",
"numeric_duration": 1.92,
"warning": [],
"words": [
{
"word": "今",
"pinyin": "jin",
"rawpinyin": "jin1",
"symbolpinyin": "jīn",
"charType": 0,
"readType": 0,
"tone": "tone1",
"scores": {
"overall": 78,
"pronunciation": 78,
"tone": 100,
"overall_pron": 78,
"prominence": 0
},
"span": {
"start": 15,
"end": 31
},
"pause": {
"type": 0,
"duration": 0
},
"phonemes": [
{
"phoneme": "J",
"phone": "j",
"category": 0,
"pronunciation": 78,
"tone_index": "0",
"span": {
"start": 15,
"end": 23
}
},
{
"phoneme": "IN",
"phone": "in",
"category": 1,
"pronunciation": 78,
"tone_index": "1",
"span": {
"start": 23,
"end": 31
}
}
],
"normalized_syllables": [
{
"syllables": "今",
"pinyin": "jin",
"tone": "tone1",
"tone_sandhi": "tone1",
"phoneme_span": [
0,
1
]
}
],
"word_parts": [
{
"part": "今",
"charType": 0,
"beginIndex": 0,
"endIndex": 0
}
],
"phonics": [],
"linkable": false,
"syllables": [],
"evidence": {
"scored": false,
"rms_db": -32.7,
"rel_db": -0.5,
"dur_ms": 160,
"dur_ratio": 0.8,
"sfgop": 0.625
},
"readStatus": "correct",
"read_status": "correct"
},
{
"word": "天",
"pinyin": "tian",
"rawpinyin": "tian1",
"symbolpinyin": "tiān",
"charType": 0,
"readType": 0,
"tone": "tone1",
"scores": {
"overall": 95,
"pronunciation": 95,
"tone": 100,
"overall_pron": 95,
"prominence": 0
},
"span": {
"start": 31,
"end": 57
},
"pause": {
"type": 0,
"duration": 0
},
"phonemes": [
{
"phoneme": "T",
"phone": "t",
"category": 0,
"pronunciation": 95,
"tone_index": "0",
"span": {
"start": 31,
"end": 43
}
},
{
"phoneme": "IAN",
"phone": "ian",
"category": 1,
"pronunciation": 95,
"tone_index": "1",
"span": {
"start": 43,
"end": 55
}
}
],
"normalized_syllables": [
{
"syllables": "天",
"pinyin": "tian",
"tone": "tone1",
"tone_sandhi": "tone1",
"phoneme_span": [
0,
1
]
}
],
"word_parts": [
{
"part": "天",
"charType": 0,
"beginIndex": 0,
"endIndex": 0
}
],
"phonics": [],
"linkable": false,
"syllables": [],
"evidence": {
"scored": false,
"rms_db": -31.8,
"rel_db": 0.5,
"dur_ms": 240,
"dur_ratio": 1.2,
"sfgop": 0.917
},
"readStatus": "correct",
"read_status": "correct"
}
],
"sentences": [
{
"sentence": "今天天气很好",
"index": 0,
"scores": {
"overall": 89,
"pronunciation": 100,
"fluency": 96,
"integrity": 100
},
"details": [
{
"word": "今",
"pinyin": "jin",
"rawpinyin": "jin1",
"symbolpinyin": "jīn",
"charType": 0,
"readType": 0,
"tone": "tone1",
"scores": {
"overall": 78,
"pronunciation": 78,
"tone": 100,
"overall_pron": 78,
"prominence": 0
},
"span": {
"start": 15,
"end": 31
},
"pause": {
"type": 0,
"duration": 0
},
"phonemes": [
{
"phoneme": "J",
"phone": "j",
"category": 0,
"pronunciation": 78,
"tone_index": "0",
"span": {
"start": 15,
"end": 23
}
},
{
"phoneme": "IN",
"phone": "in",
"category": 1,
"pronunciation": 78,
"tone_index": "1",
"span": {
"start": 23,
"end": 31
}
}
],
"normalized_syllables": [
{
"syllables": "今",
"pinyin": "jin",
"tone": "tone1",
"tone_sandhi": "tone1",
"phoneme_span": [
0,
1
]
}
],
"word_parts": [
{
"part": "今",
"charType": 0,
"beginIndex": 0,
"endIndex": 0
}
],
"phonics": [],
"linkable": false,
"syllables": []
},
{
"word": "天",
"pinyin": "tian",
"rawpinyin": "tian1",
"symbolpinyin": "tiān",
"charType": 0,
"readType": 0,
"tone": "tone1",
"scores": {
"overall": 95,
"pronunciation": 95,
"tone": 100,
"overall_pron": 95,
"prominence": 0
},
"span": {
"start": 31,
"end": 57
},
"pause": {
"type": 0,
"duration": 0
},
"phonemes": [
{
"phoneme": "T",
"phone": "t",
"category": 0,
"pronunciation": 95,
"tone_index": "0",
"span": {
"start": 31,
"end": 43
}
},
{
"phoneme": "IAN",
"phone": "ian",
"category": 1,
"pronunciation": 95,
"tone_index": "1",
"span": {
"start": 43,
"end": 55
}
}
],
"normalized_syllables": [
{
"syllables": "天",
"pinyin": "tian",
"tone": "tone1",
"tone_sandhi": "tone1",
"phoneme_span": [
0,
1
]
}
],
"word_parts": [
{
"part": "天",
"charType": 0,
"beginIndex": 0,
"endIndex": 0
}
],
"phonics": [],
"linkable": false,
"syllables": []
}
]
}
],
"compositeReport": {
"compositeScore": 94.6,
"integrityScore": 100,
"accuracyScore": 100,
"toneVoiceScore": 83,
"nasalsScore": 98,
"pronunciationScore": 100,
"phonemeScore": 100,
"fluencyScore": 96,
"fluentScore": 96,
"readSpeedScore": 85,
"readSpeed": 225,
"skillScore": 78,
"stopConnScore": 85,
"stressScore": 32,
"intonationScore": 100,
"emotionScore": 76,
"literalTotal": 95,
"toneScore": 100,
"completenessScore": 100,
"skillSuggest": "重音变化不够明显,关键词应当适度强调(音高提升 / 时长延长 / 加强气流)。",
"emotionSuggest": "第三声(上声)调值偏低。练习时走 214 曲线,先降再升。推荐练习『你好/美好/小狗』等词。"
},
"yuguScores": {
"overall": 88.9,
"integrity": 100,
"accuracy": {
"overall": 100,
"tone": 100,
"nasal": 98,
"phoneme": 100
},
"fluency": {
"overall": 96,
"speed_score": 85,
"naturalness": 100
},
"reading_skill": {
"overall": 78,
"pause": 85,
"stress": 32,
"intonation": 100
},
"prosody": 78,
"emotion": 76,
"tone": 83,
"rear_tone": "fall",
"speed": 225,
"duration_s": 1.92
},
"accuracy": 100,
"reading_skill": 78
},
"audioUrl": "https://open.shengzhiai.com/rec/20261008/eval_9cd006ba7b68-7ea7c9bb6dfe7b5cde9e7fccd7ab3cf6.wav",
"eof": 1
}