更新记录
1.0.2(2026-04-09)
- 导出结构调整:移除
utssdk/index.uts,改为各平台index.uts直接显式导出 - 文档与示例优化:补充 API / 事件 / 错误码说明,统一示例写法
- 错误信息完善:补齐 TTS / ISE 相关错误码文案
1.0.1(2026-02-27)
- 文档增强:补充“接入方使用自有 AppID”接入步骤(Android/iOS SDK 替换路径、
10407排查、自定义基座要求) - 文档说明:明确 SDK 下载入口使用旧版 dispatcher(
https://www.xfyun.cn/sdk/dispatcher) - 发布信息:版本号更新为
1.0.1 - 本次无 API 变更
1.0.0(2026-01-27)
- 初始版本:支持 App-Android / App-iOS 的在线 IAT/TTS/ISE
- 提供
onXxx/offXxx事件回调注册方式
平台兼容性
uni-app(4.87)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | - | - | √ | - | √ | √ | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
uni-app x(4.87)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| - | - | √ | √ | - | - |
hans-xf-speech
讯飞语音(IAT 听写 / TTS 合成 / ISE 评测)UTS 插件。
支持:
- App-Android(Android 5.0+)
- App-iOS
- uni-app x / uni-app(App 端)
当前不支持:
- Web
- 小程序
- 鸿蒙
说明:鸿蒙目录当前是占位实现,调用会返回 9090001(not implemented on this platform),不算可用支持。
获取 AppID
在讯飞开放平台创建应用,开通所需能力后获得 AppID。
SDK 下载入口(重要):
- 请使用旧版 dispatcher:
https://www.xfyun.cn/sdk/dispatcher - 当前插件验证通过的是旧版 dispatcher 下载包,新版下载入口的包形态暂不作为本文档基准
安装
将本插件放到项目 uni_modules/hans-xf-speech。
从插件市场安装时,也会自动落到这个目录。
给其他 AppID 接入(必须)
本插件默认内置的是示例 SDK。接入方必须同时完成下面两件事:
- 业务代码里
xfInit传入自己的appId - 用该
appId对应下载的 SDK 二进制替换插件内置 SDK
只改 appId 或只换 SDK 都不行,常见报错是 10407 用户校验失败。
1) 下载接入方自己的 SDK
- Android / iOS 都从旧版 dispatcher 下载:
https://www.xfyun.cn/sdk/dispatcher - 下载包建议按
appid归档保存,避免团队内混用
2) 替换 Android SDK 文件
从 Android SDK 根目录 libs/ 复制(不要用 sample 目录):
libs/Msc.jarlibs/arm64-v8a/libmsc.solibs/armeabi-v7a/libmsc.so
覆盖到项目:
uni_modules/hans-xf-speech/utssdk/app-android/libs/Msc.jaruni_modules/hans-xf-speech/utssdk/app-android/libs/arm64-v8a/libmsc.souni_modules/hans-xf-speech/utssdk/app-android/libs/armeabi-v7a/libmsc.so
3) 替换 iOS SDK 文件
从 iOS SDK 复制:
lib/iflyMSC.framework/
覆盖到项目:
uni_modules/hans-xf-speech/utssdk/app-ios/Frameworks/iflyMSC.framework/
4) 初始化时传入接入方 AppID
import {
xfInit,
XfInitOptions,
} from '@/uni_modules/hans-xf-speech'
const initOptions : XfInitOptions = {
appId: '接入方自己的AppID',
logEnabled: true,
}
xfInit(initOptions)
5) 自检(建议)
xfInit成功后调用一次iatStart做冒烟- 若出现
10407,优先检查:xfInit的appId是否正确- Android/iOS SDK 是否确实替换为同一
appId下载包 - Android 是否误用了
sample下的 so - 是否仍在使用旧的自定义基座或缓存产物(清理后重编)
快速开始
import {
xfInit,
destroy,
onIatResult,
onIatError,
onTtsProgress,
onIseResult,
iatStart,
iatStop,
ttsSpeak,
ttsStop,
iseStart,
iseStop,
XfInitOptions,
IatStartOptions,
IatStopOptions,
TtsSpeakOptions,
TtsStopOptions,
IseStartOptions,
IseStopOptions,
IatResultEvent,
XfSpeechFail,
TtsProgressEvent,
IseResultEvent,
} from '@/uni_modules/hans-xf-speech'
const initOptions : XfInitOptions = {
appId: '你的AppID',
logEnabled: true,
success: (res) => console.log('init ok', res),
fail: (err) => console.error('init fail', err),
}
xfInit(initOptions)
onIatResult((e : IatResultEvent) => {
console.log('iat text', e.text)
console.log('iat raw', e.raw)
console.log('iat isLast', e.isLast)
})
onIatError((err : XfSpeechFail) => {
console.error('iat error', err)
})
onTtsProgress((e : TtsProgressEvent) => {
console.log('tts progress', e.progress, e.beginPos, e.endPos)
})
onIseResult((e : IseResultEvent) => {
console.log('ise raw', e.raw)
})
const iatStartOptions : IatStartOptions = {
domain: 'iat',
language: 'zh_cn',
accent: 'mandarin',
asrPtt: true,
}
const iatSessionId = iatStart(iatStartOptions)
const ttsSpeakOptions : TtsSpeakOptions = {
text: '你好,我是讯飞语音。',
voiceName: 'xiaoyan',
}
const ttsSessionId = ttsSpeak(ttsSpeakOptions)
const iseStartOptions : IseStartOptions = {
text: '你好',
category: 'read_word',
}
const iseSessionId = iseStart(iseStartOptions)
// 根据业务时机停止
const iatStopOptions : IatStopOptions = { sessionId: iatSessionId }
const ttsStopOptions : TtsStopOptions = { sessionId: ttsSessionId }
const iseStopOptions : IseStopOptions = { sessionId: iseSessionId }
iatStop(iatStopOptions)
ttsStop(ttsStopOptions)
iseStop(iseStopOptions)
// 页面销毁时建议解绑监听并销毁实例
// destroy()
使用约定
1) 推荐统一使用 xfInit
- Android 同时导出了
init和xfInit - iOS 仅导出
xfInit - 为了跨平台一致,建议业务侧统一使用
xfInit
2) sessionId 是会话标识,不是多实例路由句柄
iatStart/ttsSpeak/iseStart成功时都会返回一个递增的sessionId- 当前实现里,IAT、TTS、ISE 各自都只维护一个活跃 native 实例
- 同类能力再次
start/speak时,会覆盖前一次活跃会话 stop/cancel里的sessionId目前主要用于业务对账和日志记录,内部不会按多个实例做路由- 建议始终传最近一次返回的
sessionId
3) onXxx/offXxx 是单槽位监听
- 每个事件类型只保存一个回调
- 再次调用
onIatResult(fn)会覆盖前一个fn offIatResult()/offTtsProgress()这类方法不需要传原回调,调用即清空
4) destroy() 会清空监听
destroy()会释放 native 实例- 同时会清空已经注册的所有
onXxx监听 - 如果你先
destroy()再重新xfInit(),需要重新绑定监听
5) success 只表示“已成功发起”,不表示“流程已完成”
iatStart/ttsSpeak/iseStart的success,表示 native 已接受启动请求- 真正结束要看对应的
onIatResult(isLast=true)、onTtsEnd、onIseResult(isLast=true)或错误回调
API 概览
初始化与销毁:
xfInit({ appId, logEnabled?, success?, fail?, complete? })setLogEnabled({ enabled, success?, fail?, complete? })destroy()
IAT(听写):
iatStart(options) => sessionIdiatStop({ sessionId })iatCancel({ sessionId })- 事件:
onIatBegin/onIatEnd/onIatVolume/onIatResult/onIatError+ 对应off...
TTS(合成):
ttsSpeak(options) => sessionIdttsStop({ sessionId })- 事件:
onTtsBegin/onTtsProgress/onTtsEnd/onTtsError+ 对应off...
ISE(评测):
iseStart(options) => sessionIdiseStop({ sessionId })iseCancel({ sessionId })- 事件:
onIseBegin/onIseEnd/onIseVolume/onIseResult/onIseError+ 对应off...
返回约定:
iatStart/ttsSpeak/iseStart失败时返回0- 成功时返回的
sessionId,与success(res)里的res.sessionId一致
API 详细说明
xfInit(options)
用于初始化讯飞 SDK,调用其他能力前必须先执行。
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
appId |
string |
是 | 无 | 讯飞开放平台 AppID |
logEnabled |
boolean |
否 | 首次初始化默认 true;后续省略时沿用当前插件日志状态 |
控制插件日志和 native SDK 日志 |
success |
function |
否 | 无 | 成功回调,参数形如 { appId } |
fail |
function |
否 | 无 | 失败回调,参数为错误对象 |
complete |
function |
否 | 无 | 完成回调,成功或失败都会触发 |
说明:
appId不能为空,否则返回9020002- Android 在相同
appId已初始化时会跳过重复初始化并直接成功返回 - Android 在切换到新
appId时会先destroy()再重新初始化
setLogEnabled(options)
动态切换插件日志和 native SDK 日志。
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
enabled |
boolean |
是 | 无 | true 开启日志,false 关闭日志 |
success |
function |
否 | 无 | 成功回调 |
fail |
function |
否 | 无 | 失败回调 |
complete |
function |
否 | 无 | 完成回调 |
destroy()
释放插件内部持有的 IAT / TTS / ISE native 实例,并清空全部监听。
IAT(语音听写)
iatStart(options)
开始一次听写会话。
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
language |
string |
否 | zh_cn |
语言参数,原样传给讯飞 SDK |
accent |
string |
否 | mandarin |
方言或口音参数,原样传给讯飞 SDK |
domain |
string |
否 | iat |
听写领域,原样传给讯飞 SDK |
vadBos |
number |
否 | 讯飞 SDK 默认值 | 前端点超时,单位毫秒 |
vadEos |
number |
否 | 讯飞 SDK 默认值 | 后端点超时,单位毫秒 |
ptt |
boolean |
否 | Android 省略时不主动设置;iOS 不支持 | Android 透传原生参数 ptt,插件本身不解释其语义 |
asrPtt |
boolean |
否 | Android 省略时沿用 SDK 默认;iOS 省略时为 false |
标点相关参数。Android 映射到 SpeechConstant.ASR_PTT,iOS 映射到 asr_PTT() |
engineType |
string |
否 | Android 省略时为 SpeechConstant.TYPE_CLOUD;iOS 不支持 |
引擎类型,当前插件只在 Android 透传 |
success |
function |
否 | 无 | 成功回调,参数形如 { sessionId } |
fail |
function |
否 | 无 | 失败回调 |
complete |
function |
否 | 无 | 完成回调 |
说明:
- 常见中文在线听写组合为:
domain: 'iat'、language: 'zh_cn'、accent: 'mandarin' - 其他取值是否可用,取决于讯飞控制台开通能力和所用 SDK 能力包
- 再次调用
iatStart会覆盖前一个活跃听写会话
iatStop({ sessionId })
正常结束当前听写。
说明:
stop是正常收尾,通常仍可能继续收到最终结果和结束事件- 建议在业务侧保留最近一次
sessionId并原样传回
iatCancel({ sessionId })
取消当前听写。
说明:
cancel用于立即中断- 取消后不保证还能收到最终结果
IAT 事件
onIatBegin(callback)
开始录音时触发,回调参数:
onIatBegin((event : IatBeginEvent) => {
console.log(event.sessionId)
})
onIatEnd(callback)
结束录音时触发,回调参数:
onIatEnd((event : IatEndEvent) => {
console.log(event.sessionId)
})
onIatVolume(callback)
音量变化时触发,回调参数:
onIatVolume((event : IatVolumeEvent) => {
console.log(event.sessionId, event.volume)
})
onIatResult(callback)
识别结果回调,回调参数:
onIatResult((event : IatResultEvent) => {
console.log(event.sessionId)
console.log(event.text)
console.log(event.isLast)
console.log(event.raw)
})
字段说明:
text:插件根据 SDK 增量结果拼接后的当前完整文本isLast:是否最后一条结果raw:讯飞 SDK 原始结果字符串,当前实现为 JSON 字符串
onIatError(callback)
错误回调,参数为错误对象。
onIatError((error : XfSpeechFail) => {
console.error(error.errCode, error.errMsg, error.data)
})
常见场景:
- 未初始化直接调用,返回
9020001 - 启动失败,返回
9030001 - 原始 JSON 解析失败,返回
9030004
TTS(语音合成)
ttsSpeak(options)
开始一次语音合成。
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
text |
string |
是 | 无 | 待合成文本,不能为空 |
voiceName |
string |
否 | 讯飞 SDK 默认值 | 发音人,原样传给讯飞 SDK |
speed |
number |
否 | 讯飞 SDK 默认值 | 语速 |
volume |
number |
否 | 讯飞 SDK 默认值 | 音量 |
pitch |
number |
否 | 讯飞 SDK 默认值 | 音调 |
engineType |
string |
否 | Android 省略时为 SpeechConstant.TYPE_CLOUD;iOS 不支持 |
引擎类型,当前插件只在 Android 透传 |
success |
function |
否 | 无 | 成功回调,参数形如 { sessionId } |
fail |
function |
否 | 无 | 失败回调 |
complete |
function |
否 | 无 | 完成回调 |
说明:
text不能为空,否则返回9020002- 如果当前已经在播报,新一次
ttsSpeak会先停止上一段播报,再开始新的播报 voiceName、speed、volume、pitch当前没有插件侧兜底默认值,省略时沿用讯飞 SDK 默认行为
ttsStop({ sessionId })
停止当前播报。
TTS 事件
onTtsBegin(callback)
onTtsBegin((event : TtsBeginEvent) => {
console.log(event.sessionId)
})
onTtsProgress(callback)
onTtsProgress((event : TtsProgressEvent) => {
console.log(event.sessionId)
console.log(event.progress, event.beginPos, event.endPos)
})
字段说明:
progress:当前播放进度百分比beginPos:当前片段起始字符位置endPos:当前片段结束字符位置
onTtsEnd(callback)
onTtsEnd((event : TtsEndEvent) => {
console.log(event.sessionId)
})
onTtsError(callback)
错误回调,参数为错误对象。
onTtsError((error : XfSpeechFail) => {
console.error(error.errCode, error.errMsg, error.data)
})
ISE(语音评测)
iseStart(options)
开始一次语音评测。
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
text |
string |
是 | 无 | 待评测文本,不能为空 |
language |
string |
否 | zh_cn |
语言参数,原样传给讯飞 SDK |
category |
string |
否 | read_sentence |
评测类别,原样传给讯飞 SDK |
resultLevel |
string |
否 | complete |
结果级别,原样传给讯飞 SDK |
vadBos |
number |
否 | 讯飞 SDK 默认值 | 前端点超时,单位毫秒 |
vadEos |
number |
否 | 讯飞 SDK 默认值 | 后端点超时,单位毫秒 |
success |
function |
否 | 无 | 成功回调,参数形如 { sessionId } |
fail |
function |
否 | 无 | 失败回调 |
complete |
function |
否 | 无 | 完成回调 |
说明:
text不能为空,否则返回9020002- 常见
category包括read_word、read_sentence,具体以讯飞评测能力文档为准 - 当前插件不负责解析评测 XML 或其他原始结构,只透出
raw
iseStop({ sessionId })
正常结束当前评测。
iseCancel({ sessionId })
取消当前评测。
ISE 事件
onIseBegin(callback)
onIseBegin((event : IseBeginEvent) => {
console.log(event.sessionId)
})
onIseEnd(callback)
onIseEnd((event : IseEndEvent) => {
console.log(event.sessionId)
})
onIseVolume(callback)
onIseVolume((event : IseVolumeEvent) => {
console.log(event.sessionId, event.volume)
})
onIseResult(callback)
onIseResult((event : IseResultEvent) => {
console.log(event.sessionId)
console.log(event.raw)
console.log(event.isLast)
})
字段说明:
raw:讯飞 SDK 原始评测结果字符串- iOS 当前明确配置为 XML 结果
- Android 当前直接透出 SDK
resultString,业务侧应按原始内容自行解析,不要假设插件已经做字段标准化
onIseError(callback)
错误回调,参数为错误对象。
onIseError((error : XfSpeechFail) => {
console.error(error.errCode, error.errMsg, error.data)
})
错误对象
所有 fail 和 onXxxError 都会收到同一结构的错误对象:
{
errSubject: 'hans-xf-speech',
errCode: 9030001,
errMsg: 'iat start failed',
data: {
nativeCode: 20006,
nativeDescription: '启动录音失败',
},
}
字段说明:
errSubject:固定为hans-xf-speecherrCode:插件错误码errMsg:插件错误描述data:附加信息,可包含field、nativeCode、nativeDescription、message、raw
错误码
| 错误码 | 含义 |
|---|---|
9020001 |
not initialized, call init() first |
9020002 |
invalid argument |
9020003 |
sdk init failed |
9030001 |
iat start failed |
9030002 |
iat stop failed |
9030003 |
iat cancel failed |
9030004 |
iat result parse failed |
9040001 |
tts speak failed |
9040002 |
tts stop failed |
9050001 |
ise start failed |
9050002 |
ise stop failed |
9050003 |
ise cancel failed |
9050004 |
ise result parse failed |
9090001 |
not implemented on this platform |
9090002 |
platform not supported |
平台差异
Android
- 导出
init和xfInit,推荐统一使用xfInit - IAT 支持
engineType、ptt、asrPtt - TTS 支持
engineType - IAT / TTS 省略
engineType时,内部使用云端引擎默认值
iOS
- 仅导出
xfInit - IAT 不透出
engineType - TTS 不透出
engineType - IAT 的
asrPtt省略时会按false处理 - ISE 结果当前明确设置为 XML 字符串
鸿蒙
- 当前为占位实现
- 初始化、启动、停止等调用都会返回
9090001 - 不建议在生产环境按已支持能力接入
权限与常见问题
Android
- 需要权限:
RECORD_AUDIO、INTERNET、ACCESS_NETWORK_STATE - 运行时需向系统申请麦克风权限,否则可能出现 “启动录音失败(nativeCode=20006)”
iOS
- 需在
Info.plist声明麦克风用途:NSMicrophoneUsageDescription - 插件已提供默认文案,可按需修改
自定义基座
- UTS 原生插件需使用“自定义基座/自定义调试基座”运行
- 标准基座下常见现象是“插件未加载”或“方法调用失败”
监听没有回调
优先检查:
- 是否在
xfInit成功后再调用start/speak - 页面是否已经调用过
destroy(),导致监听被清空 - 是否重复调用
onXxx,把之前的回调覆盖掉了 - 是否在页面卸载时被
offXxx()清掉了
10407 用户校验失败
优先检查:
xfInit传入的appId是否为接入方自己的AppID- Android / iOS SDK 二进制是否已整体替换为同一
appId下载的版本 - 是否仍在运行旧基座或缓存产物

收藏人数:
购买普通授权版(
试用
赞赏(0)
下载 342
赞赏 0
下载 11714273
赞赏 1911
赞赏
京公网安备:11010802035340号