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 &amp; ENDTIME为0,唤醒后进入识别;若VAD检测超时,则直接退出对话<br>
824         * 若MIDTIME为0 &amp; ENDTIME不为0,唤醒后进入识别;若ENDTIME超时,则直接退出对话<br>
825         * 若MIDTIME不为0 &amp; ENDTIME为0,唤醒后进入识别;若MIDTIME超时,则播放欢迎语,继续识别(默认)<br>
826         * 若MIDTIME不为0 &amp; 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 &amp; ENDTIME为0,唤醒后进入识别;若VAD检测超时,则直接退出对话<br>
842         * 若MIDTIME为0 &amp; ENDTIME不为0,唤醒后进入识别;若ENDTIME超时,则直接退出对话<br>
843         * 若MIDTIME不为0 &amp; ENDTIME为0,唤醒后进入识别;若MIDTIME超时,则播放欢迎语,继续识别(默认<br>
844         * 若MIDTIME不为0 &amp; 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}