语音服务
语音服务提供 API 调用设备“说话”、“听出”和“听懂”用户话语等语音相关的能力。作为语音服务访问代理的 SpeechManager 对象,提供了语音服务的主要 API,可通过 RobotContext 对象获取到。
SpeechManager speechManager = aRobotContext.getSystemService(SpeechManager.SERVICE);
在语音领域,存在 KWS(Keyword Spotting)、TTS(Text to Speech)、ASR(Automatic Speech Recognition)、NLU(Natural Language Understanding)与 NLP(Natural Language Processing)等术语,这些术语分别指代了语音领域内语音唤醒、语音合成、语音识别、自然语言理解与处理等细分的技术。语音服务用这些技术来实现,调用 SpeechManager API 实际上是对这些技术能力的调用。以下章节将逐项来介绍。
语音唤醒
当用户向设备说出唤醒词时,利用语音唤醒技术,设备可感知到用户在“叫自己”,随后可开启与用户的交互。这个过程称为“语音唤醒”。如果需要感知到语音唤醒,通过以下代码来实现。
WakeUpListener wakeUpListener = new WakeUpListener() { @Override public void onWakingUp(WakeUp wakeUp /* [1] */) { // 感知到用户朝设备说出唤醒词后将运行至此 } }; speechManager.registerWakeUpListener(wakeUpListener);
[1] WakeUp 对象描述了语音唤醒时刻的环境信息,具体包括:
| 属性 getter | 说明 |
|---|---|
| WakeUp.when | 唤醒时刻的时间戳,单位 ms。 |
| WakeUp.voiceDirection | 唤醒时刻的声音来源 |
如果不再需要感知语音唤醒,通过以下代码来实现。
speechManager.unregisterWakeUpListener(wakeUpListener);
语音合成
当需要设备像人类一样说话时,利用语音合成技术,可以将文本句子合成为人声并播放出来。该过程通过以下代码来实现。
promise /* [2] */ = speechManager.synthesize("你好,有什么可以为您服务?" /* [1] */) .progress(new ProgressCallback<SynthesisProgress>() { @Override public void onProgress(SynthesisProgress progress /* [3] */) { // 合成过程会多次运行至此 } }).done(new DoneCallback<Void>() { @Override public void onDone(Void aVoid) { // “你好,有什么可以为您服务?”“说”(播放)完之后运行至此 } }).fail(new FailCallback<SynthesisException>() { @Override public void onFail(SynthesisException e) { // 合成出错时运行至此 } });
[1] 输入待合成的文本句子,支持多句、携带标点。
[2] 返回等待合成进度与结果的异步对象,通过该对象可等待或监听进度与结果以及取消合成过程。具体用法参考 Promise。
[3] 异步回调的 SynthesisProgress 对象描述了语音合成的进度信息,具体包括:
| 属性 getter | 说明 |
|---|---|
| SynthesisProgress.remainingTimeMillis | 剩余播放时长 |
| SynthesisProgress.playProgress | 播放进度 |
| SynthesisProgress.audioBytes | 播放资源,有些平台可能不提供该资源 |
通过指定选项,可调整语音合成的行为。
SynthesisOption /*[1]*/ option = new SynthesisOption.Builder("你好,有什么可以为您服务?").build(); promise = speechManager.synthesize(option);
[1] SynthesisOption 对象通过 SynthesisOption.Builder 构建,使用说明如下:
| 方法 | 说明 | 默认值 |
|---|---|---|
| Builder.constructor(inputText) | 构造时必须传入合成的文本,不允许传入 NULL 对象或长度为 0 的字符串 | |
| Builder.setSpeakingSpeed(speakingSpeed) | 设置语速 | 0 |
| Builder.setSpeakingVolume(speakingVolume) | 设置音量大小 | 0 |
| Builder.setSpeakingVoiceId(speakingVoiceId) | 设置发言人,想了解系统都有哪些发言人,请参考语音设置 | 长度为 0 的字符串 |
| 常量 | 说明 |
|---|---|
| SynthesisOption.SPEAKING_VOLUME_MAX | 最大可设置音量 |
| SynthesisOption.SPEAKING_VOLUME_MIN | 最小可设置音量 |
| SynthesisOption.SPEAKING_SPEED_FAST | 较快语速 |
| SynthesisOption.SPEAKING_SPEED_NORMAL | 正常语速 |
| SynthesisOption.SPEAKING_SPEED_SLOW | 较慢语速 |
如果想知道当前的合成状态,通过以下代码实现。
boolean isSynthesizing = speechManager.isSynthesizing();
返回 true 表示正在合成。
语音识别
当用户朝设备说话时,利用语音识别技术,可以将语音转换成文本或指令。该过程通过如下代码来实现。
RecognitionOption /* [1] */ option = new RecognitionOption.Builder( RecognitionOption.MODE_SINGLE).build(); promise /* [2] */ = speechManager.recognize(option) .progress(new ProgressCallback<RecognitionProgress>() { @Override public void onProgress(RecognitionProgress recognitionProgress /* [3] */) { // 识别过程会多次运行至此 } }).done(new DoneCallback<RecognitionResult>() { @Override public void onDone(RecognitionResult recognitionResult /* [4] */) { // 识别过程完毕会运行至此,返回最终识别结果 } }).fail(new FailCallback<RecognitionException>() { @Override public void onFail(RecognitionException e) { // 识别出错时运行至此 } });
[1] 语音识别选项,可调整语音识别行为。通过 RecognitionOption.Builder 构建,使用说明如下:
| 方法 | 说明 | 默认值 |
|---|---|---|
| Builder.constructor(mode) | 构造时必须指定识别模式 | |
| Builder.setDistanceRange(distanceRange) | 识别场景 | 1: 近场识别 |
| Builder.setTimeoutMillis(timeoutMillis) | 识别超时时长 | 0: 不超时 |
| Builder.setUnderstandingOption(understandingOption) | 自然语言处理选项 | NULL |
| Builder.setExtension(extension) | 自定义的字段 | NULL |
| 常量 | 说明 |
|---|---|
| RecognitionOption.MODE_SINGLE | 单次识别:一般用于唤醒之后启动一次语音识别,得到结果后停止识别,等待下一次唤醒 |
| RecognitionOption.MODE_CONTINUOUS | 持续识别:启动唤醒之后不间断识别,识别到结果后返回数据,继续下一次识别 |
| RecognitionOption.DISTANCE_RANGE_NEAR_FIELD | 近场识别 |
| RecognitionOption.DISTANCE_RANGE_FAR_FIELD | 远场识别 |
| RecognitionOption.DISTANCE_RANGE_CLOSE_TALK | 超近场识别 |
[2] 返回等待识别进度与结果的异步对象,通过该对象可等待或监听进度与结果以及取消合成过程。具体用法参考 Promise。
[3] 异步回调的 RecognitionProgress 对象描述了语音识别的进度信息,具体包括:
| 属性 getter | 说明 |
|---|---|
| RecognitionProgress.decibel | 识别到的分贝 |
| RecognitionProgress.textResult | 识别到的语音转换成的文本 |
| RecognitionProgress.understandingResult | 识别到的语音经过自然语言处理的结果,详情请见 自然语言处理 |
| RecognitionProgress.progress | 识别进度 |
| 常量 | 说明 |
|---|---|
| RecognitionResult.began | 识别开始 |
| RecognitionResult.ended | 识别结束 |
| RecognitionProgress.PROGRESS_RECOGNIZING | 识别中 |
| RecognitionProgress.PROGRESS_RECOGNITION_TEXT_RESULT | 识别到文本 |
| RecognitionProgress.PROGRESS_UNDERSTANDING_RESULT | 自然语言处理过程中 |
[4] 异步回调的 RecognitionResult 对象描述了语音识别的最终结果,具体包括:
| 属性 getter | 说明 |
|---|---|
| RecognitionResult.text | 识别出的文本 |
| RecognitionResult.withUnderstandingResult | true: 识别结果经过自然语言处理 |
| RecognitionResult.understandingResult | 自然语言处理结果 |
单次识别,不想构建识别选项,也可以使用无参接口,具体使用过程如下:
promise = speechManager.recognize();
如果想知道当前的识别状态,通过以下代码实现。
boolean isRecognizing = speechManager.isRecognizing();
返回 true 表示正在识别。
自然语言处理
当需要设备像人类一样具有“听”的能力,利用自然语言处理技术,设备可以感知用户在和自己对话,随后开启与用户交互。该过程通过如下代码实现。
promise /* [2] */ = speechManager.understand("今天天气怎么样?" /* [1] */) .done(new DoneCallback<UnderstandingResult>() { @Override public void onDone(UnderstandingResult understandingResult /* [3] */) { // 自然语言处理完毕后将返回至此,此时可以调用语音合成接口与用户进行对话 } }).fail(new FailCallback<UnderstandingException>() { @Override public void onFail(UnderstandingException e) { // 自然语言处理出错时运行至此 } });
[1] 输入待进行自然语言处理的文本句子,支持多句、携带标点。
[2] 返回自然语言处理结果的异步对象,通过该对象获取结果以及取消处理过程。具体用法参考 Promise。
[3] 返回自然语言处理结果,具体包括:
| 属性 getter | 说明 |
|---|---|
| UnderstandingResult.sessionId | 会话 id,多轮对话时保持不变 |
| UnderstandingResult.source | 自然语言处理服务厂商 |
| UnderstandingResult.inputText | 需要理解的文本 |
| UnderstandingResult.language | 系统语言 |
| UnderstandingResult.version | 自然语言处理服务厂商库的版本 |
| UnderstandingResult.sessionIncomplete | false:会话完成 |
| UnderstandingResult.contextList | 上下文参数 |
| UnderstandingResult.intent | 意图,详情请见 SpeechIntent |
| SpeechIntent.action | 意图 |
| SpeechIntent.parameters | 词槽 |
| SpeechIntent.score | 匹配度 |
| UnderstandingResult.speechFulfillment | 自然语言处理后的播报信息,详情请见 SpeechFulfillment |
| SpeechFulfillment.type | 识别结果来源 |
| SpeechFulfillment.text | type = TYPE_TEXT |
| SpeechFulfillment.uri | type = TYPE_URI |
| SpeechFulfillment.audio | type = TYPE_AUDIO |
| SpeechFulfillment.audioType | 音频格式 |
| UnderstandingResult.fulfillmentList | 自然语言处理详细结果 |
通过指定选项,可调整自然语言处理的行为。
UnderstandingOption /* [1] */ option = new UnderstandingOption.Builder( "今天天气怎么样?").build(); promise = speechManager.understand(option);
[1] UnderstandingOption 对象通过 UnderstandingOption.Builder 构建,使用说明如下:
| 方法 | 说明 | 默认值 |
|---|---|---|
| Builder.constructor() | 无参构造 | 自然语言处理文本为长度为 0 的字符串 |
| Builder.constructor(inputText) | 构造时必须指定要执行自然语言处理的文本信息 | |
| Builder.setSessionId(sessionId) | 会话 id | 长度为 0 的字符串 |
| Builder.setVersion(version) | 自然语言处理服务厂商库的版本 | 长度为 0 的字符串 |
| Builder.setParameters(parameters) | 自定义参数 | JsonObjectString.EMPTY_OBJECT |
| Builder.setContextList(contextList) | 上下文参数 | JsonArrayString.EMPTY_ARRAY |
| Builder.setTimeoutMillis(timeoutMillis) | 理解超时时长 | 0 : 不超时 |
语音设置
需要获取或设置设备语音配置信息,可通过 SpeechSettings对象实现。
SpeechSettings speechSettings = speechManager.speechSettings();
| 方法 | 说明 |
|---|---|
| SpeechSettings.getConfiguration() | 获取语言配置信息 |
| SpeechSettings.setConfiguration(configutation) | 设置语言配置信息 |
| SpeechSettings.registerListener(listener) | 注册语音配置变更监听 |
| SpeechSettings.unregisterListener(listener) | 注销语音配置变更监听 |
设置语音相关的配置信息,可通过如下代码实现。
SpeechConfiguration /* [1] */ configutation = new SpeechConfiguration.Builder().build(); speechSettings.setConfiguration(configutation);
[1] 语音配置信息,通过 SpeechConfiguration.Builder 构建,使用说明如下:
| 方法 | 说明 | 默认值 |
|---|---|---|
| Builder.constructor() | 无参构造,不指定识别模式 | |
| Builder.setRecognitionMode(recognitionMode) | 识别模式 | 0:不知道的识别模式 |
| Builder.setSpeakingVoiceId(speakingVoiceId) | 发言人 | NULL |
| Builder.setSpeakingSpeed(speakingSpeed) | 语速 | 0 |
| Builder.setSpeakingVolume(speakingVolume) | 音量 | 0 |
| 常量 | 说明 |
|---|---|
| SpeechConfiguration.RECOGNITION_MODE_UNKNOWN | 不知道的识别模式 |
| SpeechConfiguration.RECOGNITION_MODE_SINGLE | 单次识别模式 |
| SpeechConfiguration.RECOGNITION_MODE_CONTINUOUS | 持续识别模式 |
| SpeechConfiguration.SPEAKING_VOLUME_MAX | 可设置的最大音量 |
| SpeechConfiguration.SPEAKING_VOLUME_MIN | 可设置的最小音量 |
| SpeechConfiguration.SPEAKING_SPEED_FAST | 较快语速 |
| SpeechConfiguration.SPEAKING_SPEED_NORMAL | 正常语速 |
| SpeechConfiguration.SPEAKING_SPEED_SLOW | 较慢语速 |
获取语音配置信息,可通过如下代码实现:
SpeechConfiguration configutation = speechSettings.getConfiguration();
需要感知语音配置变更,可通过如下代码实现:
SpeechConfigurationListener listener = new SpeechConfigurationListener() { @Override public void onConfigurationChanged(SpeechConfiguration speechConfiguration) { // 设备语音配置改变时将运行至此 } }; speechSettings.registerListener(listener);
不在需要感知语音配置变更,可通过如下代码实现:
speechSettings.unregisterListener(listener);