001package com.aispeech.dui.dds; 002 003import com.aispeech.dui.dds.agent.Agent; 004 005import org.json.JSONException; 006import org.json.JSONObject; 007 008public class DDSConfigBuilder { 009 private DDSConfig mDDSConfig = new DDSConfig(); 010 011 public DDSConfigBuilder(String productId, 012 String aliasKey, 013 String apiKey, 014 String productKey, 015 String productSecret, 016 String duicoreZip) { 017 mDDSConfig.addConfig(DDSConfig.K_PRODUCT_ID, productId); 018 mDDSConfig.addConfig(DDSConfig.K_PRODUCT_KEY, productKey); 019 mDDSConfig.addConfig(DDSConfig.K_PRODUCT_SECRET, productSecret); 020 mDDSConfig.addConfig(DDSConfig.K_API_KEY, apiKey); 021 mDDSConfig.addConfig(DDSConfig.K_ALIAS_KEY, aliasKey); 022 mDDSConfig.addConfig(DDSConfig.K_DUICORE_ZIP, duicoreZip); 023 } 024 025 public DDSConfigBuilder addConfig(String key, Object value) { 026 mDDSConfig.addConfig(key, String.valueOf(value)); 027 return this; 028 } 029 030 public DDSConfig build() { 031 return mDDSConfig; 032 } 033 034 public CommonBuilder createCommonBuilder() { 035 return new CommonBuilder(mDDSConfig); 036 } 037 038 public WakeupBuilder createWakeupBuilder() { 039 return new WakeupBuilder(mDDSConfig); 040 } 041 042 public RecorderBuilder createRecorderBuilder() { 043 return new RecorderBuilder(mDDSConfig); 044 } 045 046 public TtsBuilder createTtsBuilder() { 047 return new TtsBuilder(mDDSConfig); 048 } 049 050 public DmBuilder createDmBuilder() { 051 return new DmBuilder(mDDSConfig); 052 } 053 054 public AsrBuilder createAsrBuilder() { 055 return new AsrBuilder(mDDSConfig); 056 } 057 058 public NodeBuilder createNodeBuilder() { 059 return new NodeBuilder(mDDSConfig); 060 } 061 062 /** 063 * 设备信息、使用目录、VOIP功能 等通用配置 064 */ 065 public static class CommonBuilder extends BaseBuilder { 066 public CommonBuilder(DDSConfig ddsConfig) { 067 super(ddsConfig); 068 } 069 070 /** 071 * 设备 DeviceName, 用来标识设备的标识符<br> 072 * 取值:设备 DeviceName <br> 073 * 默认值:无<br> 074 * 075 * @param deviceName 设备 DeviceName 076 * @return CommonBuilder 077 */ 078 @Deprecated 079 public CommonBuilder setDeviceName(String deviceName) { 080 mDdsConfig.addConfig(DDSConfig.K_DEVICE_NAME, deviceName); 081 return this; 082 } 083 084 /** 085 * 用户ID<br> 086 * 取值:用户ID(保留字段)<br> 087 * 默认值:USER2021ID 088 * 089 * @param userId 用户ID 090 * @return CommonBuilder 091 */ 092 public CommonBuilder setUserId(String userId) { 093 mDdsConfig.addConfig(DDSConfig.K_USER_ID, userId); 094 return this; 095 } 096 097 /** 098 * SDK初始化超时时间,单位秒<br> 099 * 默认值:60<br> 100 * 101 * @param timeout 初始化超时时间,单位秒 102 * @return CommonBuilder 103 */ 104 public CommonBuilder setInitTimeout(int timeout) { 105 mDdsConfig.addConfig(DDSConfig.K_INIT_TIMEOUT, String.valueOf(timeout)); 106 return this; 107 } 108 109 /** 110 * 自定义授权证书的SHA256, sdk 授权时会检查包名和签名的SHA256,第三方加固后可能改变,可以配置新的SHA256<br> 111 * 默认值:<br> 112 * 113 * @param customSha256 授权证书的SHA256 114 * @return CommonBuilder 115 */ 116 public CommonBuilder setCustomSha256(String customSha256) { 117 mDdsConfig.addConfig(DDSConfig.K_CUSTOM_SHA256, customSha256); 118 return this; 119 } 120 121 /** 122 * 设备ID<br> 123 * 用于授权认证的原始设备ID,请务必确保设备ID唯一。<br> 124 * 可以通过 DDS.getInstance().getDeviceName() 获取授权认证后的唯一ID <br> 125 * 126 * @param deviceId 设备ID 127 * @return CommonBuilder 128 */ 129 @Deprecated 130 public CommonBuilder setDeviceId(String deviceId) { 131 mDdsConfig.addConfig(DDSConfig.K_DEVICE_ID, deviceId); 132 return this; 133 } 134 135 /** 136 * assets目录下的离线授权文件名<br> 137 * 取值:assets目录下的离线授权文件名<br> 138 * 默认值:<br> 139 * 140 * @param offlineProfileName 离线授权文件名 141 * @return CommonBuilder 142 */ 143 public CommonBuilder setOfflineProfileName(String offlineProfileName) { 144 mDdsConfig.addConfig(DDSConfig.K_OFFLINE_PROFILE_NAME, offlineProfileName); 145 return this; 146 } 147 148 /** 149 * 设置 sdk 内部的消息队列最大长度<br> 150 * <p>默认 500, 0表示不限制长度, 建议大于100</p> 151 * <p>动态库方法运行在一个单独的线程里,通过消息队列依次调用。 152 * 在设备性能不好的设备上可以设置消息队列最大长度,防止算力不够导致内核无法及时处理完音频数据而导致内存过大的问题</p> 153 * 是否必需:否<br> 154 * 默认值:500 <br> 155 * 156 * @param messageQueueMaxSize 消息队列最大长度 157 * @return CommonBuilder 158 */ 159 public CommonBuilder setMessageQueueMaxSize(int messageQueueMaxSize) { 160 mDdsConfig.addConfig(DDSConfig.K_MESSAGE_QUEUE_MAX_SIZE, messageQueueMaxSize); 161 return this; 162 } 163 164 /** 165 * 试用授权是否连网更新成在线授权<br> 166 * 默认值:true 167 * 168 * @param enable 是否连网更新成在线授权 169 * @return CommonBuilder 170 */ 171 public CommonBuilder enableReplaceProfile(boolean enable) { 172 mDdsConfig.addConfig(DDSConfig.K_NEED_REPLACE_PROFILE, String.valueOf(enable)); 173 return this; 174 } 175 176 /** 177 * 是否使用内置的资源更新通知栏<br> 178 * 默认值:true 179 * 180 * @param enable 是否使用内置的资源更新通知栏 181 * @return CommonBuilder 182 */ 183 public CommonBuilder enableUpdateNotification(boolean enable) { 184 mDdsConfig.addConfig(DDSConfig.K_USE_UPDATE_NOTIFICATION, String.valueOf(enable)); 185 return this; 186 } 187 188 /** 189 * 产品licenseID<br> 190 * 预分配licence模式下的参数<br> 191 * 默认值:无 192 * 193 * @param productLicenseId 产品 licenseID 194 * @return CommonBuilder 195 */ 196 public CommonBuilder setProductLicenseId(String productLicenseId) { 197 mDdsConfig.addConfig(DDSConfig.K_PRODUCT_LICENSE_ID, productLicenseId); 198 return this; 199 } 200 201 /** 202 * 缓存文件保存目录<br> 203 * 默认值:/sdcard/Android/data/包名/cache<br> 204 * <b>还需设置 {@linkplain #setCacheSize}</b> 205 * 206 * @param cachePath 缓存文件保存目录 207 * @return CommonBuilder 208 * @see #setCacheSize 209 */ 210 public CommonBuilder setCachePath(String cachePath) { 211 mDdsConfig.addConfig(DDSConfig.K_CACHE_PATH, cachePath); 212 return this; 213 } 214 215 /** 216 * 缓存文件大小限制<br> 217 * 是否必需:自定义缓存目录时必需<br> 218 * 默认值:无 219 * 220 * @param cacheSize 缓存文件大小 221 * @return CommonBuilder 222 * @see #setCachePath 223 */ 224 public CommonBuilder setCacheSize(int cacheSize) { 225 mDdsConfig.addConfig(DDSConfig.K_CACHE_SIZE, String.valueOf(cacheSize)); 226 return this; 227 } 228 229 /** 230 * 使用内置产品资源包, 从官网下载的产品资源包一般叫 product.zip<br> 231 * 取值:assets目录下为压缩包名称,其他目录为绝对路径<br> 232 * 默认值:无 233 * 234 * @param customZip 产品资源包 235 * @return CommonBuilder 236 */ 237 public CommonBuilder setCustomZip(String customZip) { 238 mDdsConfig.addConfig(DDSConfig.K_CUSTOM_ZIP, customZip); 239 return this; 240 } 241 242 /** 243 * duicore 资源存放的目录<br> 244 * 取值:绝对路径<br> 245 * 默认值:/data/data/包名/files/dds/duicore/ 246 * 247 * @param duicoreHome duicore资源存放的目录 248 * @return CommonBuilder 249 */ 250 public CommonBuilder setDuicoreHome(String duicoreHome) { 251 mDdsConfig.addConfig(DDSConfig.K_DUICORE_HOME, duicoreHome); 252 return this; 253 } 254 255 /** 256 * 产品资源存放的目录<br> 257 * 取值:绝对路径<br> 258 * 默认值:/data/data/com.xxx/files/dds/custom/ 259 * 260 * @param customHome 产品资源存放的目录 261 * @return CommonBuilder 262 */ 263 public CommonBuilder setCustomHome(String customHome) { 264 mDdsConfig.addConfig(DDSConfig.K_CUSTOM_HOME, customHome); 265 return this; 266 } 267 268 /** 269 * 连接指定产品版本的对话服务<br> 270 * 取值:版本号<br> 271 * 默认值:本地最新版本 272 * 273 * @param productVersion 产品版本 274 * @return CommonBuilder 275 */ 276 public CommonBuilder setProductVersion(String productVersion) { 277 mDdsConfig.addConfig(DDSConfig.K_PRODUCT_VERSION, productVersion); 278 return this; 279 } 280 281 /** 282 * 是否使用 uiagent 动态端口号<br> 283 * 默认值:false<br> 284 * 285 * @param enable 是否使用 uiagent 动态端口号 286 * @return CommonBuilder 287 */ 288 public CommonBuilder enableDynamicUiAgentPort(boolean enable) { 289 mDdsConfig.addConfig(DDSConfig.K_ENABLE_DYNAMIC_UIAGENT_PORT, String.valueOf(enable)); 290 return this; 291 } 292 293 /** 294 * 保留字段,上传、升级时使用 295 * 296 * @param accessToken accessToken 297 * @return CommonBuilder 298 */ 299 public CommonBuilder setAccessToken(String accessToken) { 300 mDdsConfig.addConfig(DDSConfig.K_ACCESS_TOKEN, accessToken); 301 return this; 302 } 303 304 /** 305 * 使用 voip 功能时的类型,现在支持线性双麦(line_2)和线性4麦(line_4)<br> 306 * 取值:line_4, line_2<br> 307 * 默认值:无 308 * 309 * @param voipType voip 的类型 310 * @return CommonBuilder 311 */ 312 public CommonBuilder setVoipType(String voipType) { 313 mDdsConfig.addConfig(DDSConfig.K_VOIP_TYPE, voipType); 314 return this; 315 } 316 317 /** 318 * voip 的资源的路径。assets目录下为压缩包名称,其他目录为绝对路径<br> 319 * 默认值:内置资源 320 * 321 * @param voipResBin voip 的资源 322 * @return CommonBuilder 323 */ 324 public CommonBuilder setVoipResBin(String voipResBin) { 325 mDdsConfig.addConfig(DDSConfig.K_VOIP_AGC_BIN, voipResBin); 326 return this; 327 } 328 329 /** 330 * duicore 资源包保存路径<br> 331 * 取值:绝对路径<br> 332 * 默认值:无 333 * 334 * @param duicoreBackupZipUserDefined duicore 资源包保存路径 335 * @return CommonBuilder 336 */ 337 public CommonBuilder setDuicoreBackupZipUserDefined(String duicoreBackupZipUserDefined) { 338 mDdsConfig.addConfig(DDSConfig.K_DUICORE_BACKUP_ZIP_USER_DEFINED, duicoreBackupZipUserDefined); 339 return this; 340 } 341 342 /** 343 * 产品资源包保存路径<br> 344 * 取值:绝对路径<br> 345 * 默认值:无 346 * 347 * @param customBackupZipUserDefined 产品资源包保存路径 348 * @return CommonBuilder 349 */ 350 public CommonBuilder setCustomBackupZipUserDefined(String customBackupZipUserDefined) { 351 mDdsConfig.addConfig(DDSConfig.K_CUSTOM_BACKUP_ZIP_USER_DEFINED, customBackupZipUserDefined); 352 return this; 353 } 354 } 355 356 /** 357 * 录音配置 358 */ 359 public static class RecorderBuilder extends BaseBuilder { 360 361 public RecorderBuilder(DDSConfig ddsConfig) { 362 super(ddsConfig); 363 } 364 365 /** 366 * 录音模式 <br> 367 * 取值:internal or external<br> 368 * internal:SDK内部录音<br> 369 * external:由外部调用<code>DDS.getInstance().getAgent().feedPcm()</code>传入音频<br> 370 * 默认值:internal<br> 371 * 372 * @param recorderMode 录音模式 internal or external 373 * @return RecorderBuilder 374 */ 375 public RecorderBuilder setRecorderMode(String recorderMode) { 376 mDdsConfig.addConfig(DDSConfig.K_RECORDER_MODE, recorderMode); 377 return this; 378 } 379 380 /** 381 * 录音机参数: audioSource <br> 382 * 录音机数据源类型<br> 383 * 取值:AudioSource.*<br> 384 * 默认值:单麦 AudioSource.DEFAULT 多麦 AudioSource.VOICE_RECOGNITION 385 * 386 * @param audioSource 录音机参数: audioSource 387 * @return RecorderBuilder 388 */ 389 public RecorderBuilder setAudioSource(int audioSource) { 390 mDdsConfig.addConfig(DDSConfig.K_AUDIO_SOURCE, String.valueOf(audioSource)); 391 return this; 392 } 393 394 /** 395 * 录音机参数: sampleRateInHz <br> 396 * 录音时音频采样率 <br> 397 * 取值:16000/32000/48000 <br> 398 * 默认值:内部自适应 399 * 400 * @param audioSamplerate 音频采样率,录音机参数: sampleRateInHz 401 * @return RecorderBuilder 402 */ 403 public RecorderBuilder setAudioSamplerate(long audioSamplerate) { 404 mDdsConfig.addConfig(DDSConfig.K_AUDIO_SAMPLERATE, String.valueOf(audioSamplerate)); 405 return this; 406 } 407 408 /** 409 * 录音机参数:channelConfig <br> 410 * 录音机频道源类型 <br> 411 * 取值:AudioFormat.CHANNEL_IN_* <br> 412 * 默认值:单麦 AudioFormat.CHANNEL_IN_MONO 其它麦是 AudioFormat.CHANNEL_IN_STEREO 413 * 414 * @param audioChannelConf 录音机参数:channelConfig 415 * @return RecorderBuilder 416 */ 417 public RecorderBuilder setAudioChannelConf(int audioChannelConf) { 418 mDdsConfig.addConfig(DDSConfig.K_AUDIO_CHANNEL_CONF, audioChannelConf); 419 return this; 420 } 421 422 /** 423 * 录音机参数:audioFormat <br> 424 * 每个采样大小 <br> 425 * 默认值:AudioFormat.ENCODING_PCM_16BIT 426 * 427 * @param audioFormat 录音机参数:audioFormat 428 * @return RecorderBuilder 429 */ 430 public RecorderBuilder setAudioFormat(int audioFormat) { 431 mDdsConfig.addConfig(DDSConfig.K_AUDIO_FORMAT, audioFormat); 432 return this; 433 } 434 435 /** 436 * 录音机参数:bufferSizeInBytes <br> 437 * 录音机的缓存大小 <br> 438 * 可通过 <CODE> AudioRecord.getMinBufferSize(sampleRateInHz, channelConf, audioFormat) </CODE> 方法计算得到 <br> 439 * 默认值:192000 440 * 441 * @param audioBufferSizeInByte 录音机参数:bufferSizeInBytes 442 * @return RecorderBuilder 443 */ 444 public RecorderBuilder setAudioBufferSizeInByte(long audioBufferSizeInByte) { 445 mDdsConfig.addConfig(DDSConfig.K_AUDIO_BUFFER_SIZE_IN_BYTE, String.valueOf(audioBufferSizeInByte)); 446 return this; 447 } 448 449 /** 450 * 音频通道数 <br> 451 * sdk 内计算需要的缓存大小、音量等使用 <br> 452 * 默认值:根据配置的麦克风类型自动配置 453 * 454 * @param audioChannelCount 音频通道数 455 * @return RecorderBuilder 456 */ 457 public RecorderBuilder setAudioChannelCount(int audioChannelCount) { 458 mDdsConfig.addConfig(DDSConfig.K_AUDIO_CHANNEL_COUNT, audioChannelCount); 459 return this; 460 } 461 462 /** 463 * 是否翻转单麦 1mic+1ref 音频通道 <br> 464 * 单麦默认 1mic+1ref 音频,如果回路和原始音频通道正好相反,可使用该配置<br> 465 * 默认值:false 466 * 467 * @param reversAudioChannel 是否翻转音频通道 468 * @return RecorderBuilder 469 */ 470 public RecorderBuilder setReversAudioChannel(boolean reversAudioChannel) { 471 mDdsConfig.addConfig(DDSConfig.K_IS_REVERSE_AUDIO_CHANNEL, String.valueOf(reversAudioChannel)); 472 return this; 473 } 474 475 /** 476 * 录音机每次读取音频的 buffer 大小 <br> 477 * 默认值:通道数*16/8*16000*100/1000 B,例如每 100ms 读取一次音频,单通道就是 3200B<br> 478 * 479 * @param audioBufferSize buffer 大小 480 * @return RecorderBuilder 481 */ 482 public RecorderBuilder setAudioBufferSize(long audioBufferSize) { 483 mDdsConfig.addConfig(DDSConfig.K_AUDIO_BUFFER_SIZE, String.valueOf(audioBufferSize)); 484 return this; 485 } 486 487 /** 488 * 是否使用大音量检测 <br> 489 * 默认值: false 490 * 491 * @param enable 是否使用大音量检测 492 * @return RecorderBuilder 493 */ 494 public RecorderBuilder enableHighVolume(boolean enable) { 495 mDdsConfig.addConfig(DDSConfig.K_HIGH_VOLUME_CHECK, String.valueOf(enable)); 496 return this; 497 } 498 } 499 500 /** 501 * 麦克风类型、唤醒、声纹、asrpp、Oneshot 配置 502 */ 503 public static class WakeupBuilder extends BaseBuilder { 504 505 public WakeupBuilder(DDSConfig ddsConfig) { 506 super(ddsConfig); 507 } 508 509 /** 510 * 设置硬件麦克风采集模组的类型<br> 511 * 默认使用 DUI 控制台上产品的对应配置项。若客户端通过SDK配置此项后,则以客户端配置为准。 <br> 512 * 取值:<br> 513 * 0:默认单麦(1路音频)<br> 514 * 1:单麦回消(1路音频+1路参考音)<br> 515 * 2:线性四麦(4路音频)<br> 516 * 3:环形六麦(6路音频)<br> 517 * 4:车载双麦(废弃)<br> 518 * 5:家居双麦(2路音频)<br> 519 * 6:环麦4麦(4路音频)<br> 520 * 7:车载双麦(2路音频)<br> 521 * 8:线性六麦(6路音频)<br> 522 * 10:线性八麦(8路音频)<br> 523 * 默认值:0 524 * 525 * @param micType 麦克风类型 526 * @return WakeupBuilder 527 */ 528 public WakeupBuilder setMicType(int micType) { 529 mDdsConfig.addConfig(DDSConfig.K_MIC_TYPE, String.valueOf(micType)); 530 return this; 531 } 532 533 /** 534 * 设置远近场硬件采集模组的类型<br> 535 * <p> 536 * 是否必需:否<br> 537 * 默认值:无 538 * 示例:{"far":"mictype","near":"mictype"} <br> 539 * mictype 取值:<br> 540 * 0:默认单麦(1路音频)<br> 541 * 1:单麦回消(1路音频+1路参考音)<br> 542 * 2:线性四麦(4路音频)<br> 543 * 3:环形六麦(6路音频)<br> 544 * 4:车载双麦(废弃)<br> 545 * 5:家居双麦(2路音频)<br> 546 * 6:环麦4麦(4路音频)<br> 547 * 7:车载双麦(2路音频)<br> 548 * 8:线性六麦(6路音频)<br> 549 * 10:线性八麦(8路音频)<br> 550 * 是否必需:否<br> 551 * 552 * @param farPickupMicType 设置远场硬件采集模组的类型 553 * @param nearPickupMicType 设置近场硬件采集模组的类型 554 * @return WakeupBuilder 555 */ 556 public WakeupBuilder setFarNearPickupMicType(int farPickupMicType, int nearPickupMicType) { 557 JSONObject jsonObject = new JSONObject(); 558 try { 559 jsonObject.put("far", String.valueOf(farPickupMicType)); 560 jsonObject.put("near", String.valueOf(nearPickupMicType)); 561 } catch (JSONException e) { 562 e.printStackTrace(); 563 } 564 mDdsConfig.addConfig(DDSConfig.K_PICKUP_MIC_TYPE, jsonObject.toString()); 565 return this; 566 } 567 568 /** 569 * 音频的回路数量<br> 570 * 音频通道总数包含麦克风原始音频数+回路通道数。这里的配置只是回路通道数 571 * <p> 572 * 取值:大于等于0的数字<br> 573 * 是否必需:否<br> 574 * 默认值:0 575 * 576 * @param micEchoChannelNum 回路通道数 577 * @return WakeupBuilder 578 */ 579 public WakeupBuilder setMicEchoChannelNum(int micEchoChannelNum) { 580 if (micEchoChannelNum >= 0) 581 mDdsConfig.addConfig(DDSConfig.K_MIC_ECHO_CHANNEL_NUM, String.valueOf(micEchoChannelNum)); 582 return this; 583 } 584 585 /** 586 * 就近唤醒的 服务地址<br> 587 * 取值:局域网字段<br> 588 * 默认值:"" 589 * 590 * @param nearWakeupServerName 局域网服务字段 591 * @return WakeupBuilder 592 */ 593 public WakeupBuilder setNearWakeupServerName(String nearWakeupServerName) { 594 mDdsConfig.addConfig(DDSConfig.K_NEAR_WAKEUP_SERVER_NAME, nearWakeupServerName); 595 return this; 596 } 597 598 /** 599 * 设置参与组网的唤醒词,即配置组网的唤醒词会就近唤醒,非配置不会参与组网 600 * 601 * @param nearWakeupWord 参与组网的唤醒词 602 * @return WakeupBuilder 603 */ 604 public WakeupBuilder setNearWakeupWord(String nearWakeupWord) { 605 mDdsConfig.addConfig(DDSConfig.K_NEAR_WAKEUP_WORD, nearWakeupWord); 606 return this; 607 } 608 609 /** 610 * 就近唤醒网络修改之后延迟响应时间<br> 611 * 取值:1000<br> 612 * 默认值:0 613 * 单位: ms 614 * 615 * @param netChangeDelay 就近唤醒的 mds 资源 616 * @return WakeupBuilder 617 */ 618 public WakeupBuilder setNearWakeupNetChangeDelay(int netChangeDelay) { 619 mDdsConfig.addConfig(DDSConfig.K_NETWORKMANAGER_DELAY, netChangeDelay); 620 return this; 621 } 622 623 /** 624 * 就近唤醒送给 mds 的音频是否是 AEC 之后的音频 625 * <p> 626 * 取值:true(AEC 之后的音频) or false(送的是原始音频)<br> 627 * 是否必需:否<br> 628 * 默认值:false 629 * 630 * @param audioAdoptAEC 是否 AEC 之后的音频 631 * @return WakeupBuilder 632 */ 633 public WakeupBuilder setNearWakeupAudioAdoptAEC(boolean audioAdoptAEC) { 634 mDdsConfig.addConfig(DDSConfig.K_NEAR_WAKEUP_AUDIO_ADOPT_AEC, String.valueOf(audioAdoptAEC)); 635 return this; 636 } 637 638 /** 639 * 设置送到dmasp引擎中的音频通道数量,不设置默认dmasp送的是四通道音频 640 * @param channelType 641 * @return 642 */ 643 public WakeupBuilder setChannelType(int channelType) { 644 mDdsConfig.addConfig(DDSConfig.K_CHANNEL_TYPE, String.valueOf(channelType)); 645 return this; 646 } 647 /** 648 * AEC(回声消除)模式<br> 649 * 取值:internal or external<br> 650 * internal:由SDK内部根据采集模组做对应AEC处理<br> 651 * external:外部已经处理过AEC,SDK不再处理,并认为设备支持AEC。设置 external 后,单麦播放 tts 时唤醒节点不会停止,打断唤醒词仍可使用<br> 652 * 默认值:internal 653 * 654 * @param aecMode AEC(回声消除)模式 655 * @return WakeupBuilder 656 */ 657 public WakeupBuilder setAecMode(String aecMode) { 658 mDdsConfig.addConfig(DDSConfig.K_AEC_MODE, aecMode); 659 return this; 660 } 661 662 /** 663 * 设置唤醒资源<br> 664 * 取值:资源的绝对路径<br> 665 * 默认值:内置资源 666 * 667 * @param wakeupBin 唤醒资源 668 * @return WakeupBuilder 669 */ 670 public WakeupBuilder setWakeupBin(String wakeupBin) { 671 mDdsConfig.addConfig(DDSConfig.K_WAKEUP_BIN, wakeupBin); 672 return this; 673 } 674 675 /** 676 * 声纹资源 <br> 677 * 取值:绝对路径<br> 678 * 默认值:内置资源 679 * 680 * @param vprintBin 声纹资源 681 * @return WakeupBuilder 682 */ 683 public WakeupBuilder setVprintBin(String vprintBin) { 684 mDdsConfig.addConfig(DDSConfig.K_VPRINT_BIN, vprintBin); 685 return this; 686 } 687 688 /** 689 * 是否在唤醒中使用声纹判断 <br> 690 * 诺设置为 true,需开启声纹功能 <br> 691 * 默认值:false 692 * 693 * @param enable 声纹资源 694 * @return WakeupBuilder 695 */ 696 public WakeupBuilder enableVprintInWakeup(boolean enable) { 697 mDdsConfig.addConfig(DDSConfig.K_USE_VPRINT_IN_WAKEUP, String.valueOf(enable)); 698 return this; 699 } 700 701 /** 702 * 麦克风阵列AEC资源<br> 703 * 取值:绝对路径<br> 704 * 默认值:内置资源 705 * 706 * @param aecBin AEC资源 707 * @return WakeupBuilder 708 */ 709 public WakeupBuilder setAecBin(String aecBin) { 710 mDdsConfig.addConfig(DDSConfig.K_MIC_ARRAY_AEC_CFG, aecBin); 711 return this; 712 } 713 714 /** 715 * 麦克风阵列 beamforming 资源<br> 716 * 取值:绝对路径<br> 717 * 默认值:内置资源 718 * 719 * @param beamformingBin beamforming 资源 720 * @return WakeupBuilder 721 */ 722 public WakeupBuilder setBeamformingBin(String beamformingBin) { 723 mDdsConfig.addConfig(DDSConfig.K_MIC_ARRAY_BEAMFORMING_CFG, beamformingBin); 724 return this; 725 } 726 727 /** 728 * 就近唤醒的 mds 资源<br> 729 * 取值:绝对路径<br> 730 * 默认值:内置资源 731 * 732 * @param nearWakeupMdsBin 就近唤醒的 mds 资源 733 * @return WakeupBuilder 734 */ 735 public WakeupBuilder setNearWakeupMdsBin(String nearWakeupMdsBin) { 736 mDdsConfig.addConfig(DDSConfig.K_NEAR_WAKEUP_MDS_BIN, nearWakeupMdsBin); 737 return this; 738 } 739 740 /** 741 * 增强唤醒的 asr 资源,增强唤醒是使用本地 asr 实现的<br> 742 * 取值:绝对路径<br> 743 * 默认值:内置资源 744 * 745 * @param incrementWakeupBin 增强唤醒的 asr 资源 746 * @return WakeupBuilder 747 */ 748 public WakeupBuilder setIncrementWakeupBin(String incrementWakeupBin) { 749 mDdsConfig.addConfig(DDSConfig.K_INCREMENT_WAKEUP_BIN, incrementWakeupBin); 750 return this; 751 } 752 753 /** 754 * 唤醒后的路由,唤醒后是否进入对话<br> 755 * 取值:dialog or partner<br> 756 * dialog:唤醒默认进入识别及对话<br> 757 * partner:唤醒后不会主动进入识别及对话,同时唤醒后会收到sys.wakeup.result的message消息<br> 758 * 默认值:dialog 759 * 760 * @param wakeupRouter 唤醒后的路由: dialog 或者 partner 761 * @return WakeupBuilder 762 */ 763 public WakeupBuilder setWakeupRouter(String wakeupRouter) { 764 mDdsConfig.addConfig(DDSConfig.K_WAKEUP_ROUTER, wakeupRouter); 765 return this; 766 } 767 768 /** 769 * 是否使用自定义欢迎语功能, 优化使用<br> 770 * 默认值:true 771 * 772 * @param enable 是否使用自定义欢迎语功能 773 * @return WakeupBuilder 774 */ 775 public WakeupBuilder enableCustomGreeting(boolean enable) { 776 mDdsConfig.addConfig(DDSConfig.K_WAKEUP_DISABLE_CUSTOM_GREETING, String.valueOf(!enable)); 777 return this; 778 } 779 780 /** 781 * 就近唤醒决策窗口期 <br> 782 * 修改之后会影响决策速度,取值越小,唤醒结果抛出越早,但是误唤醒概率越大 <br> 783 * 默认是350 <br> 784 * 单位:ms <br> 785 * 786 * @param nearWakeupWkpWnd 唤醒决策窗口期 787 * @return WakeupBuilder 788 */ 789 public WakeupBuilder setNearWakeupWkpWnd(int nearWakeupWkpWnd) { 790 mDdsConfig.addConfig(DDSConfig.K_NEAR_WAKEUP_WKP_WND, String.valueOf(nearWakeupWkpWnd)); 791 return this; 792 } 793 794 /** 795 * 就近唤醒防抖窗口期 <br> 796 * 用来解决在K_NEAR_WAKEUP_WKP_WND窗口期之外误唤醒,取值越大,误唤醒概率越小,但是会导致唤醒延迟越大 <br> 797 * 默认是450 <br> 798 * 单位:ms <br> 799 * 800 * @param nearWakeupDebounceWnd 唤醒防抖窗口期 801 * @return WakeupBuilder 802 */ 803 public WakeupBuilder setNearWakeupDebounceWnd(int nearWakeupDebounceWnd) { 804 mDdsConfig.addConfig(DDSConfig.K_NEAR_WAKEUP_DEBOUNCE_WND, String.valueOf(nearWakeupDebounceWnd)); 805 return this; 806 } 807 808 /** 809 * 识别过程中是否响应唤醒<br> 810 * 默认值:true(识别过程中会响应唤醒) 811 * 812 * @param enable 识别过程中是否响应唤醒 813 * @return WakeupBuilder 814 */ 815 public WakeupBuilder enableWakeupInAsr(boolean enable) { 816 mDdsConfig.addConfig(DDSConfig.K_NOWAKEUP_WHEN_ASR, String.valueOf(!enable)); 817 return this; 818 } 819 820 /** 821 * OneShot配置<br> 822 * 取值:毫秒<br> 823 * 若MIDTIME为0 & ENDTIME为0,唤醒后进入识别;若VAD检测超时,则直接退出对话<br> 824 * 若MIDTIME为0 & ENDTIME不为0,唤醒后进入识别;若ENDTIME超时,则直接退出对话<br> 825 * 若MIDTIME不为0 & ENDTIME为0,唤醒后进入识别;若MIDTIME超时,则播放欢迎语,继续识别(默认)<br> 826 * 若MIDTIME不为0 & ENDTIME不为0,唤醒后进入识别;若MIDTIME超时,则播放欢迎语,继续识别,若ENDTIME超时,则直接退出对话<br> 827 * 默认值:MIDTIME=500ms,ENDTIME=0ms 828 * 829 * @param oneshotMidTime OneShot配置 830 * @return WakeupBuilder 831 * @see #setOneshotEndTime(int oneshotEndTime) 832 */ 833 public WakeupBuilder setOneshotMidTime(int oneshotMidTime) { 834 mDdsConfig.addConfig(DDSConfig.K_ONESHOT_MIDTIME, String.valueOf(oneshotMidTime)); 835 return this; 836 } 837 838 /** 839 * OneShot配置<br> 840 * 取值:毫秒<br> 841 * 若MIDTIME为0 & ENDTIME为0,唤醒后进入识别;若VAD检测超时,则直接退出对话<br> 842 * 若MIDTIME为0 & ENDTIME不为0,唤醒后进入识别;若ENDTIME超时,则直接退出对话<br> 843 * 若MIDTIME不为0 & ENDTIME为0,唤醒后进入识别;若MIDTIME超时,则播放欢迎语,继续识别(默认<br> 844 * 若MIDTIME不为0 & ENDTIME不为0,唤醒后进入识别;若MIDTIME超时,则播放欢迎语,继续识别,若ENDTIME超时,则直接退出对话<br> 845 * 默认值:MIDTIME=500ms,ENDTIME=0ms 846 * 847 * @param oneshotEndTime OneShot配置 848 * @return WakeupBuilder 849 * @see #setOneshotMidTime(int oneshotMidTime) 850 */ 851 public WakeupBuilder setOneshotEndTime(int oneshotEndTime) { 852 mDdsConfig.addConfig(DDSConfig.K_ONESHOT_ENDTIME, String.valueOf(oneshotEndTime)); 853 return this; 854 } 855 856 /** 857 * 多麦是否使用 sspe <br> 858 * 默认值:false 859 * 860 * @param enable 是否使用 sspe 861 * @return WakeupBuilder 862 */ 863 @Deprecated 864 public WakeupBuilder enableSspe(boolean enable) { 865 return this; 866 } 867 868 /** 869 * 麦克风阵列 sspe 资源<br> 870 * 默认值:内置资源 871 * 872 * @param sspeBin sspe 资源 873 * @return WakeupBuilder 874 */ 875 public WakeupBuilder setSspeBin(String sspeBin) { 876 mDdsConfig.addConfig(DDSConfig.K_MIC_ARRAY_SSPE_BIN, sspeBin); 877 return this; 878 } 879 880 /** 881 * 年龄识别资源<br> 882 * 默认值:内置资源 883 * 884 * @param ageBin 年龄识别资源 885 * @return WakeupBuilder 886 */ 887 public WakeupBuilder setAgeBin(String ageBin) { 888 mDdsConfig.addConfig(DDSConfig.K_ASRPP_AGE_BIN, ageBin); 889 return this; 890 } 891 892 /** 893 * 性别识别资源<br> 894 * 默认值:内置资源 895 * 896 * @param genderBin 性别识别资源 897 * @return WakeupBuilder 898 */ 899 public WakeupBuilder setGenderBin(String genderBin) { 900 mDdsConfig.addConfig(DDSConfig.K_ASRPP_GENDER_BIN, genderBin); 901 return this; 902 } 903 904 /** 905 * 是否使用性别识别<br> 906 * 默认值:false 907 * 908 * @param enable 是否使用性别识别 909 * @return WakeupBuilder 910 */ 911 public WakeupBuilder enableGender(boolean enable) { 912 mDdsConfig.addConfig(DDSConfig.K_USE_GENDER, String.valueOf(enable)); 913 return this; 914 } 915 916 /** 917 * 是否使用年龄识别<br> 918 * 默认值:false 919 * 920 * @param enable 是否使用年龄识别 921 * @return WakeupBuilder 922 */ 923 public WakeupBuilder enableAge(boolean enable) { 924 mDdsConfig.addConfig(DDSConfig.K_USE_AGE, String.valueOf(enable)); 925 return this; 926 } 927 928 /** 929 * 是否使用就近唤醒<br> 930 * 默认值:false 931 * 932 * @param enable 是否使用就近唤醒 933 * @return WakeupBuilder 934 */ 935 public WakeupBuilder enableNearWakeup(boolean enable) { 936 mDdsConfig.addConfig(DDSConfig.K_USE_NEAR_WAKEUP, String.valueOf(enable)); 937 return this; 938 } 939 } 940 941 /** 942 * 对话配置 943 */ 944 public static class DmBuilder extends BaseBuilder { 945 946 public DmBuilder(DDSConfig ddsConfig) { 947 super(ddsConfig); 948 } 949 950 /** 951 * 对话响应超时时间。单位 毫秒<br> 952 * 默认值:10000ms<br> 953 * 954 * @param timeout 对话响应超时时间 955 * @return DmBuilder 956 */ 957 public DmBuilder setDmTimeout(int timeout) { 958 mDdsConfig.addConfig(DDSConfig.K_DM_TIMEOUT, String.valueOf(timeout)); 959 return this; 960 } 961 962 /** 963 * nativeApi 超时时间。单位 毫秒<br> 964 * 默认值:10000 ms 965 * 966 * @param timeout 对话响应超时时间 967 * @return DmBuilder 968 */ 969 public DmBuilder setNativeApiTimeout(int timeout) { 970 mDdsConfig.addConfig(DDSConfig.K_NATIVEAPI_TIMEOUT, String.valueOf(timeout)); 971 return this; 972 } 973 974 /** 975 * 全双工中是否使用消息的提示音<br> 976 * 默认值:true 977 * 978 * @param enable true 使用消息的提示音, false 不使用 979 * @return DmBuilder 980 */ 981 public DmBuilder enableTipsInFullduplex(boolean enable) { 982 mDdsConfig.addConfig(DDSConfig.K_FULLDUPLEX_CLOSE_DISCARD_TIPS, String.valueOf(!enable)); 983 return this; 984 } 985 986 /** 987 * 是否使用本地对话 <br> 988 * 默认值:false 989 * 990 * @param enable 是否使用本地对话 991 * @return DmBuilder 992 */ 993 public DmBuilder enableLocalDDS(boolean enable) { 994 mDdsConfig.addConfig(DDSConfig.K_ENABLE_LOCAL_DDS, String.valueOf(enable)); 995 return this; 996 } 997 998 /** 999 * 全双工模式下是否使用 vad <br> 1000 * 默认值:true 1001 * 1002 * @param enable 是否使用 vad 1003 * @return DmBuilder 1004 */ 1005 public DmBuilder enableVadInFullduplex(boolean enable) { 1006 mDdsConfig.addConfig(DDSConfig.K_USE_VAD_IN_FULLDUPLEX, String.valueOf(enable)); 1007 return this; 1008 } 1009 1010 /** 1011 * 点击模式。 <br> 1012 * 调用 {@linkplain Agent#avatarClick } 后sdk的响应模式 <br> 1013 * 取值: <br> 1014 * 0: 在tts播放状态下click的时候,直接关闭对话 <br> 1015 * 1: 在tts播放状态下click的时候,打断播报并进入下一轮对话,如果没有下一轮对话则关闭对话 <br> 1016 * 默认值:0 <br> 1017 * 1018 * @param clickMode 点击模式: 0 或 1 1019 * @return DmBuilder 1020 * @see Agent#avatarClick() 1021 * @see Agent#avatarClick(String) 1022 */ 1023 public DmBuilder setClickMode(int clickMode) { 1024 mDdsConfig.addConfig(DDSConfig.K_CLICK_MODE, String.valueOf(clickMode)); 1025 return this; 1026 } 1027 1028 /** 1029 * 指定对话错误码的 TTS 播报内容 <br> 1030 * 当出现相应的错误时,使用用户设置的播报内容 <br> 1031 * 取值:JSON字符串,格式如下:<br> 1032 * <pre> 1033 * { 1034 * "71304":"这是识别结果为空的自定义播报", 1035 * "71305":"这是语义结果为空的自定义播报", 1036 * "71308":"这是进入闲聊技能的自定义播报", 1037 * "713**":"*****" 1038 * } 1039 * </pre> 1040 * 默认值:产品配置 1041 * 1042 * @param customTips 指定对话错误码的 TTS 播报内容 1043 * @return DmBuilder 1044 */ 1045 public DmBuilder setCustomTips(String customTips) { 1046 mDdsConfig.addConfig(DDSConfig.K_CUSTOM_TIPS, customTips); 1047 return this; 1048 } 1049 1050 /** 1051 * 云端对话送识别的音频类型 1052 * @param audioType :取值类型 wav, ogg 1053 * 是否必须:否 1054 * 默认值: ogg 1055 */ 1056 public DmBuilder setDmAsrAudioType(String audioType) { 1057 mDdsConfig.addConfig(DDSConfig.K_DM_ASR_AUDIO_TYPE, audioType); 1058 return this; 1059 } 1060 } 1061 1062 /** 1063 * TTS、播放 配置 1064 */ 1065 public static class TtsBuilder extends BaseBuilder { 1066 1067 public TtsBuilder(DDSConfig ddsConfig) { 1068 super(ddsConfig); 1069 } 1070 1071 /** 1072 * TTS播报模式<br> 1073 * 取值:internal or external<br> 1074 * internal:为sdk内部合成播报<br> 1075 * external:用户负责合成播报,需调用 <code>DDS.getInstance().getAgent().setTTSRequestListener()</code> 通过回调获取播报时机, 1076 * 播报完成后调用 <code>DDS.getInstance().getAgent().notifyTTSEnd()</code> 标记结束<br> 1077 * 默认值:internal 1078 * 1079 * @param ttsMode TTS播报模式 1080 * @return TtsBuilder 1081 * @see Agent#setTTSRequestListener 1082 * @see Agent#notifyTTSEnd 1083 */ 1084 public TtsBuilder setTtsMode(String ttsMode) { 1085 mDdsConfig.addConfig(DDSConfig.K_TTS_MODE, ttsMode); 1086 return this; 1087 } 1088 1089 /** 1090 * 是否使用 exoPlayer 播报 tts 的 url <br> 1091 * 默认值:false 1092 * 1093 * @param enable 是否使用 exoPlayer 播报 tts 的 url 1094 * @return TtsBuilder 1095 */ 1096 public TtsBuilder enableExoPlaySpeakUrl(boolean enable) { 1097 mDdsConfig.addConfig(DDSConfig.K_USE_EXO_PLAY_SPEAKURL, String.valueOf(enable)); 1098 return this; 1099 } 1100 1101 /** 1102 * 控制 AudioTrack 每次写音频数据的大小,默认有多少数据都会一次写入。<br> 1103 * 可以设置 800,这样 AudioTrack 每次只写 800 字节音频数据<br> 1104 * 该配置只用于极少数设备<br> 1105 * 是否必需:否<br> 1106 * 1107 * @param size 控制 AudioTrack 每次写音频数据的大小 1108 * @return TtsBuilder 1109 */ 1110 public TtsBuilder setAudioTrackWriteOnceSize(int size) { 1111 mDdsConfig.addConfig(DDSConfig.K_PLAYER_AUDIO_TRACK_WRITE_ONCE_SIZE, size); 1112 return this; 1113 } 1114 1115 /** 1116 * TTS 是否使用缓存 <br> 1117 * 默认值:true 1118 * 1119 * @param enable 是否使用缓存 1120 * @return TtsBuilder 1121 */ 1122 public TtsBuilder useCache(boolean enable) { 1123 mDdsConfig.addConfig(DDSConfig.K_TTS_CACHE, String.valueOf(enable)); 1124 return this; 1125 } 1126 1127 /** 1128 * 本地 TTS 是否开启内存优化 <br> 1129 * 默认值:false 1130 * 1131 * @param enable 本地 TTS 是否开启内存优化 1132 * @return TtsBuilder 1133 */ 1134 public TtsBuilder enableOptmization(boolean enable) { 1135 mDdsConfig.addConfig(DDSConfig.K_TTS_OPTIMIZATION, String.valueOf(enable)); 1136 return this; 1137 } 1138 1139 /** 1140 * 内置播放器的 STREAM 类型<br> 1141 * 取值:AudioManager.STREAM_*<br> 1142 * 默认值:AudioManager.STREAM_ALARM 1143 * 1144 * @param streamType 内置播放器的 STREAM 类型 1145 * @return TtsBuilder 1146 */ 1147 public TtsBuilder setStreamType(int streamType) { 1148 mDdsConfig.addConfig(DDSConfig.K_STREAM_TYPE, String.valueOf(streamType)); 1149 return this; 1150 } 1151 1152 /** 1153 * 内置播放器的 USAGE 类型<br> 1154 * 取值:AudioAttributes.USAGE_*<br> 1155 * 默认值:AudioAttributes.USAGE_ALARM 1156 * 1157 * @param audioUsage 内置播放器的 USAGE 类型 1158 * @return TtsBuilder 1159 * @see #setContentType 1160 */ 1161 public TtsBuilder setAudioUsage(int audioUsage) { 1162 mDdsConfig.addConfig(DDSConfig.K_AUDIO_USAGE, String.valueOf(audioUsage)); 1163 return this; 1164 } 1165 1166 /** 1167 * 内置播放器的 contentType 类型<br> 1168 * 取值:AudioAttributes.CONTENT_TYPE_*<br> 1169 * 默认值:AudioAttributes.CONTENT_TYPE_SONIFICATION 1170 * 1171 * @param contentType 内置播放器的 contentType 类型 1172 * @return TtsBuilder 1173 * @see #setAudioUsage 1174 */ 1175 public TtsBuilder setContentType(int contentType) { 1176 mDdsConfig.addConfig(DDSConfig.K_CONTENT_TYPE, String.valueOf(contentType)); 1177 return this; 1178 } 1179 1180 /** 1181 * 音频焦点处理模式<br> 1182 * 取值:internal or external<br> 1183 * internal:由SDK内部处理音频焦点的获取与释放<br> 1184 * external:由外部根据对话状态及TTS播报状态处理对话及TTS等的焦点问题,SDK不再获取或者释放焦点。 1185 * 用户可以使用 <CODE>DDS.getInstance().getAgent().setAudioFocusCallback(audioFocusCallback)</CODE> 在回调里处理音频焦点<br> 1186 * 默认值:internal 1187 * 1188 * @param audioFocusMode 音频焦点处理模式 1189 * @return TtsBuilder 1190 */ 1191 public TtsBuilder setAudioFocusMode(String audioFocusMode) { 1192 mDdsConfig.addConfig(DDSConfig.K_AUDIO_FOCUS_MODE, audioFocusMode); 1193 return this; 1194 } 1195 } 1196 1197 /** 1198 * 识别配置 1199 */ 1200 public static class AsrBuilder extends BaseBuilder { 1201 1202 public AsrBuilder(DDSConfig ddsConfig) { 1203 super(ddsConfig); 1204 } 1205 1206 /** 1207 * 对话接口里是否返回 tts 的 speakUrl <br> 1208 * 默认 true 1209 * <ul> 1210 * <li>true 对话接口返回 speakUrl</li> 1211 * <li>false 对话接口不返回 speakUrl,由sdk主动使用云端tts合成</li> 1212 * </ul> 1213 * 1214 * @param enable 对话接口里是否返回 tts 的 speakUrl 1215 * @return AsrBuilder 1216 */ 1217 public AsrBuilder enableStreamUrl(boolean enable) { 1218 mDdsConfig.addConfig(DDSConfig.K_ENABLE_STREAM_URL, String.valueOf(enable)); 1219 return this; 1220 } 1221 1222 /** 1223 * 噪声检测配置,开启后可过滤噪声识别结果<br> 1224 * 是否开启云端音频检测,如果未检测到有效音频,则会终止后续对话流程 <br> 1225 * 默认值:false 1226 * 1227 * @param enable 是否过滤噪声识别结果 1228 * @return AsrBuilder 1229 */ 1230 public AsrBuilder enableAudioDetection(boolean enable) { 1231 mDdsConfig.addConfig(DDSConfig.K_ENABLE_AUDIO_DETECTION, String.valueOf(enable)); 1232 return this; 1233 } 1234 1235 /** 1236 * 云端asrpp参数,设置为true后云端识别返回性别/年龄/情绪等字段 <br> 1237 * 默认值:false 1238 * 1239 * @param enable 云端识别是否返回 asrpp 信息 1240 * @return AsrBuilder 1241 */ 1242 public AsrBuilder enableCloudAsrpp(boolean enable) { 1243 mDdsConfig.addConfig(DDSConfig.K_ENABLE_CLOUD_ASRPP, String.valueOf(enable)); 1244 return this; 1245 } 1246 1247 /** 1248 * 弱网环境配置,如使用的是弱网环境,则配置为true <br> 1249 * 弱网环境下会把发送给服务器的音频数据切成400字节后再发送给服务器 <br> 1250 * 默认值:false 1251 * 1252 * @param enable 是否在弱网环境下使用 1253 * @return AsrBuilder 1254 */ 1255 public AsrBuilder enableWakeNetwork(boolean enable) { 1256 mDdsConfig.addConfig(DDSConfig.K_USE_WEAK_NETWORK, String.valueOf(enable)); 1257 return this; 1258 } 1259 1260 /** 1261 * 预置本地识别 net.bin 资源 <br> 1262 * 资源全路径 <br> 1263 * 1264 * @param customAsrBin 本地识别 net.bin 资源 1265 * @return AsrBuilder 1266 */ 1267 public AsrBuilder setCustomAsrBin(String customAsrBin) { 1268 mDdsConfig.addConfig(DDSConfig.K_CUSTOM_ASR_NETBIN, customAsrBin); 1269 return this; 1270 } 1271 1272 /** 1273 * 识别时不要过滤唤醒词 <br> 1274 * 默认值:false 1275 * 1276 * @param notDropWakeupInAsr true 不要过滤唤醒词 false 过滤唤醒词 1277 * @return AsrBuilder 1278 */ 1279 public AsrBuilder setNotDropWakeupInAsr(boolean notDropWakeupInAsr) { 1280 mDdsConfig.addConfig(DDSConfig.K_ASR_NOT_DROP_WAKEUP, String.valueOf(notDropWakeupInAsr)); 1281 return this; 1282 } 1283 1284 /** 1285 * 需要过滤的唤醒词 1286 * <p> 1287 * 唤醒词字符串,以’,‘分割唤醒词。例如 "你好小乐,你好小朋" 1288 * </p> 1289 * 需要过滤的唤醒词会在请求服务器时以参数带上 1290 * <ul> 1291 * <li>使用 oneshot 时,唤醒词 + ',' + ASR_DROP_WORDS</li> 1292 * <li>不使用 oneshot 时,ASR_DROP_WORDS</li> 1293 * </ul> 1294 * 1295 * @param dropWords 过滤的唤醒词 1296 * @return AsrBuilder 1297 */ 1298 public AsrBuilder setAsrDropWords(String[] dropWords) { 1299 if (dropWords == null || dropWords.length == 0) 1300 return this; 1301 StringBuffer sb = new StringBuffer(); 1302 for (int i = 0; i < dropWords.length; i++) { 1303 sb.append(dropWords[i]); 1304 if (i < dropWords.length - 1) 1305 sb.append(","); 1306 } 1307 mDdsConfig.addConfig(DDSConfig.K_ASR_DROP_WORDS, sb.toString()); 1308 return this; 1309 } 1310 1311 /** 1312 * 是否使用过滤识别为空功能 默认为 false 1313 * <p> 1314 * 识别服务识别到的结果为空时,直接舍弃对话结果,进入下一轮识别 1315 * <p> 1316 * 只在半双工下有效 1317 * 1318 * @param enable 是否使用过滤识别为空的功能 1319 * @return AsrBuilder 1320 */ 1321 public AsrBuilder enableIgnoreEmptyResult(boolean enable) { 1322 mDdsConfig.addConfig(DDSConfig.K_ASR_IGNORE_EMPTY_RESULT, String.valueOf(enable)); 1323 return this; 1324 } 1325 1326 /** 1327 * 是否禁用VAD单字打断功能 <br> 1328 * 默认值:false 1329 * 1330 * @param enable 是否禁用VAD单字打断功能 1331 * @return AsrBuilder 1332 */ 1333 public AsrBuilder enableSignalVad(boolean enable) { 1334 mDdsConfig.addConfig(DDSConfig.K_VAD_DISABLE_SIGNAL, String.valueOf(!enable)); 1335 return this; 1336 } 1337 1338 /** 1339 * 中文数字转阿拉伯数字 <br> 1340 * 默认值:false 1341 * 1342 * @param enable 是否使用中文数字转阿拉伯数字功能 1343 * @return AsrBuilder 1344 */ 1345 public AsrBuilder enableNumberConvert(boolean enable) { 1346 mDdsConfig.addConfig(DDSConfig.K_ASR_ENABLE_NUMBER_CONVERT, String.valueOf(enable)); 1347 return this; 1348 } 1349 1350 /** 1351 * 识别结果的拼音是否带音调 <br> 1352 * 默认值:false 1353 * 1354 * @param enable 识别结果的拼音是否带音调 1355 * @return AsrBuilder 1356 */ 1357 public AsrBuilder enableTone(boolean enable) { 1358 mDdsConfig.addConfig(DDSConfig.K_ASR_ENABLE_TONE, String.valueOf(enable)); 1359 return this; 1360 } 1361 1362 /** 1363 * 识别结果是否带标点符号 <br> 1364 * 开关同时控制识别和语义,开启后,语义解析结果也会带标点符号,且不建议在oneshot、中英文连用、轻音的情况下使用 <br> 1365 * 默认值:false<br> 1366 * 1367 * @param enable 识别结果是否带标点符号 1368 * @return AsrBuilder 1369 */ 1370 public AsrBuilder enablePunctuation(boolean enable) { 1371 mDdsConfig.addConfig(DDSConfig.K_ASR_ENABLE_PUNCTUATION, String.valueOf(enable)); 1372 return this; 1373 } 1374 1375 /** 1376 * 云端VAD在结束语音时静音时长,取值范围是200~2000。单位:毫秒<br> 1377 * 默认值:500ms<br> 1378 * 1379 * @param pauseTime 云端VAD静音判断时间 1380 * @return AsrBuilder 1381 */ 1382 public AsrBuilder setCloudVadPauseTime(int pauseTime) { 1383 mDdsConfig.addConfig(DDSConfig.K_CLOUD_VAD_PAUSE_TIME, String.valueOf(pauseTime)); 1384 return this; 1385 } 1386 1387 /** 1388 * 自定义唤醒词阈值,该分数一般是通过测试集调整<br> 1389 * 默认值:无 1390 * 1391 * @param customWakeupScore 自定义唤醒词阈值 1392 * @return AsrBuilder 1393 */ 1394 public AsrBuilder setCustomWakeupScore(String customWakeupScore) { 1395 mDdsConfig.addConfig(DDSConfig.K_ASR_CUSTOM_WAKEUP_SCORE, customWakeupScore); 1396 return this; 1397 } 1398 1399 /** 1400 * 设置指定语料的识别置信度,防止某些语料识别置信度过低被抛弃。 1401 * <pre> 1402 * [ 1403 * { 1404 * "name": "打开宝宝睡觉模式", 1405 * "confidence": "0.61" 1406 * }, 1407 * { 1408 * "name": "打开音乐", 1409 * "confidence": "0.62" 1410 * } 1411 * ] 1412 * </pre> 1413 * 1414 * @param customAsrConf 指定语料的识别置信度的 json 字符串 1415 * @return AsrBuilder 1416 */ 1417 public AsrBuilder setCustomAsrConf(String customAsrConf) { 1418 mDdsConfig.addConfig(DDSConfig.K_ASR_CUSTOM_CONF, String.valueOf(customAsrConf)); 1419 return this; 1420 } 1421 1422 /** 1423 * asr路由,区分识别后是否进入对话<br> 1424 * 取值:dialog or partner<br> 1425 * dialog:识别之后默认进入对话<br> 1426 * partner:识别之后不会进入对话,可通过ASREngine相关方法获取识别结果<br> 1427 * 默认值:dialog 1428 * 1429 * @param asrRouter asr路由,区分识别后是否进入对话 1430 * @return AsrBuilder 1431 */ 1432 public AsrBuilder setAsrRouter(String asrRouter) { 1433 mDdsConfig.addConfig(DDSConfig.K_ASR_ROUTER, asrRouter); 1434 return this; 1435 } 1436 1437 /** 1438 * 技能锁定接口,让用户说的话只落在锁定的技能里<br> 1439 * 取值: 1440 * <pre> 1441 * [ 1442 * {"skillId": "123123"}, 1443 * {"skillId": "123123"}, 1444 * {"skillId": "123123"}, 1445 * ] 1446 * </pre> 1447 * 1448 * @param asrPermanentSkill 技能锁定接口,让用户说的话只落在锁定的技能里 1449 * @return AsrBuilder 1450 */ 1451 public AsrBuilder setAsrPermanentSkill(String asrPermanentSkill) { 1452 mDdsConfig.addConfig(DDSConfig.K_PERMANENT_SKILL, asrPermanentSkill); 1453 return this; 1454 } 1455 1456 /** 1457 * 开启后识别前都会有叮咚声<br> 1458 * 默认值:false 1459 * 1460 * @param enable 开启后识别前都会有叮咚声 1461 * @return AsrBuilder 1462 * @see #enableAsrTips 1463 */ 1464 public AsrBuilder enableTipsBeforeAsr(boolean enable) { 1465 mDdsConfig.addConfig(DDSConfig.K_ASR_BEFORE_TIPS, String.valueOf(enable)); 1466 return this; 1467 } 1468 1469 /** 1470 * 是否开启识别完成音效 <br> 1471 * 默认值:false 1472 * 1473 * @param enable 是否开启识别完成音效 1474 * @return AsrBuilder 1475 * @see #enableTipsBeforeAsr 1476 */ 1477 public AsrBuilder enableAsrTips(boolean enable) { 1478 mDdsConfig.addConfig(DDSConfig.K_ASR_TIPS, String.valueOf(enable)); 1479 return this; 1480 } 1481 1482 /** 1483 * 优化离线gram编译逻辑,打开后,gram只在需要更新的场景下才会重新编译,否则即便重新初始化也不会编译 <br> 1484 * 默认值:false 1485 * 1486 * @param enable 优化离线gram编译逻辑 1487 * @return AsrBuilder 1488 */ 1489 public AsrBuilder enableOptGramBuild(boolean enable) { 1490 mDdsConfig.addConfig(DDSConfig.K_OPT_GRAM_BUILD, String.valueOf(enable)); 1491 return this; 1492 } 1493 1494 /** 1495 * VAD资源,例如 /sdcard/vad.bin <br> 1496 * 商务定制版VAD资源的路径。如果开发者对VAD有更高的要求,请联系商务申请定制VAD资源 <br> 1497 * 默认值:内置通用VAD资源 1498 * 1499 * @param vadBin VAD资源 1500 * @return AsrBuilder 1501 */ 1502 public AsrBuilder setVadBin(String vadBin) { 1503 mDdsConfig.addConfig(DDSConfig.K_VAD_BIN, vadBin); 1504 return this; 1505 } 1506 1507 /** 1508 * ngram 和 gram 融合时使用置信度跟大的结果,Gram更新热词词库,热词的置信度会变高 1509 * 1510 * @param use 是否使用,默认false 1511 * @return AsrBuilder 1512 */ 1513 public AsrBuilder setUseConfMore(String use) { 1514 mDdsConfig.addConfig(DDSConfig.K_NGRAM_GRAM_CONF_USE_MORE, use); 1515 return this; 1516 } 1517 } 1518 1519 /** 1520 * sdk 需要使用到的功能开关配置。 1521 * 包括推送、大数据、socket节点、唤醒、声纹、VAD节点、H5节点 等 1522 */ 1523 public static class NodeBuilder extends BaseBuilder { 1524 1525 public NodeBuilder(DDSConfig ddsConfig) { 1526 super(ddsConfig); 1527 } 1528 1529 /** 1530 * 是否开启数据更新功能 <br> 1531 * 默认 true 1532 * 1533 * @param enable 是否开启数据更新功能 1534 * @return NodeBuilder 1535 */ 1536 public NodeBuilder enableUpdate(boolean enable) { 1537 mDdsConfig.addConfig(DDSConfig.K_USE_UPDATE, String.valueOf(enable)); 1538 return this; 1539 } 1540 1541 /** 1542 * 是否开启大数据上传功能 <br> 1543 * 默认 true 1544 * 1545 * @param enable 是否开启大数据上传功能 1546 * @return NodeBuilder 1547 */ 1548 public NodeBuilder enableUpload(boolean enable) { 1549 mDdsConfig.addConfig(DDSConfig.K_USE_UPLOAD, String.valueOf(enable)); 1550 return this; 1551 } 1552 1553 /** 1554 * 是否开启推送功能 <br> 1555 * 默认 true 1556 * 1557 * @param enable 是否开启推送功能 1558 * @return NodeBuilder 1559 */ 1560 public NodeBuilder enablePush(boolean enable) { 1561 mDdsConfig.addConfig(DDSConfig.K_USE_PUSH, String.valueOf(enable)); 1562 return this; 1563 } 1564 1565 /** 1566 * 是否开启H5节点功能 <br> 1567 * 默认 false 1568 * 1569 * @param enable 是否开启H5节点功能 1570 * @return NodeBuilder 1571 */ 1572 public NodeBuilder enableH5(boolean enable) { 1573 mDdsConfig.addConfig(DDSConfig.K_H5_NODE_ENABLE, String.valueOf(enable)); 1574 return this; 1575 } 1576 1577 /** 1578 * 是否开启声纹功能 <br> 1579 * 默认 false 1580 * 1581 * @param enable 是否开启声纹功能 1582 * @return NodeBuilder 1583 */ 1584 public NodeBuilder enableVprint(boolean enable) { 1585 mDdsConfig.addConfig(DDSConfig.K_VPRINT_ENABLE, String.valueOf(enable)); 1586 return this; 1587 } 1588 1589 /** 1590 * 是否开启 socket 节点功能 <br> 1591 * 默认 true 1592 * 1593 * @param enable 是否开启 socket 节点功能 1594 * @return NodeBuilder 1595 */ 1596 public NodeBuilder enableSocket(boolean enable) { 1597 mDdsConfig.addConfig(DDSConfig.K_SOCKET_NODE_ENABLE, String.valueOf(enable)); 1598 return this; 1599 } 1600 1601 /** 1602 * 是否开启唤醒节点功能 <br> 1603 * 默认 true 1604 * 1605 * @param enable 是否开启唤醒节点功能 1606 * @return NodeBuilder 1607 */ 1608 public NodeBuilder enableWakeup(boolean enable) { 1609 mDdsConfig.addConfig(DDSConfig.K_WAKEUP_NODE_ENABLE, String.valueOf(enable)); 1610 return this; 1611 } 1612 1613 /** 1614 * 是否开启 VAD 节点功能 <br> 1615 * 默认 true 1616 * 1617 * @param enable 是否开启 VAD 节点功能 1618 * @return NodeBuilder 1619 */ 1620 public NodeBuilder enableVad(boolean enable) { 1621 mDdsConfig.addConfig(DDSConfig.K_VAD_NODE_ENABLE, String.valueOf(enable)); 1622 return this; 1623 } 1624 1625 /** 1626 * 是否开启 nlu 节点功能 <br> 1627 * 默认 true 1628 * 1629 * @param enable 是否开启 nlu 节点功能 1630 * @return NodeBuilder 1631 */ 1632 public NodeBuilder enableNlu(boolean enable) { 1633 mDdsConfig.addConfig(DDSConfig.K_NLU_NODE_ENABLE, String.valueOf(enable)); 1634 return this; 1635 } 1636 1637 /** 1638 * 是否支持本地识别增量更新 <br> 1639 * 默认 false 1640 * 1641 * @param enable 是否支持本地识别增量更新 1642 * @return NodeBuilder 1643 */ 1644 public NodeBuilder enableIncrementWakeup(boolean enable) { 1645 mDdsConfig.addConfig(DDSConfig.K_SUPPORT_INCREMENT_WAKEUP, String.valueOf(enable)); 1646 return this; 1647 } 1648 } 1649 1650 public static class BaseBuilder { 1651 protected DDSConfig mDdsConfig; 1652 1653 public BaseBuilder(DDSConfig ddsConfig) { 1654 mDdsConfig = ddsConfig; 1655 } 1656 } 1657 1658}