更新记录
0.0.9(2026-04-10)
0.0.8(2026-04-10)
0.0.7(2026-04-10)
查看更多
平台兼容性
uni-app(4.87)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| √ |
√ |
√ |
- |
- |
- |
5.0 |
- |
√ |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| √ |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
uni-app x(4.87)
| Chrome |
Safari |
Android |
iOS |
鸿蒙 |
微信小程序 |
| √ |
- |
5.0 |
- |
√ |
√ |
lime-ali-nui
基于阿里云nuisdk的uni-app语音服务插件,支持语音识别(ASR)和文件转写。
功能特性
- 一句话识别:支持短语音实时识别,支持VAD(语音活动检测),支持保存录音文件
- 实时语音转写:支持长时连续语音识别,支持中间结果返回,支持词级信息
- 录音文件转写:支持将音频文件转换为文本,支持在线音频文件URL
- 语音合成(TTS):支持短文本语音合成,支持多种发音人和参数调节
- 流式语音合成(CosyVoice):支持流式输入文本,实时返回音频数据
- 多种认证方式:支持Token、AccessKey、STS Token三种认证方式
- 简洁API:使用单独的回调方法处理结果,简化开发流程
- TypeScript支持:完整的类型定义,提供良好的开发体验
平台支持
| 功能 |
Android |
HarmonyOS NEXT |
Web |
微信小程序 |
iOS |
| 一句话识别 |
✅ |
✅ |
✅ |
✅ |
✅(未测试) |
| 实时语音转写 |
✅ |
✅ |
✅ |
✅ |
✅(未测试) |
| 录音文件转写 |
✅ |
✅ |
❌ |
❌ |
✅(未测试) |
| 语音合成(TTS) |
✅ |
✅ |
✅ |
✅ |
✅(未测试) |
| 流式语音合成 |
✅ |
✅ |
❌ |
❌ |
✅(未测试) |
说明:Web 和微信小程序平台,uni-app 需要源码版,uni-app X 可直接试用
快速开始
安装插件
- 在uni-app插件市场中搜索并导入
lime-ali-nui
- 在页面中引入插件方法(见下方基本使用示例)
- Android 和 iOS 平台需要使用自定义基座运行
基本使用
1. 一句话识别
import { useAliNuiSpeechRecognizer } from '@/uni_modules/lime-ali-nui'
import type { AliNuiSpeechRecognizerStartOptions, UseAliNuiOptions } from '@/uni_modules/lime-ali-nui'
const recognizer = useAliNuiSpeechRecognizer({
appKey: 'your-app-key',
token: 'your-token',
debug: true,
success: () => {
console.log('一句话识别初始化成功')
},
fail: (error) => {
console.error('一句话识别初始化失败', error)
}
} as UseAliNuiOptions)
// 设置回调
recognizer.onStarted((taskId) => {
console.log('识别开始', taskId)
})
recognizer.onBeginOfSpeech((taskId) => {
console.log('开始说话', taskId)
})
recognizer.onResult((result) => {
console.log('识别结果', result.text)
})
recognizer.onCompleted((result) => {
console.log('识别完成', result.text)
})
recognizer.onVolumeChanged((taskId, volume) => {
console.log('声音强度变化', volume)
})
recognizer.onSessionEnded((taskId) => {
console.log('会话结束', taskId)
})
recognizer.onError((taskId, error) => {
console.error('识别错误', error)
})
// 开始识别
recognizer.start({
format: 'pcm', // 音频格式
sampleRate: 16000, // 采样率
enableVoiceDetection: true, // 启用VAD
success: (result) => {
console.log('识别启动成功', result)
},
fail: (error) => {
console.error('识别启动失败', error)
}
} as AliNuiSpeechRecognizerStartOptions)
// 停止识别
recognizer.stop()
// 取消识别
recognizer.cancel()
// 释放资源
recognizer.dispose()
2. 实时语音转写
import { useAliNuiSpeechTranscriber } from '@/uni_modules/lime-ali-nui'
import type { AliNuiSpeechTranscriberStartOptions, UseAliNuiOptions } from '@/uni_modules/lime-ali-nui'
const transcriber = useAliNuiSpeechTranscriber({
appKey: 'your-app-key',
token: 'your-token',
success: () => {
console.log('实时语音转写初始化成功')
},
fail: (error) => {
console.error('实时语音转写初始化失败', error)
}
} as UseAliNuiOptions)
// 设置回调
transcriber.onStarted((taskId) => {
console.log('转写开始', taskId)
})
transcriber.onBeginOfSpeech((taskId) => {
console.log('开始说话', taskId)
})
transcriber.onResult((result) => {
console.log('转写结果', result.text)
})
transcriber.onCompleted((result) => {
console.log('转写完成', result.text)
})
transcriber.onVolumeChanged((taskId, volume) => {
console.log('声音强度变化', volume)
})
transcriber.onSessionEnded((taskId) => {
console.log('会话结束', taskId)
})
transcriber.onError((taskId, error) => {
console.error('转写错误', error)
})
// 开始转写
transcriber.start({
format: 'opus', // 音频格式
sampleRate: 16000, // 采样率
enableIntermediateResult: true, // 返回中间结果
enableWords: true, // 返回词级信息
success: (result) => {
console.log('转写启动成功', result)
},
fail: (error) => {
console.error('转写启动失败', error)
}
} as AliNuiSpeechTranscriberStartOptions)
// 停止转写
transcriber.stop()
// 取消转写
transcriber.cancel()
// 释放资源
transcriber.dispose()
3. 录音文件转写
import { useAliNuiFileTranscriber } from '@/uni_modules/lime-ali-nui'
import type { AliNuiFileTranscriberStartOptions, UseAliNuiOptions } from '@/uni_modules/lime-ali-nui'
const fileTranscriber = useAliNuiFileTranscriber({
appKey: 'your-app-key',
token: 'your-token',
success: () => {
console.log('录音文件转写初始化成功')
},
fail: (error) => {
console.error('录音文件转写初始化失败', error)
}
} as UseAliNuiOptions)
// 设置回调
fileTranscriber.onResult((result) => {
console.log('转写结果', result.text)
})
fileTranscriber.onError((taskId, error) => {
console.error('转写错误', error)
})
// 开始录音文件转写
fileTranscriber.start({
filePath: 'https://example.com/audio.wav', // 支持本地文件路径或在线音频URL
sampleRate: 16000, // 音频采样率
format: 'wav', // 音频格式
enableInverseTextNormalization: true, // 启用ITN
enableWordLevelResult: false, // 不返回词级信息
success: (result) => {
console.log('录音文件转写成功', result.text)
},
fail: (error) => {
console.error('录音文件转写失败', error)
}
} as AliNuiFileTranscriberStartOptions)
// 取消转写
fileTranscriber.cancel()
// 释放资源
fileTranscriber.dispose()
4. 语音合成(TTS)
import { useAliNuiTts } from '@/uni_modules/lime-ali-nui'
import type { AliNuiTtsStartOptions, UseAliNuiOptions } from '@/uni_modules/lime-ali-nui'
const tts = useAliNuiTts({
appKey: 'your-app-key',
token: 'your-token',
success: () => {
console.log('语音合成初始化成功')
},
fail: (error) => {
console.error('语音合成初始化失败', error)
}
} as UseAliNuiOptions)
// 设置回调
tts.onStarted((taskId) => {
console.log('合成开始', taskId)
})
tts.onCompleted((taskId) => {
console.log('合成完成', taskId)
})
tts.onCanceled((taskId) => {
console.log('合成取消', taskId)
})
tts.onPaused((taskId) => {
console.log('合成暂停', taskId)
})
tts.onResumed((taskId) => {
console.log('合成恢复', taskId)
})
tts.onError((taskId, error) => {
console.error('合成错误', error)
})
tts.onData((taskId, data, base64) => {
console.log('音频数据', data?.byteLength)
})
tts.onVolumeChanged((taskId, volume) => {
console.log('音量变化', volume)
})
// 开始语音合成
tts.start({
text: '您好,这是语音合成示例', // 合成文本
fontName: 'aiqi', // 发音人
speedLevel: 1.0, // 语速
pitchLevel: 0, // 音调
volume: 1.0, // 音量
format: 'mp3', // 音频格式
success: (result) => {
console.log('语音合成成功', result.taskId)
},
fail: (error) => {
console.error('语音合成失败', error)
}
} as AliNuiTtsStartOptions)
// 停止合成
tts.stop()
// 暂停合成
tts.pause()
// 恢复合成
tts.resume()
// 释放资源
tts.dispose()
5. 流式语音合成(CosyVoice)
import { useAliNuiStreamTts } from '@/uni_modules/lime-ali-nui'
import type { AliNuiStreamTtsStartOptions, UseAliNuiOptions } from '@/uni_modules/lime-ali-nui'
const streamTts = useAliNuiStreamTts({
appKey: 'your-app-key',
token: 'your-token',
success: () => {
console.log('流式语音合成初始化成功')
},
fail: (error) => {
console.error('流式语音合成初始化失败', error)
}
} as UseAliNuiOptions)
// 设置回调
streamTts.onStarted((taskId) => {
console.log('合成开始', taskId)
})
streamTts.onCompleted((taskId) => {
console.log('合成完成', taskId)
})
streamTts.onCanceled((taskId) => {
console.log('合成取消', taskId)
})
streamTts.onError((taskId, error) => {
console.error('合成错误', error)
})
streamTts.onSubtitle((taskId, subtitle) => {
console.log('字幕', subtitle)
})
streamTts.onData((taskId, data, base64) => {
console.log('音频数据', data?.byteLength)
// 可以在这里处理音频数据,例如播放或保存
})
// 开始流式语音合成
streamTts.start({
voice: 'longyumi_v2', // 发音人
format: 'mp3', // 音频格式
sampleRate: 22050, // 采样率
volume: 50, // 音量(0-100)
rate: 1.0, // 语速
pitch: 1.0, // 音调
enableSubtitle: true, // 启用字幕
saveAudio: true, // 保存音频文件
success: (result) => {
console.log('合成成功', result.taskId, result.tempFilePath)
},
fail: (error) => {
console.error('合成失败', error)
}
} as AliNuiStreamTtsStartOptions)
// 发送文本(流式输入)
streamTts.sendText('您好,')
setTimeout(() => {
streamTts.sendText('这是流式语音合成示例')
setTimeout(() => {
streamTts.sendText(',支持实时返回音频数据。')
// 停止合成
streamTts.stop()
}, 1000)
}, 1000)
// 取消合成
// streamTts.cancel()
// 释放资源
// streamTts.dispose()
API 文档
useAliNuiSpeechRecognizer
创建一句话识别实例。
useAliNuiSpeechRecognizer(options: UseAliNuiOptions): AliNuiSpeechRecognizer
UseAliNuiOptions
| 参数 |
类型 |
必填 |
说明 |
| appKey |
string |
是 |
项目AppKey |
| token |
string |
否 |
Token |
| accessKey |
string |
否 |
AccessKey ID |
| accessKeySecret |
string |
否 |
AccessKey Secret |
| stsToken |
string |
否 |
STS Token |
| url |
string |
否 |
自定义服务地址 |
| debug |
boolean |
否 |
是否开启调试模式 |
| success |
() => void |
否 |
成功回调 |
| fail |
(error: any) => void |
否 |
失败回调 |
AliNuiSpeechRecognizer
一句话识别实例。
方法
| 方法 |
说明 |
| start(options: AliNuiSpeechRecognizerStartOptions) |
开始一句话识别 |
| stop() |
停止识别 |
| cancel() |
取消识别 |
| onStarted(cb: (taskId: string) => void) |
设置识别开始回调 |
| onBeginOfSpeech(cb: (taskId: string) => void) |
设置开始说话回调 |
| onResult(cb: (result: AliNuiSpeechRecognizerResult) => void) |
设置识别结果回调 |
| onCompleted(cb: (result: AliNuiSpeechRecognizerResult) => void) |
设置识别完成回调 |
| onVolumeChanged(cb: (taskId: string, volume: number) => void) |
设置音量变化回调 |
| onSessionEnded(cb: (taskId: string) => void) |
设置会话结束回调 |
| onError(cb: (taskId: string, error: any) => void) |
设置错误回调 |
| dispose() |
释放资源 |
AliNuiSpeechRecognizerStartOptions
| 参数 |
类型 |
必填 |
说明 |
| format |
string |
否 |
音频格式,支持:pcm、opus,默认'pcm' |
| sampleRate |
number |
否 |
采样率,支持:8000、16000,默认16000 |
| enableVoiceDetection |
boolean |
否 |
是否启用VAD,默认false |
| maxStartSilence |
number |
否 |
最长开始静音时间(毫秒),默认10000 |
| maxEndSilence |
number |
否 |
最长结尾静音时间(毫秒),默认800 |
| enablePunctuation |
boolean |
否 |
是否添加标点,默认true |
| enableIntermediateResult |
boolean |
否 |
是否返回中间结果,默认true |
| enableInverseTextNormalization |
boolean |
否 |
是否启用ITN,默认false |
| customizationId |
string |
否 |
自学习模型ID |
| vocabularyId |
string |
否 |
定制泛热词ID |
| saveAudio |
boolean |
否 |
是否保存录音文件,默认false |
| success |
(result: AliNuiSpeechRecognizerResult) => void |
否 |
成功回调 |
| fail |
(error: any) => void |
否 |
失败回调 |
AliNuiSpeechRecognizerResult
| 属性 |
类型 |
说明 |
| taskId |
string |
任务ID |
| text |
string |
识别文本 |
| isFinal |
boolean |
是否为最终结果 |
| confidence |
number |
置信度 |
| tempFilePath |
string |
保存的音频文件路径(当saveAudio为true时) |
| raw |
object |
原始结果 |
useAliNuiSpeechTranscriber
创建实时语音转写实例。
useAliNuiSpeechTranscriber(options: UseAliNuiOptions): AliNuiSpeechTranscriber
AliNuiSpeechTranscriber
实时语音转写实例。
方法
| 方法 |
说明 |
| start(options: AliNuiSpeechTranscriberStartOptions) |
开始实时语音转写 |
| stop() |
停止转写 |
| cancel() |
取消转写 |
| onStarted(cb: (taskId: string) => void) |
设置转写开始回调 |
| onBeginOfSpeech(cb: (taskId: string) => void) |
设置开始说话回调 |
| onResult(cb: (result: AliNuiSpeechTranscriberResult) => void) |
设置转写结果回调 |
| onCompleted(cb: (result: AliNuiSpeechTranscriberResult) => void) |
设置转写完成回调 |
| onVolumeChanged(cb: (taskId: string, volume: number) => void) |
设置音量变化回调 |
| onSessionEnded(cb: (taskId: string) => void) |
设置会话结束回调 |
| onError(cb: (taskId: string, error: any) => void) |
设置错误回调 |
| dispose() |
释放资源 |
AliNuiSpeechTranscriberStartOptions
| 参数 |
类型 |
必填 |
说明 |
| format |
string |
否 |
音频格式,支持:pcm、opus,默认'opus' |
| sampleRate |
number |
否 |
采样率,支持:8000、16000,默认16000 |
| enablePunctuation |
boolean |
否 |
是否添加标点,默认true |
| enableIntermediateResult |
boolean |
否 |
是否返回中间结果,默认true |
| enableInverseTextNormalization |
boolean |
否 |
是否启用ITN,默认false |
| maxSentenceSilence |
number |
否 |
断句检测阈值(毫秒),默认800 |
| enableWords |
boolean |
否 |
是否返回词级信息,默认false |
| disfluency |
boolean |
否 |
是否过滤语气词,默认false |
| speechNoiseThreshold |
number |
否 |
噪音参数阈值,范围-1~+1 |
| customizationId |
string |
否 |
自学习模型ID |
| vocabularyId |
string |
否 |
定制泛热词ID |
| saveAudio |
boolean |
否 |
是否保存录音文件,默认false |
| success |
(result: AliNuiSpeechTranscriberResult) => void |
否 |
成功回调 |
| fail |
(error: any) => void |
否 |
失败回调 |
AliNuiSpeechTranscriberResult
| 属性 |
类型 |
说明 |
| taskId |
string |
任务ID |
| text |
string |
转写文本 |
| isFinal |
boolean |
是否为最终结果 |
| confidence |
number |
置信度 |
| tempFilePath |
string |
保存的音频文件路径(当saveAudio为true时) |
| raw |
object |
原始结果 |
useAliNuiFileTranscriber
创建录音文件转写实例。
useAliNuiFileTranscriber(options: UseAliNuiOptions): AliNuiFileTranscriber
AliNuiFileTranscriber
录音文件转写实例。
方法
| 方法 |
说明 |
| start(options: AliNuiFileTranscriberStartOptions) |
开始文件转写 |
| cancel() |
取消转写 |
| onResult(cb: (result: AliNuiFileTranscriberResult) => void) |
设置转写结果回调 |
| onError(cb: (taskId: string, error: any) => void) |
设置错误回调 |
| dispose() |
释放资源 |
AliNuiFileTranscriberStartOptions
| 参数 |
类型 |
必填 |
说明 |
| filePath |
string |
是 |
音频文件路径或在线音频URL |
| format |
string |
否 |
音频格式,默认根据文件扩展名判断 |
| sampleRate |
number |
否 |
音频采样率,默认16000 |
| enableInverseTextNormalization |
boolean |
否 |
是否启用逆文本标准化 |
| enableWordLevelResult |
boolean |
否 |
是否返回词级结果 |
| firstChannelOnly |
boolean |
否 |
是否只处理第一个声道 |
| success |
(result: AliNuiFileTranscriberResult) => void |
否 |
成功回调 |
| fail |
(error: any) => void |
否 |
失败回调 |
AliNuiFileTranscriberResult
| 属性 |
类型 |
说明 |
| taskId |
string |
任务ID |
| text |
string |
转写文本 |
| isFinal |
boolean |
是否为最终结果 |
| confidence |
number |
置信度 |
| raw |
object |
原始结果 |
useAliNuiTts
创建语音合成实例。
useAliNuiTts(options: UseAliNuiOptions): AliNuiTts
AliNuiTts
语音合成实例。
方法
| 方法 |
说明 |
| start(options: AliNuiTtsStartOptions) |
开始语音合成 |
| stop() |
停止合成 |
| pause() |
暂停合成 |
| resume() |
恢复合成 |
| onStarted(cb: (taskId: string) => void) |
设置合成开始回调 |
| onCompleted(cb: (taskId: string) => void) |
设置合成完成回调 |
| onCanceled(cb: (taskId: string) => void) |
设置合成取消回调 |
| onPaused(cb: (taskId: string) => void) |
设置合成暂停回调 |
| onResumed(cb: (taskId: string) => void) |
设置合成恢复回调 |
| onError(cb: (taskId: string, error: any) => void) |
设置错误回调 |
| onData(cb: (taskId: string, data?: ArrayBuffer, base64?: string) => void) |
设置音频数据回调 |
| onVolumeChanged(cb: (taskId: string, volume: number) => void) |
设置音量变化回调 |
| dispose() |
释放资源 |
AliNuiTtsStartOptions
| 参数 |
类型 |
必填 |
说明 |
| text |
string |
是 |
合成文本 |
| fontName |
string |
否 |
发音人 |
| speedLevel |
number |
否 |
语速,取值范围:0.5~2.0,默认1.0 |
| pitchLevel |
number |
否 |
音调,取值范围:-500~500,默认0 |
| volume |
number |
否 |
音量,取值范围:0.1~2.0,默认1.0 |
| format |
string |
否 |
音频格式,支持:mp3、pcm、wav,默认mp3 |
| success |
(result: AliNuiTtsResult) => void |
否 |
成功回调 |
| fail |
(error: any) => void |
否 |
失败回调 |
AliNuiTtsResult
| 属性 |
类型 |
说明 |
| taskId |
string |
任务ID |
| tempFilePath |
string |
保存的音频文件路径(当saveAudio为true时) |
useAliNuiStreamTts
创建流式语音合成(CosyVoice)实例。
useAliNuiStreamTts(options: UseAliNuiOptions): AliNuiStreamTts
AliNuiStreamTts
流式语音合成(CosyVoice)实例。
方法
| 方法 |
说明 |
| start(options: AliNuiStreamTtsStartOptions) |
开始流式语音合成 |
| sendText(text: string) |
发送文本(流式输入) |
| stop() |
停止合成 |
| cancel() |
取消合成 |
| onStarted(cb: (taskId: string) => void) |
设置合成开始回调 |
| onCompleted(cb: (taskId: string) => void) |
设置合成完成回调 |
| onCanceled(cb: (taskId: string) => void) |
设置合成取消回调 |
| onError(cb: (taskId: string, error: any) => void) |
设置错误回调 |
| onSubtitle(cb: (taskId: string, subtitle: string) => void) |
设置字幕回调 |
| onData(cb: (taskId: string, data?: ArrayBuffer, base64?: string) => void) |
设置音频数据回调 |
| dispose() |
释放资源 |
AliNuiStreamTtsStartOptions
| 参数 |
类型 |
必填 |
说明 |
| voice |
string |
否 |
发音人,默认'longyumi_v2' |
| format |
string |
否 |
音频格式,默认'mp3' |
| sampleRate |
number |
否 |
采样率,默认22050 |
| volume |
number |
否 |
音量(0-100),默认50 |
| rate |
number |
否 |
语速,默认1.0 |
| pitch |
number |
否 |
音调,默认1.0 |
| enableSubtitle |
boolean |
否 |
是否启用字幕,默认false |
| saveAudio |
boolean |
否 |
是否保存音频文件,默认false |
| success |
(result: AliNuiTtsResult) => void |
否 |
成功回调 |
| fail |
(error: any) => void |
否 |
失败回调 |
错误码
| 错误码 |
说明 |
| 9200001 |
初始化失败 |
| 9200002 |
参数错误 |
| 9200003 |
认证失败 |
| 9200004 |
网络错误 |
| 9200005 |
语音合成失败 |
| 9200006 |
语音识别失败 |
| 9200007 |
录音权限被拒绝 |
| 9200008 |
未初始化 |
| 9200009 |
SDK文件缺失 |
| 9200010 |
录音设备错误 |
| 9200011 |
播放设备错误 |
| 9200012 |
Token过期 |
| 9200013 |
音频文件读取失败 |
| 9200014 |
播放器未初始化 |
| 9200015 |
播放器正在播放 |
| 9200016 |
播放器已停止 |
权限说明
插件需要以下权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
注意事项
- 认证方式:推荐使用Token认证方式,避免在客户端存储AccessKey和AccessKeySecret
- 权限申请:首次使用需要申请录音权限
- 资源释放:使用完毕后务必调用dispose()释放资源
- 网络环境:需要稳定的网络连接
- SDK版本:基于阿里云nuisdk v2.7.2开发
- 回调设置:回调方法需要在start()之前设置,以确保能接收到所有事件
获取AppKey和Token
- 登录阿里云控制台
- 创建项目,获取AppKey
- 根据认证方式获取相应的凭证:
- Token:通过服务端生成Token
- AccessKey:在阿里云控制台右上角获取
- STS Token:通过STS服务获取临时凭证
相关文档