001package com.aispeech.dui.dds;
002
003import android.text.TextUtils;
004import android.util.Log;
005
006import com.aispeech.dui.dds.auth.AuthType;
007import com.aispeech.dui.manager.AILog;
008import com.aispeech.libbase.AIGsonUtil;
009
010import java.net.URLEncoder;
011import java.util.HashMap;
012import java.util.Iterator;
013import java.util.Map;
014
015public class DDSConfig {
016
017    public static final String TAG = "DDSConfig";
018
019    /**
020     * 产品ID<br>
021     * <p>
022     * 取值:产品ID字符串<br>
023     * 是否必需:是<br>
024     * 默认值:无<br>
025     */
026    public static final String K_PRODUCT_ID = "PRODUCT_ID";
027
028    /**
029     * 产品分支号<br>
030     * <p>
031     * 取值:产品分支号字符串(prod/test/自定义)<br>
032     * 是否必需:是<br>
033     * 默认值:无<br>
034     */
035    public static final String K_ALIAS_KEY = "ALIAS_KEY";
036
037
038    /**
039     * 设备ID<br>
040     * 用于授权认证的原始设备ID,请务必确保设备ID唯一。已废弃,使用deviceName<br>
041     * <p>
042     * 取值:设备ID字符串<br>
043     * 是否必需:否<br>
044     */
045    @Deprecated
046    public static final String K_DEVICE_ID = "DEVICE_ID";
047
048    /**
049     * 设备 DeviceName, 用来标识设备的标识符<br>
050     * <p>
051     * 取值:设备 DeviceName <br>
052     * 是否必需:否<br>
053     * 默认值:无
054     */
055    @Deprecated
056    public static final String K_DEVICE_NAME = "DEVICE_NAME";
057
058
059    /**
060     * 用户ID<br>
061     * <p>
062     * 取值:用户ID字符串(保留字段)<br>
063     * 是否必需:否<br>
064     * 默认值:USER2021ID
065     */
066    public static final String K_USER_ID = "USER_ID";
067
068    /**
069     * 用户ID<br>
070     * <p>
071     * 取值:用户ID字符串<br>
072     * 是否必需:否<br>
073     * 默认值:无<br>
074     */
075    static final String K_AISPEECH_USER_ID = "AISPEECH_USER_ID";
076
077    /**
078     * 是否使用内置的资源更新通知栏<br>
079     * <p>
080     * 取值:true or false<br>
081     * 是否必需:否<br>
082     * 默认值:true<br>
083     */
084    public static final String K_USE_UPDATE_NOTIFICATION = "USE_UPDATE_NOTIFICATION";
085
086    /**
087     * 录音模式
088     * <p>
089     * 取值:internal or external<br>
090     * internal:为SDK内部录音<br>
091     * external:由外部调用<code>DDS.getInstance().getAgent().feedPcm()</code>传入音频<br>
092     * 是否必需:否<br>
093     * 默认值:internal<br>
094     */
095    public static final String K_RECORDER_MODE = "RECORDER_MODE";
096
097    /**
098     * 点击模式
099     * <p>
100     * 取值:
101     * 0: 在tts播放状态下click的时候,直接关闭对话
102     * 1: 在tts播放状态下click的时候,打断播报并进入下一轮对话,如果没有下一轮对话则关闭对话
103     * 是否必需:否<br>
104     * 默认值:0<br>
105     */
106    public static final String K_CLICK_MODE = "CLICK_MODE";
107
108    /**
109     * TTS播报模式<br>
110     * <p>
111     * 取值:internal or external<br>
112     * internal:为内部合成引擎<br>
113     * external:为外部合成引擎,需调用<code>DDS.getInstance().getAgent().setTTSRequestListener()</code>获取播报时机,
114     * 播报完成后调用<code>DDS.getInstance().getAgent().notifyTTSEnd()</code>标记结束<br>
115     * 是否必需:否<br>
116     * 默认值:internal<br>
117     */
118    public static final String K_TTS_MODE = "TTS_MODE";
119
120    /**
121     * TTS外部合成模式下<code>TTSRequestListener</code>是否返回 type == “audio” 数据<br>
122     * 需要 K_TTS_MODE 设置为 external 才能生效
123     * <p>
124     * 取值:true or false<br>
125     * true:接口回调音频<br>
126     * false:接口不会回调音频,
127     * 播报完成后调用<code>DDS.getInstance().getAgent().notifyTTSEnd()</code>标记结束<br>
128     * 是否必需:否<br>
129     * 默认值:false<br>
130     */
131    public static final String K_TTS_EXTERNAL_AUDIO_ENABLE = "TTS_EXTERNAL_AUDIO_ENABLE";
132
133    /**
134     * TTS开启内存优化<br>
135     * <p>
136     * 取值:true or false<br>
137     * 是否必需:否<br>
138     * 默认值:false<br>
139     */
140    public static final String K_TTS_OPTIMIZATION = "TTS_OPTIMIZATION";
141
142    /**
143     * 支持在对话过程中播放外部speak,优先级 1 2 3 不会被静音
144     */
145    public static final String K_ENABLE_TTS_SIMULTANEOUS = "ENABLE_TTS_SIMULTANEOUS";
146
147    /**
148     * 在对话中打断播放,不会释放焦点
149     */
150    public static final String K_ENABLE_NOT_ABANDON_IN_DIALOG = "ENABLE_NOT_ABANDON_IN_DIALOG";
151
152    /**
153     * 唤醒后是否进入对话<br>
154     * <p>
155     * 取值:dialog or partner<br>
156     * dialog:唤醒默认进入识别及对话<br>
157     * partner:唤醒后不会主动进入识别及对话,同时唤醒后会收到sys.wakeup.result的message消息<br>
158     * 是否必需:否<br>
159     * 默认值:dialog<br>
160     */
161    public static final String K_WAKEUP_ROUTER = "WAKEUP_ROUTER";
162
163    /**
164     * 禁止自定义欢迎语功能, 优化使用<br>
165     * <p>
166     * 取值:true/false<br>
167     * 是否必需:否<br>
168     * 默认值:false<br>
169     */
170    public static final String K_WAKEUP_DISABLE_CUSTOM_GREETING = "WAKEUP_DISABLE_CUSTOM_GREETING";
171
172    /**
173     * 就近唤醒网络修改之后延迟响应时间
174     */
175    public static final String K_NETWORKMANAGER_DELAY = "NETWORKMANAGER_DELAY";
176
177    /**
178     * 是否使用过滤识别为空功能 默认为 false
179     * <p>
180     * 识别服务识别到的结果为空时,直接舍弃对话结果,进入下一轮识别
181     * <p>
182     * 只在半双工下有效
183     * 取值:true or false<br>
184     * 是否必需:否<br>
185     * 默认值:false<br>
186     */
187    public static final String K_ASR_IGNORE_EMPTY_RESULT = "ASR_IGNORE_EMPTY_RESULT";
188
189    /**
190     * 设置 sdk 内部的消息队列最大长度<br>
191     * <p>默认 500, 0表示不限制长度, 建议大于100</p>
192     * <p>动态库方法运行在一个单独的线程里,通过消息队列依次调用。
193     * 在设备性能不好的设备上可以设置消息队列最大长度,防止算力不够导致内核无法及时处理完音频数据而导致内存过大的问题</p>
194     * 是否必需:否<br>
195     * 默认值:500 <br>
196     */
197    public static final String K_MESSAGE_QUEUE_MAX_SIZE = "MESSAGE_QUEUE_MAX_SIZE";
198
199    /**
200     * 设置远近场硬件采集模组的类型<br>
201     * <p>
202     * 是否必需:否<br>
203     * 默认值:无
204     * 示例:{"far":"mictype","near":"mictype"} <br>
205     * mictype 取值:<br>
206     * 0:默认单麦(1路音频)<br>
207     * 1:单麦回消(1路音频+1路参考音)<br>
208     * 2:线性四麦(4路音频)<br>
209     * 3:环形六麦(6路音频)<br>
210     * 4:车载双麦(废弃)<br>
211     * 5:家居双麦(2路音频)<br>
212     * 6:环麦4麦(4路音频)<br>
213     * 7:车载双麦(2路音频)<br>
214     * 8:线性六麦(6路音频)<br>
215     * 10:线性八麦(8路音频)<br>
216     * 是否必需:否<br>
217     */
218    public static final String K_PICKUP_MIC_TYPE = "PICKUP_MIC_TYPE";
219
220    /**
221     * 控制 AudioTrack 每次写音频数据的大小,默认有多少数据都会一次写入。<br>
222     * 可以设置 800,这样 AudioTrack 每次只写 800 字节音频数据<br>
223     * 该配置只用于极少数设备<br>
224     * 是否必需:否<br>
225     */
226    public static final String K_PLAYER_AUDIO_TRACK_WRITE_ONCE_SIZE = "PLAYER_AUDIO_TRACK_WRITE_ONCE_SIZE";
227
228    /**
229     * 音频的回路数量<br>
230     * 音频通道总数包含麦克风原始音频数+回路通道数。这里的配置只是回路通道数
231     * <p>
232     * 取值:数字<br>
233     * 是否必需:否<br>
234     * 默认值:0
235     */
236    public static final String K_MIC_ECHO_CHANNEL_NUM = "MIC_ECHO_CHANNEL_NUM";
237
238    /**
239     * 初始化是否要等待oauth的刷新token返回,默认为false
240     * 默认为false,效果为初始成功的回调不依赖于oauth是否刷新token成功,可正常初始化,但在初始化之后立即对话可能会有授权失败的问题
241     * 如果设置为true,则必须保证当前网络连接正常,如网络连接不正常,则可能导致卡死在初始化页面
242     */
243    public static final String K_INIT_WAIT_OAUTH_REFRESH_TOKEN = "INIT_WAIT_OAUTH_REFRESH_TOKEN";
244
245    /**
246     * 需要过滤的唤醒词
247     * <p>
248     * 唤醒词字符串,以’,‘分割唤醒词。例如 "你好小乐,你好小朋"
249     * </p>
250     * 需要过滤的唤醒词会在请求服务器时以参数带上
251     * <ul>
252     *     <li>使用 oneshot 时,唤醒词 + ',' + ASR_DROP_WORDS</li>
253     *     <li>不使用 oneshot 时,ASR_DROP_WORDS</li>
254     * </ul>
255     */
256    public static final String K_ASR_DROP_WORDS = "ASR_DROP_WORDS";
257
258    /**
259     * 就近唤醒服务地址<br>
260     * <p>
261     * 取值:服务地址<br>
262     * 是否必需:否<br>
263     * 默认值:""
264     */
265    public static final String K_NEAR_WAKEUP_SERVER_NAME = "NEAR_WAKEUP_SERVER_NAME";
266
267    /**
268     * 配置参与组网的唤醒词,即配置之后该唤醒词会参与组网,其他的唤醒词不参与组网
269     * 取值:参与组网的唤醒词,不同唤醒词以,分割,如"xiao chi xiao chi, ni hao xiao chi"
270     * 是否必须:否
271     * 默认值:""
272     */
273    public static final String K_NEAR_WAKEUP_WORD = "NEAR_WAKEUP_WORD";
274
275    /**
276     * 就近唤醒送给 mds 的音频是否是 AEC 之后的音频
277     * <p>
278     * 取值:true(AEC 之后的音频) or false(送的是原始音频)<br>
279     * 是否必需:否<br>
280     * 默认值:false
281     */
282    public static final String K_NEAR_WAKEUP_AUDIO_ADOPT_AEC = "NEAR_WAKEUP_AUDIO_ADOPT_AEC";
283
284    /**
285     * 云端对话送识别的音频类型
286     * 取值: wav, ogg
287     * 是否必须:否
288     * 默认值: ogg
289     */
290    public static final String K_DM_ASR_AUDIO_TYPE = "CDM_AUDIO_TYPE";
291
292    /**
293     * 云端对话送识别的音频压缩率
294     * 默认是 8
295     * CPU压力大可以配置成3~6
296     */
297    public static final String K_DECODE_COMPLEXITY = "DECODE_COMPLEXITY";
298
299    /**
300     * TTS 是否使用缓存 <br>
301     * 取值:true false <br>
302     * 是否必需:否 <br>
303     * 默认值:true
304     */
305    public static final String K_TTS_CACHE = "TTS_CACHE";
306
307    /**
308     * 识别后是否进入对话<br>
309     * <p>
310     * 取值:dialog or partner<br>
311     * dialog:识别之后进入对话<br>
312     * partner:识别之后不会进入对话,可通过ASREngine相关方法获取识别结果<br>
313     * 是否必需:否<br>
314     * 默认值:dialog<br>
315     */
316    public static final String K_ASR_ROUTER = "ASR_ROUTER";
317
318    /**
319     * 识别结果是否带标点符号<br>
320     * 开关同时控制识别和语义,开启后,语义解析结果也会带标点符号,且不建议在oneshot、中英文连用、轻音的情况下使用。
321     * <p>
322     * 取值:true or false<br>
323     * 是否必需:否<br>
324     * 默认值:false<br>
325     */
326    public static final String K_ASR_ENABLE_PUNCTUATION = "ENABLE_PUNCTUATION";
327    /**
328     * 识别过滤敏感词功能<br>
329     * <p>
330     * 取值:true or false<br>
331     * 是否必需:否<br>
332     * 默认值:false<br>
333     */
334    public static final String K_ASR_ENABLE_CENSOR= "ENABLE_CENSOR";
335
336
337    /**
338     * 授权文件保存路径<br>
339     * <p>
340     * 是否必需:否<br>
341     */
342    static final String K_PROFILE_PATH = "PROFILE_PATH";
343
344    /**
345     * 使用动态端口号<br>
346     * <p>
347     * 取值: true or false<br>
348     * 是否必需:否<br>
349     * 默认值:false<br>
350     */
351    @Deprecated
352    static final String K_ENABLE_DYNAMIC_PORT = "ENABLE_DYNAMIC_PORT";
353
354    /**
355     * 使用uiagent动态端口号<br>
356     * <p>
357     * 取值: true or false<br>
358     * 是否必需:否<br>
359     * 默认值:false<br>
360     */
361    public static final String K_ENABLE_DYNAMIC_UIAGENT_PORT = "ENABLE_DYNAMIC_UIAGENT_PORT";
362
363    /**
364     * 识别结果的拼音是否带音调<br>
365     * <p>
366     * 取值:true or false<br>
367     * 是否必需:否<br>
368     * 默认值:false<br>
369     */
370    public static final String K_ASR_ENABLE_TONE = "ENABLE_TONE";
371
372    /**
373     * 新增技能锁定接口,让用户说的话只落在锁定的技能里<br>
374     * <p>
375     * 取值:
376     * <pre>
377     *      [
378     *          {"skillId": "123123"},
379     *          {"skillId": "123123"},
380     *          {"skillId": "123123"},
381     *      ]
382     *  </pre>
383     * 是否必需:否<br>
384     * 默认值:无<br>
385     */
386    public static final String K_PERMANENT_SKILL = "PERMANENT_SKILL";
387
388    /**
389     * 设置指定语料的识别置信度,防止某些语料识别置信度过低被抛弃。
390     * <pre>
391     *     [
392     *         {
393     *            "name": "打开宝宝睡觉模式",
394     *            "confidence": "0.61"
395     *         },
396     *         {
397     *            "name": "打开音乐",
398     *            "confidence": "0.62"
399     *         }
400     *     ]
401     *
402     * </pre>
403     * 是否必需:否<br>
404     * 默认值:无<br>
405     */
406    public static final String K_ASR_CUSTOM_CONF = "ASR_CUSTOM_CONF";
407
408    /**
409     * 全双工支持vadTimeout最大次数,默认值为:1<br>
410     * <p>
411     * 取值:int型数字
412     * 是否必需:否<br>
413     * 默认值:1<br>
414     */
415    public static final String K_ENALBE_QSG_VAD_TIMEOUT_MAX_COUNT = "ENALBE_QSG_VAD_TIMEOUT_MAX_COUNT";
416
417    /**
418     * 开启后识别前都会有叮咚声<br>
419     * <p>
420     * 取值:true/false
421     * 是否必需:否<br>
422     * 默认值:false<br>
423     */
424    public static final String K_ASR_BEFORE_TIPS = "ASR_BEFORE_TIPS";
425
426    /**
427     * 优化离线gram编译逻辑,打开后,gram只在需要更新的场景下才会重新编译,否则即便重新初始化也不会编译<br>
428     * <p>
429     * 取值:true/false
430     * 是否必需:否<br>
431     * 默认值:false<br>
432     */
433    public static final String K_OPT_GRAM_BUILD = "OPT_GRAM_BUILD";
434
435    /**
436     * ngram 和 gram 融合时使用置信度跟大的结果,Gram更新热词词库,热词的置信度会变高
437     */
438    public static final String K_NGRAM_GRAM_CONF_USE_MORE = "NGRAM_GRAM_CONF_USE_MORE";
439
440    /**
441     * 自定义授权证书的SHA256, sdk 授权时会检查包名和签名的SHA256,第三方加固后可能改变,可以配置新的SHA256<br>
442     * <p>
443     * 取值:字符串<br>
444     * 是否必需:否<br>
445     * 默认值:<br>
446     */
447    public static final String K_CUSTOM_SHA256 = "CUSTOM_SHA256";
448
449    /**
450     * 试用授权是否连网更新成在线授权<br>
451     * <p>
452     * 取值:true or false<br>
453     * 是否必需:否<br>
454     * 默认值:true<br>
455     */
456    public static final String K_NEED_REPLACE_PROFILE = "NEED_REPLACE_PROFILE";
457
458    /**
459     * assets目录下的离线授权文件名<br>
460     * <p>
461     * 取值:assets目录下的离线授权文件名<br>
462     * 是否必需:否<br>
463     * 默认值:<br>
464     */
465    public static final String K_OFFLINE_PROFILE_NAME = "OFFLINE_PROFILE_NAME";
466
467    /**
468     * 中文数字转阿拉伯数字
469     * <p>
470     * 取值:true或者false<br>
471     * 是否必需:否<br>
472     * 默认值:false
473     */
474    public static final String K_ASR_ENABLE_NUMBER_CONVERT = "ENABLE_NUMBER_CONVERT";
475
476    /**
477     * 多意图顺序执行 <br>
478     * <p>
479     * 取值:true or false<br>
480     * 是否必需:否<br>
481     * 默认值:false
482     */
483    public static final String K_ENABLE_MULTIINTENT_SEQUENCE = "ENABLE_MULTIINTENT_SEQUENCE";
484
485    public static final String K_MULTI_INTENT_IGNORE_WAIT_SKILL = "MULTI_INTENT_IGNORE_WAIT_SKILL";
486
487    /**
488     * 自定义唤醒词阈值<br>
489     * <p>
490     * 是否必需:否<br>
491     * 默认值:无
492     */
493    public static final String K_ASR_CUSTOM_WAKEUP_SCORE = "CUSTOM_WAKEUP_SCORE";
494
495    /**
496     * VAD静音超时时间(多久没有检测到人声,默认8000ms)<br>
497     * <p>
498     * 取值:毫秒时间<br>
499     * 是否必需:否<br>
500     * 默认值:8000<br>
501     */
502    public static final String K_VAD_TIMEOUT = "VAD_TIMEOUT";
503
504    /**
505     * 云端VAD静音判断时间<br>
506     * <p>
507     * 取值:毫秒时间<br>
508     * 是否必需:否<br>
509     * 默认值:500<br>
510     */
511    public static final String K_CLOUD_VAD_PAUSE_TIME = "CLOUD_VAD_PAUSE_TIME";
512
513    /**
514     * 录音机数据源类型<br>
515     * <p>
516     * 取值:AudioSource.*<br>
517     * 是否必需:否<br>
518     * 默认值:AudioSource.DEFAULT<br>
519     */
520    public static final String K_AUDIO_SOURCE = "AUDIO_SOURCE";
521
522    /**
523     * 录音机频道源类型<br>
524     * <p>
525     * 取值:AudioFormat.*<br>
526     * 是否必需:否<br>
527     * 默认值:内部自适应<br>
528     */
529    public static final String K_AUDIO_CHANNEL_CONF = "AUDIO_CHANNEL_CONF";
530
531    /**
532     * 音频通道数 <br>
533     * sdk 内计算需要的缓存大小、音量等使用
534     */
535    public static final String K_AUDIO_CHANNEL_COUNT = "AUDIO_CHANNEL_COUNT";
536
537    /**
538     * 录音机参数:audioFormat <br>
539     * 默认值:AudioFormat.ENCODING_PCM_16BIT
540     */
541    public static final String K_AUDIO_FORMAT = "AUDIO_FORMAT";
542
543    /**
544     * 内置录音机读取buffer的大小<br>
545     * <p>
546     * 取值:int型数值<br>
547     * 是否必需:否<br>
548     * 默认值:通道数*16/8*16000*100/1000 B<br>
549     */
550    public static final String K_AUDIO_BUFFER_SIZE_IN_BYTE = "AUDIO_BUFFER_SIZE_IN_BYTE";
551
552    /**
553     * 录音机的通道索引掩码
554     * <ul>
555     * <li>String.valueOf(0x3) 二进制表示是 11,表示2个通道</li>
556     * <li>String.valueOf(0x3F) 二进制表示是 111111,表示6个通道</li>
557     * </ul>
558     */
559    public static final String K_AUDIO_CHANNEL_INDEX_MASK = "AUDIO_CHANNEL_INDEX_MASK";
560
561    /**
562     * Build.VERSION_CODES.M 及以上系统是否使用新的 AudioRecord 构造方法,默认 false
563     */
564    public static final String K_AUDIO_RECORD_USE_HIGH_API = "AUDIO_RECORD_USE_HIGH_API";
565
566    /**
567     * 内置录音机读取buffer的大小<br>
568     * <p>
569     * 取值:int型数值<br>
570     * 是否必需:否<br>
571     * 默认值:通道数*16/8*16000*100/1000 B<br>
572     */
573    public static final String K_AUDIO_BUFFER_SIZE = "AUDIO_BUFFER_SIZE";
574
575    /**
576     * 录音机采样率<br>
577     * <p>
578     * 取值:16000/32000<br>
579     * 是否必需:否<br>
580     * 默认值:内部自适应<br>
581     */
582    public static final String K_AUDIO_SAMPLERATE = "AUDIO_SAMPLERATE";
583
584    /**
585     * 内置播放器的STREAM类型<br>
586     * <p>
587     * 取值:AudioManager.STREAM_*<br>
588     * 是否必需:否<br>
589     * 默认值:AudioManager.STREAM_ALARM<br>
590     */
591    public static final String K_STREAM_TYPE = "STREAM_TYPE";
592
593    /**
594     * 内置播放器的USAGE类型<br>
595     * <p>
596     * 取值:AudioAttributes.USAGE_*<br>
597     * 是否必需:否<br>
598     * 默认值:AudioAttributes.USAGE_ALARM<br>
599     */
600    public static final String K_AUDIO_USAGE = "AUDIO_USAGE";
601
602    /**
603     * 内置播放器的contenttype类型<br>
604     * <p>
605     * 取值:AudioAttributes.CONTENT_TYPE_*<br>
606     * 是否必需:否<br>
607     * 默认值:AudioAttributes.CONTENT_TYPE_SONIFICATION<br>
608     */
609    public static final String K_CONTENT_TYPE = "CONTENT_TYPE";
610
611    /**
612     * 内置播放器的焦点类型<br>
613     * <p>
614     * 取值:AudioManager.AUDIOFOCUS_GAIN_*<br>
615     * 是否必需:否<br>
616     * 默认值:AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE<br>
617     */
618    public static final String K_AUDIO_FOCUS_GAIN = "AUDIO_FOCUS_GAIN";
619
620    /**
621     * 是否翻转内置录音机通道<br>
622     * <p>
623     * 取值:true or false<br>
624     * 是否必需:否<br>
625     * 默认值:false<br>
626     */
627    public static final String K_IS_REVERSE_AUDIO_CHANNEL = "IS_REVERSE_AUDIO_CHANNEL";
628
629    /**
630     * 设置硬件麦克风采集模组的类型<br>
631     * 默认使用 DUI 控制台上产品的对应配置项。若客户端通过SDK配置此项后,则以客户端配置为准。
632     * <p>
633     * 取值:<br>
634     * 0:默认单麦(1路音频)<br>
635     * 1:单麦回消(1路音频+1路参考音)<br>
636     * 2:线性四麦(4路音频)<br>
637     * 3:环形六麦(6路音频)<br>
638     * 4:车载双麦(废弃)<br>
639     * 5:家居双麦(2路音频)<br>
640     * 6:环麦4麦(4路音频)<br>
641     * 7:车载双麦(2路音频)<br>
642     * 8:线性六麦(6路音频)<br>
643     *
644     * 10:线性八麦(8路音频)<br>
645     * 是否必需:否<br>
646     * 默认值:0
647     */
648    public static final String K_MIC_TYPE = "MIC_TYPE";
649
650    /**
651     * 设置送到dmasp引擎中的音频通道数量,不设置默认dmasp送的是四通道音频
652     */
653    public static final String K_CHANNEL_TYPE = "CHANNEL_TYPE";
654
655    /**
656     * 车载双麦和4麦可以使用 dmasp 算法
657     */
658    public static final String K_USE_DMASP = "USE_DMASP";
659
660    /**
661     * 是否使用大音量检测 <br>
662     * 默认值: false
663     */
664    public static final String K_HIGH_VOLUME_CHECK = "HIGH_VOLUME_CHECK";
665
666    /**
667     * 内核资源存放的目录<br>
668     * <p>
669     * 取值:绝对路径字符串<br>
670     * 是否必需:否<br>
671     * 默认值:/data/data/包名/files/dds/duicore/
672     */
673    public static final String K_DUICORE_HOME = "DUICORE_HOME";
674
675    /**
676     * 产品资源存放的目录<br>
677     * <p>
678     * 取值:绝对路径字符串<br>
679     * 是否必需:否<br>
680     * 默认值:/data/data/com.xxx/files/dds/custom/
681     */
682    public static final String K_CUSTOM_HOME = "CUSTOM_HOME";
683
684    /**
685     * 使用内置内核资源包<br>
686     * <p>
687     * 取值:assets目录下为压缩包名称,其他目录为绝对路径字符串<br>
688     * 是否必需:否<br>
689     * 默认值:无
690     */
691    public static final String K_DUICORE_ZIP = "DUICORE_ZIP";
692
693
694    /**
695     * 使用自定义授权文件(比如试用授权文件)<br>
696     * <p>
697     * 取值:assets目录下为自定义授权文件名<br>
698     * 是否必需:否<br>
699     * 默认值:无
700     */
701    static final String K_PROFILE = "PROFILE";
702
703    /**
704     * 使用内置产品资源包, 从官网下载的产品资源包一般叫 product.zip<br>
705     * <p>
706     * 取值:assets目录下为压缩包名称,其他目录为绝对路径字符串<br>
707     * 是否必需:否<br>
708     * 默认值:无
709     */
710    public static final String K_CUSTOM_ZIP = "CUSTOM_ZIP";
711
712    /**
713     * 内核资源包保存路径<br>
714     * <p>
715     * 取值:绝对路径字符串<br>
716     * 是否必需:否<br>
717     * 默认值:无
718     */
719    public static final String K_DUICORE_BACKUP_ZIP_USER_DEFINED = "DUICORE_BACKUP_ZIP_USER_DEFINED";
720
721    /**
722     * 产品资源包保存路径<br>
723     * <p>
724     * 取值:绝对路径字符串<br>
725     * 是否必需:否<br>
726     * 默认值:无
727     */
728    public static final String K_CUSTOM_BACKUP_ZIP_USER_DEFINED = "CUSTOM_BACKUP_ZIP_USER_DEFINED";
729
730    /**
731     * 全双工模式下,在对话中过程中关闭唤醒<br>
732     * <p>
733     * 取值:true/false<br>
734     * 是否必需:否<br>
735     * 默认值:false
736     */
737    public static final String K_DISABLE_WAKEUP_IN_DIALOG = "DISABLE_WAKEUP_IN_DIALOG";
738
739    /**
740     * 使用exoPlayer播报speakUrl<br>
741     * <p>
742     * 取值:true/false<br>
743     * 是否必需:否<br>
744     * 默认值:false
745     */
746    public static final String K_USE_EXO_PLAY_SPEAKURL = "USE_EXO_PLAY_SPEAKURL";
747
748    /**
749     * 保留字段,上传、升级时使用
750     */
751    public static final String K_ACCESS_TOKEN = "ACCESS_TOKEN";
752
753    /**
754     * 授权方式<br>
755     * <p>
756     * 取值:AuthType.AISPEECH_ID or AuthType.PROFILE<br>
757     * 是否必需:是<br>
758     * 默认值:无
759     */
760    static final String K_AUTH_TYPE = "AUTH_TYPE";
761
762    /**
763     * 产品API keys<br>
764     * 限制:一个API Key只被指定的客户端使用。来源:DUI控制台-产品接入-授权管理
765     * <p>
766     * 取值:API keys字符串<br>
767     * 是否必需:是<br>
768     * 默认值:无
769     */
770    public static final String K_API_KEY = "API_KEY";
771
772    /**
773     * 产品Product Key<br>
774     * <p>
775     * 取值:DUI控制台-产品接入-授权管理-Product Key<br>
776     * 是否必需:是<br>
777     * 默认值:无
778     */
779    public static final String K_PRODUCT_KEY = "PRODUCT_KEY";
780
781    /**
782     * 噪声检测配置,开启后可过滤噪声识别结果<br>
783     * <p>
784     * 取值:true or false<br>
785     * 是否必需:否<br>
786     * 默认值:false
787     */
788    public static final String K_ENABLE_AUDIO_DETECTION = "ENABLE_AUDIO_DETECTION";
789
790    /**
791     * 产品Product Secret<br>
792     * <p>
793     * 取值:DUI控制台-产品接入-授权管理-Product Secret<br>
794     * 是否必需:是<br>
795     * 默认值:无
796     */
797    public static final String K_PRODUCT_SECRET = "PRODUCT_SECRET";
798
799    /**
800     * 产品licenseID<br>
801     * <p>
802     * 预分配licence模式下的参数<br>
803     * 是否必需:否<br>
804     * 默认值:无
805     */
806    public static final String K_PRODUCT_LICENSE_ID = "PRODUCT_LICENSE_ID";
807
808    /**
809     * 缓存文件保存目录<br>
810     * <p>
811     * 取值:绝对路径字符串<br>
812     * 是否必需:否<br>
813     * 默认值:/sdcard/Android/data/包名/cache
814     */
815    public static final String K_CACHE_PATH = "CACHE_PATH";
816
817    /**
818     * 对话模式<br>
819     * <p>
820     * 取值:HALF_DUPLEX/FULL_DUPLEX <br>
821     * 是否必需:否<br>
822     * 默认值:HALF_DUPLEX
823     */
824    public static final String K_DUPLEX_MODE = "DUPLEX_MODE";
825
826    /**
827     * 全双工模式下是否使用vad<br>
828     * <p>
829     * 取值:true or false<br>
830     * 是否必需:否<br>
831     * 默认值:true
832     */
833    public static final String K_USE_VAD_IN_FULLDUPLEX = "USE_VAD_IN_FULLDUPLEX";
834
835    /**
836     * 全双工模式下是否可以唤醒<br>
837     * <p>
838     * 取值:true or false<br>
839     * 是否必需:否<br>
840     * 默认值:true
841     */
842    public static final String K_ENABLE_WAKEUP_IN_FULLDUPLEX = "ENABLE_WAKEUP_IN_FULLDUPLEX";
843
844    /**
845     * 离线全双工是否开启vad<br>
846     * <p>
847     * 取值:true or false<br>
848     * 是否必需:否<br>
849     * 默认值:false
850     */
851    public static final String K_ENABLE_QSG_IN_LDM = "ENABLE_QSG_IN_LDM";
852
853    /**
854     * 开启识别预测功能<br>
855     * <p>
856     * 取值:true or false<br>
857     * 是否必需:否<br>
858     * 默认值:false
859     */
860    public static final String K_ENABLE_PREDICT = "ENABLE_PREDICT";
861
862    /**
863     * 缓存文件大小限制<br>
864     * <p>
865     * 取值:int型数值<br>
866     * 是否必需:自定义缓存目录时必需<br>
867     * 默认值:无
868     */
869    public static final String K_CACHE_SIZE = "CACHE_SIZE";
870
871    /**
872     * 热词场景模式配置
873     */
874    public static final String K_WAKEUP_HOT_WORD_SCENE = "WAKEUP_HOT_WORD_SCENE";
875
876    /**
877     * 是否使用本地自定义deviceName<br>
878     * <p>
879     * 取值:true or false<br>
880     * 是否必需:否<br>
881     * 默认值:无
882     */
883    @Deprecated
884    static final String KEY_USE_LOCAL_DEVICE_NAME = "USE_LOCAL_DEVICE_NAME";
885
886    /**
887     * 设置TTS播放缓存buffer大小<br>
888     * <p>
889     * 取值:int型数值<br>
890     * 是否必需:否<br>
891     * 默认值:无
892     */
893    public static final String K_AUDIOTRACK_BUFFERSIZE = "AUDIOTRACK_BUFFERSIZE";
894
895    /**
896     * 指定对话错误码的TTS播报<br>
897     * <p>
898     * 取值:JSON字符串,如:<br>
899     * {
900     * "71304":"这是识别结果为空的自定义播报",
901     * "71305":"这是语义结果为空的自定义播报",
902     * "71308":"这是进入闲聊技能的自定义播报",
903     * "713**":"*****"
904     * }<br>
905     * 是否必需:否<br>
906     * 默认值:产品配置
907     */
908    public static final String K_CUSTOM_TIPS = "CUSTOM_TIPS";
909
910    /**
911     * 用预置音频来代替指定的TTS播报<br>
912     * <p>
913     * 取值:JSONArray字符串,如:<br>
914     * [{
915     * "name":"我在",
916     * "type":"wav",
917     * "path":"/sdcard/x.pcm"
918     * },
919     * {
920     * "name":"好的,再见",
921     * "type":"mp3",
922     * "path":"/sdcard/y.mp3"
923     * }]<br>
924     * 是否必需:是<br>
925     * 默认值:无
926     */
927    public static final String K_CUSTOM_AUDIO = "CUSTOM_AUDIO";
928
929    /**
930     * 云端识别是否开启音频压缩<br>
931     * <p>
932     * 取值:opus/ogg<br>
933     * 是否必需:否<br>
934     * 默认值:ogg
935     */
936    static final String K_AUDIO_COMPRESS = "AUDIO_COMPRESS";
937
938    static final String K_OPUS_COMPLEXITY = "OPUS_COMPLEXITY";
939
940    static final String K_ENABLE_CONFIDENCE = "ENABLE_CONFIDENCE";
941
942    /**
943     * 添加dcheck参数,唤醒矫正
944     */
945    static final String K_D_CHECK = "D_CHECK";
946
947
948    /**
949     * 添加major参数,区分主副唤醒词
950     */
951    static final String K_MAJOR = "MAJOR";
952
953    /**
954     * AEC(回声消除)模式<br>
955     * <p>
956     * 取值:internal or external<br>
957     * internal:由SDK内部根据采集模组做对应AEC处理<br>
958     * external:外部已经处理过AEC,SDK不再处理,并认为设备支持AEC<br>
959     * 是否必需:否<br>
960     * 默认值:internal
961     */
962    public static final String K_AEC_MODE = "AEC_MODE";
963
964    /**
965     * 麦克风阵列 sspe 资源的磁盘绝对路径<br>
966     * <p>
967     * 取值:绝对路径字符串<br>
968     * 是否必需:否<br>
969     * 默认值:内置资源
970     */
971    public static final String K_MIC_ARRAY_SSPE_BIN = "MIC_ARRAY_SSPE_BIN";
972
973    /**
974     * 麦克风阵列AEC资源的磁盘绝对路径<br>
975     * <p>
976     * 取值:绝对路径字符串<br>
977     * 是否必需:否<br>
978     * 默认值:内置资源
979     */
980    @Deprecated
981    public static final String K_MIC_ARRAY_AEC_CFG = "MIC_ARRAY_AEC_CFG";
982
983    /**
984     * 麦克风阵列beamforming资源的磁盘绝对路径<br>
985     * <p>
986     * 取值:绝对路径字符串<br>
987     * 是否必需:否<br>
988     * 默认值:内置资源
989     */
990    @Deprecated
991    public static final String K_MIC_ARRAY_BEAMFORMING_CFG = "MIC_ARRAY_BEAMFORMING_CFG";
992
993    /**
994     * @deprecated 不再需要此配置
995     */
996    @Deprecated()
997    public static final String K_MIC_ARRAY_WAKEUP_CFG = "MIC_ARRAY_WAKEUP_CFG";
998
999    /**
1000     * 是否保存进入VAD的音频(调试项)<br>
1001     * 已被废弃,代替:  {@linkplain DDS#setAudioDebug}
1002     *
1003     * @see DDS#setAudioDebug(boolean)
1004     */
1005    @Deprecated
1006    public static final String K_VAD_DEBUG = "VAD_DEBUG";
1007
1008    /**
1009     * 是否禁用VAD单字打断功能<br>
1010     * <p>
1011     * 取值:true or false<br>
1012     * 是否必需:否<br>
1013     * 默认值:false
1014     */
1015    public static final String K_VAD_DISABLE_SIGNAL = "VAD_DISABLE_SIGNAL";
1016
1017    /**
1018     * 是否保存TTS的音频(调试项)<br>
1019     * 已被废弃,代替: {@linkplain DDS#setAudioDebug}
1020     *
1021     * @see DDS#setAudioDebug(boolean)
1022     */
1023    @Deprecated
1024    public static final String K_TTS_DEBUG = "TTS_DEBUG";
1025
1026    /**
1027     * 是否保存ASR的音频(调试项)<br>
1028     * 已被废弃,代替: {@linkplain DDS#setAudioDebug}
1029     *
1030     * @see DDS#setAudioDebug(boolean)
1031     */
1032    @Deprecated
1033    public static final String K_ASR_DEBUG = "ASR_DEBUG";
1034
1035    /**
1036     * 服务端实现识别模拟oneshot<br>
1037     * <p>
1038     * 取值:true or false<br>
1039     * 是否必需:否<br>
1040     * 默认值:false
1041     */
1042    public static final String K_ASR_SIMULATE_ONESHOT = "ASR_SIMULATE_ONESHOT";
1043
1044    /**
1045     * 是否保存WAKEUP的音频(调试项)<br>
1046     * 已被废弃,代替: {@linkplain DDS#setAudioDebug}
1047     *
1048     * @see DDS#setAudioDebug(boolean)
1049     */
1050    @Deprecated
1051    public static final String K_WAKEUP_DEBUG = "WAKEUP_DEBUG";
1052
1053    /**
1054     * 是否使用就近唤醒<br>
1055     * <p>
1056     * 取值:true or false<br>
1057     * 是否必需:否<br>
1058     * 默认值:false
1059     */
1060    public static final String K_USE_NEAR_WAKEUP = "USE_NEAR_WAKEUP";
1061
1062    /**
1063     * 是否使用双头唤醒<br>
1064     * <p>
1065     * 取值:true or false<br>
1066     * 是否必需:否<br>
1067     * 默认值:false
1068     */
1069    public static final String K_USE_DUAL_WAKEUP = "USE_DUAL_WAKEUP";
1070    /**
1071     * 双头唤醒初始化的env配置<br>
1072     * <p>
1073     * {
1074     *     "xiao_mei_xiao_mei":{
1075     *         "customNet":1,
1076     *         "enableNet":1,
1077     *         "greeting":[
1078     *             "叫我干啥"
1079     *         ],
1080     *         "major":0,
1081     *         "name":"小美小美",
1082     *         "pinyin":"xiao_mei_xiao_mei",
1083     *         "threshHigh":"0.9",
1084     *         "threshLow":"0.01",
1085     *         "threshold":0.75,
1086     *         "type":"major"
1087     *     },
1088     *     "xiao mei xiu mei":{
1089     *         "customNet":0,
1090     *         "enableNet":1,
1091     *         "greeting":[
1092     *             "我是小美秀美"
1093     *         ],
1094     *         "major":0,
1095     *         "name":"小美小美",
1096     *         "pinyin":"xiao mei xiu mei",
1097     *         "threshHigh":"10",
1098     *         "threshLow":"0.01",
1099     *         "threshold":0.54,
1100     *         "type":"major"
1101     *     }
1102     * }
1103     */
1104    public static final String K_DUAL_WAKEUP_INIT_ENV = "DUAL_WAKEUP_INIT_ENV";
1105
1106    /**
1107     * voip_aec资源的路径<br>
1108     * <p>
1109     * 取值:<br>
1110     * 是否必需:否<br>
1111     * 默认值:
1112     */
1113    public static final String K_VOIP_AEC_BIN = "VOIP_AEC_BIN";
1114
1115    /**
1116     * voip_agc资源的路径<br>
1117     * <p>
1118     * 取值:<br>
1119     * 是否必需:否<br>
1120     * 默认值:
1121     */
1122    public static final String K_VOIP_AGC_BIN = "VOIP_AGC_BIN";
1123
1124    /**
1125     * 使用voip功能<br>
1126     * <p>
1127     * 取值:line_4<br>
1128     * 是否必需:否<br>
1129     * 默认值:无
1130     */
1131    public static final String K_VOIP_TYPE = "VOIP_TYPE";
1132
1133    /**
1134     * 识别时不要过滤唤醒词<br>
1135     * <p>
1136     * 取值:true or false<br>
1137     * 是否必需:否<br>
1138     * 默认值:false
1139     */
1140    public static final String K_ASR_NOT_DROP_WAKEUP = "ASR_NOT_DROP_WAKEUP";
1141
1142    /**
1143     * 是否保存ASRPP的音频(调试项)<br>
1144     * 已被废弃,代替:  {@linkplain DDS#setAudioDebug}
1145     *
1146     * @see DDS#setAudioDebug(boolean)
1147     */
1148    @Deprecated
1149    public static final String K_ASRPP_DEBUG = "ASRPP_DEBUG";
1150
1151    /**
1152     * 性别识别资源的绝对路径<br>
1153     * <p>
1154     * 取值:绝对路径字符串<br>
1155     * 是否必需:否<br>
1156     * 默认值:内置资源
1157     */
1158    public static final String K_ASRPP_GENDER_BIN = "GENDER_BIN";
1159
1160    /**
1161     * 年龄识别资源的绝对路径<br>
1162     * <p>
1163     * 取值:绝对路径字符串<br>
1164     * 是否必需:否<br>
1165     * 默认值:内置资源
1166     */
1167    public static final String K_ASRPP_AGE_BIN = "AGE_BIN";
1168
1169    /**
1170     * 保存ASRPP的音频的单字音频的长度(调试项)<br>
1171     * <p>
1172     * 取值:280ms<br>
1173     * 是否必需:否<br>
1174     * 默认值:280
1175     */
1176    static final String K_ASRPP_CACHE_PCM_LENGTH = "ASRPP_CACHE_PCM_LENGTH";
1177
1178    /**
1179     * 已被废弃, 不再支持单麦降噪功能
1180     */
1181    @Deprecated
1182    public static final String K_NR_ENABLE = "NR_ENABLE";
1183
1184    /**
1185     * 是否开启 socket 节点功能 <br>
1186     * <p>
1187     * 取值:true or false<br>
1188     * 是否必需:否<br>
1189     * 默认值:true
1190     */
1191    public static final String K_SOCKET_NODE_ENABLE = "SOCKET_NODE_ENABLE";
1192
1193    /**
1194     * 是否开启唤醒节点功能 <br>
1195     * 默认 true
1196     */
1197    public static final String K_WAKEUP_NODE_ENABLE = "WAKEUP_NODE_ENABLE";
1198
1199    /**
1200     * 是否开启 VAD 节点功能 <br>
1201     * 默认 true
1202     */
1203    public static final String K_VAD_NODE_ENABLE = "VAD_NODE_ENABLE";
1204
1205    /**
1206     * 是否开启H5节点功能 <br>
1207     * <p>
1208     * 取值:true or false<br>
1209     * 是否必需:否<br>
1210     * 默认值:false
1211     */
1212    public static final String K_H5_NODE_ENABLE = "H5_NODE_ENABLE";
1213
1214    public static final String K_TTS_NODE_ENABLE = "TTS_NODE_ENABLE";
1215    public static final String K_VOIP_NODE_ENABLE = "VOIP_NODE_ENABLE";
1216    public static final String K_ASRPP_NODE_ENABLE = "ASRPP_NODE_ENABLE";
1217    public static final String K_DMS_NODE_ENABLE = "DMS_NODE_ENABLE";
1218    public static final String K_ASR_NODE_ENABLE = "ASR_NODE_ENABLE";
1219    public static final String K_UPLOAD_NODE_ENABLE = "UPLOAD_NODE_ENABLE";
1220    public static final String K_PROCESSOR_NODE_ENABLE = "PROCESSOR_NODE_ENABLE";
1221    public static final String K_PLAYER_NODE_ENABLE = "PLAYER_NODE_ENABLE";
1222    public static final String K_RECORDER_NODE_ENABLE = "RECORDER_NODE_ENABLE";
1223    public static final String K_NLU_NODE_ENABLE = "NLU_NODE_ENABLE";
1224
1225    /**
1226     * 主唤醒是否重置 webSocket 连接 <br>
1227     * 默认 false
1228     */
1229    public static final String K_ENABLE_RESET_WEBSOCKETS_IN_MAIN_WAKEUP = "ENABLE_RESET_WEBSOCKETS_IN_MAIN_WAKEUP";
1230
1231    /**
1232     * 是否开启全局免唤醒节点功能 <br>
1233     * <p>
1234     * 取值:true or false<br>
1235     * 是否必需:否<br>
1236     * 默认值:false
1237     */
1238    public static final String K_GLOBAL_ASR_WAKEUP_NODE_ENABLE = "GLOBAL_ASR_WAKEUP_NODE_ENABLE";
1239
1240    /**
1241     * 配置全局免唤醒节点功能可以通过的技能id,默认为 null 表示所有的技能id都可通过 <br>
1242     * <p>
1243     * 取值:JSONArray 字符串,例如 ["34223","1515"]<br>
1244     * 是否必需:否<br>
1245     * 默认值:null
1246     */
1247    public static final String K_GLOBAL_ASR_WAKEUP_SKILL_ID = "GLOBAL_ASR_WAKEUP_SKILL_ID";
1248
1249    /**
1250     * 是否开启声纹功能 <br>
1251     * <p>
1252     * 取值:true or false<br>
1253     * 是否必需:否<br>
1254     * 默认值:false
1255     */
1256    public static final String K_VPRINT_ENABLE = "VPRINT_ENABLE";
1257
1258    /**
1259     * 是否在唤醒中使用声纹判断 <br>
1260     * 需开启 K_VPRINT_ENABLE
1261     * <p>
1262     * 取值:true or false<br>
1263     * 是否必需:否<br>
1264     * 默认值:false
1265     */
1266    public static final String K_USE_VPRINT_IN_WAKEUP = "USE_VPRINT_IN_WAKEUP";
1267
1268    /**
1269     * 声纹资源绝对路径 <br>
1270     * <p>
1271     * 取值:绝对路径字符串<br>
1272     * 是否必需:否<br>
1273     * 默认值:内置资源
1274     */
1275    public static final String K_VPRINT_BIN = "VPRINT_BIN";
1276
1277    /**
1278     * 降噪资源的绝对路径<br>
1279     * <p>
1280     * 取值:绝对路径字符串<br>
1281     * 是否必需:否<br>
1282     * 默认值:内置资源
1283     */
1284    @Deprecated
1285    public static final String K_NR_BIN = "NR_BIN";
1286
1287    /**
1288     * 唤醒资源的绝对路径<br>
1289     * <p>
1290     * 取值:绝对路径字符串<br>
1291     * 是否必需:否<br>
1292     * 默认值:内置资源
1293     */
1294    public static final String K_WAKEUP_BIN = "WAKEUP_BIN";
1295
1296    /**
1297     * 增强唤醒的asr资源的绝对路径<br>
1298     * <p>
1299     * 取值:绝对路径字符串<br>
1300     * 是否必需:否<br>
1301     * 默认值:内置资源
1302     */
1303    public static final String K_INCREMENT_WAKEUP_BIN = "INCREMENT_WAKEUP_BIN";
1304
1305    /**
1306     * 增强唤醒的asr的是否使用 Filler
1307     */
1308    public static final String K_INCREMENT_WAKEUP_FILLER_ENABLE = "INCREMENT_WAKEUP_FILLER_ENABLE";
1309
1310    /**
1311     * 增强唤醒的asr的 Filler 的 惩罚分数
1312     */
1313    public static final String K_INCREMENT_WAKEUP_FILLER_PENALTY_SCORE = "INCREMENT_WAKEUP_FILLER_PENALTY_SCORE";
1314    /**
1315     * 设置vad的pauseTime
1316     */
1317    public static final String K_INCREMENT_WAKEUP_VAD_PAUSETIME = "INCREMENT_WAKEUP_VAD_PAUSETIME";
1318    /**
1319     * 就近唤醒mds资源的绝对路径<br>
1320     * <p>
1321     * 取值:绝对路径字符串<br>
1322     * 是否必需:否<br>
1323     * 默认值:内置资源
1324     */
1325    public static final String K_NEAR_WAKEUP_MDS_BIN = "NEAR_WAKEUP_MDS_BIN";
1326
1327    /**
1328     * 就近唤醒决策窗口期 <br>
1329     * 修改之后会影响决策速度,取值越小,唤醒结果抛出越早,但是误唤醒概率越大 <br>
1330     * 默认是350 <br>
1331     * 单位:ms <br>
1332     */
1333    public static final String K_NEAR_WAKEUP_WKP_WND = "NEAR_WAKEUP_WKP_WND";
1334
1335    /**
1336     * 就近唤醒防抖窗口期 <br>
1337     * 用来解决在K_NEAR_WAKEUP_WKP_WND窗口期之外误唤醒,取值越大,误唤醒概率越小,但是会导致唤醒延迟越大 <br>
1338     * 默认是450 <br>
1339     * 单位:ms <br>
1340     */
1341    public static final String K_NEAR_WAKEUP_DEBOUNCE_WND = "NEAR_WAKEUP_DEBOUNCE_WND";
1342
1343    /**
1344     * 是否保存唤醒成功的音频<br>
1345     * <p>
1346     * 取值:true or false<br>
1347     * 是否必需:否<br>
1348     * 默认值:false
1349     */
1350    @Deprecated
1351    public static final String K_WAKEUP_PCM = "WAKEUP_PCM";
1352
1353    /**
1354     * OneShot配置<br>
1355     * <p>
1356     * 取值:毫秒<br>
1357     * 若MIDTIME为0 and ENDTIME为0,唤醒后进入识别;若VAD检测超时,则直接退出对话<br>
1358     * 若MIDTIME为0 and ENDTIME不为0,唤醒后进入识别;若ENDTIME超时,则直接退出对话<br>
1359     * 若MIDTIME不为0 and ENDTIME为0,唤醒后进入识别;若MIDTIME超时,则播放欢迎语,继续识别(默认)<br>
1360     * 若MIDTIME不为0 and ENDTIME不为0,唤醒后进入识别;若MIDTIME超时,则播放欢迎语,继续识别,若ENDTIME超时,则直接退出对话<br>
1361     * 是否必需:否<br>
1362     * 默认值:MIDTIME=500ms,ENDTIME=0ms
1363     */
1364    public static final String K_ONESHOT_MIDTIME = "ONESHOT_MIDTIME";
1365    public static final String K_ONESHOT_ENDTIME = "ONESHOT_ENDTIME";
1366    /**
1367     * 云端oneshot方案配置文件
1368     * {
1369     *     "enableOneshot":true,
1370     *     keepListening:    非oneshot情况下直接进入监听状态,此模式下会将vad.end之后缓存的音频送vad, 这种模式下不会丢音频
1371     *     useGreeting:      非oneshot情况下播报唤醒欢迎语,此模式下不会送vad之后的缓存音频到vad, 这种模式下会丢vad.end之后的有效音频
1372     *     "oneshotType":"keepListening",
1373     *     "cacheWakeupTime":1500
1374     *  }
1375     */
1376    public static final String K_CLOUD_ONESHOT_CONFIG = "CLOUD_ONESHOT_CONFIG";
1377
1378    /**
1379     * 连接指定产品版本的对话服务<br>
1380     * <p>
1381     * 取值:版本号字符串<br>
1382     * 是否必需:否<br>
1383     * 默认值:本地最新版本
1384     */
1385    public static final String K_PRODUCT_VERSION = "PRODUCT_VERSION";
1386
1387    /**
1388     * 预置本地识别资源,可参见net.bin<br>
1389     * <p>
1390     * 取值:资源全路径<br>
1391     * 是否必需:否<br>
1392     * 默认值:nil
1393     */
1394    public static final String K_CUSTOM_ASR_NETBIN = "CUSTOM_ASR_NETBIN";
1395
1396    /**
1397     * 预置本地识别资源,可参见duicore ngram.bin<br>
1398     * <p>
1399     * 取值:资源全路径<br>
1400     * 是否必需:否<br>
1401     * 默认值:nil
1402     */
1403    public static final String K_CUSTOM_ASR_BIN = "CUSTOM_ASR_BIN";
1404
1405    /**
1406     * 更新成功后是否重新load lasa文件<br>
1407     * <p>
1408     * 取值:true/false<br>
1409     * 是否必需:否<br>
1410     * 默认值:false
1411     */
1412    static final String K_ENABLE_RELOAD_LASA_SO = "ENABLE_RELOAD_LASA_SO";
1413
1414    /**
1415     * 优化gram编译速度,需要保证 dui 控制台每个技能语义槽的必须选项勾选,符合 net.bin 扩展要求<br>
1416     * <p>
1417     * 取值:true false<br>
1418     * 是否必需:否<br>
1419     * 默认值:nil
1420     */
1421    public static final String K_USE_GRAM_BUILD_OPT = "USE_GRAM_BUILD_OPT";
1422
1423    /**
1424     * 此配置外部调用作废,如需要动态修改端口号可配置: K_ENABLE_DYNAMIC_PORT, 并在初始化成功的回调中通过 DDS.BUS_SERVER_ADDR 获取当前使用的端口号
1425     * <p>
1426     * SDK 通信地址<br>
1427     * <p>
1428     * 取值:ip:port<br>
1429     * SDK初始化过程中出现持续的错误日志"connection confused"时,可尝试更改通信地址解决<br>
1430     * 是否必需:否<br>
1431     * 默认值:127.0.0.1:50001
1432     */
1433    static final String K_LBRIDGE_ADDR = "LBRIDGE_ADDR";
1434
1435    /**
1436     * 弱网环境配置,如使用的是弱网环境,则配置为true
1437     * <br>
1438     * <p>
1439     * 取值:true或者false<br>
1440     * 是否必需:否<br>
1441     * 默认值:false
1442     */
1443    static final String K_USE_WEAK_NETWORK = "USE_WEAK_NETWORK";
1444
1445    /**
1446     * 是否使用性别识别<br>
1447     * <p>
1448     * 取值:true或者false<br>
1449     * 是否必需:否<br>
1450     * 默认值:false
1451     */
1452    public static final String K_USE_GENDER = "USE_GENDER";
1453
1454    /**
1455     * 是否使用年龄识别<br>
1456     * <p>
1457     * 取值:true或者false<br>
1458     * 是否必需:否<br>
1459     * 默认值:false
1460     */
1461    public static final String K_USE_AGE = "USE_AGE";
1462
1463    /**
1464     * 是否使用情绪识别<br>
1465     * <p>
1466     * 取值:true或者false<br>
1467     * 是否必需:否<br>
1468     * 默认值:false
1469     */
1470    public static final String K_USE_EMOTION = "USE_EMOTION";
1471
1472    /**
1473     * 识别完成是否播报提示音<br>
1474     * <p>
1475     * 取值:true或者false<br>
1476     * 是否必需:否<br>
1477     * 默认值:false
1478     */
1479    public static final String K_ASR_TIPS = "ASR_TIPS";
1480
1481    /**
1482     * VAD资源的磁盘绝对路径,比如/sdcard/vad.bin   <br>
1483     * 商务定制版VAD资源的路径。如果开发者对VAD有更高的要求,请联系商务申请定制VAD资源。
1484     * <p>
1485     * 取值:绝对路径的字符串<br>
1486     * 是否必需:否<br>
1487     * 默认值:内置通用VAD资源
1488     */
1489    public static final String K_VAD_BIN = "VAD_BIN";
1490
1491    /**
1492     * 识别过程中是否响应唤醒<br>
1493     * <p>
1494     * 取值:true或者false<br>
1495     * 是否必需:否<br>
1496     * 默认值:false(识别过程中会响应唤醒)
1497     */
1498    public static final String K_NOWAKEUP_WHEN_ASR = "NOWAKEUP_WHEN_ASR";
1499
1500    /**
1501     * nativeApi超时时间<br>
1502     * <p>
1503     * 取值:毫秒时间<br>
1504     * 是否必需:否<br>
1505     * 默认值:10000<br>
1506     */
1507    public static final String K_NATIVEAPI_TIMEOUT = "TIMEOUT_NATIVEAPI";
1508
1509    /**
1510     * 服务器下发 nativeApi 后,如果没有注册 nativeApi 回调,
1511     * 会直接回报错误给服务器,之后服务器再下发这个错误,对话可以加上播报,如果不配置则不播报
1512     * <p>
1513     * 取值:播报提示<br>
1514     * 默认值:空,即不播报
1515     * </p>
1516     */
1517    public static final String K_NATIVEAPI_NO_SUBSCRIBER_TIP = "NATIVEAPI_NO_SUBSCRIBER_TIP";
1518
1519    /**
1520     * 对话响应超时时间<br>
1521     * <p>
1522     * 取值:毫秒时间<br>
1523     * 是否必需:否<br>
1524     * 默认值:10000<br>
1525     * @see DDSConfig#K_ENABLE_QSG_DM_TIMEOUT 全双工需要该配置开启
1526     */
1527    public static final String K_DM_TIMEOUT = "TIMEOUT_DM";
1528
1529    /**
1530     * 开启全双工对话响应超时时间<br>
1531     * <p>
1532     * 取值:毫秒时间<br>
1533     * 是否必需:否<br>
1534     * 默认值:false<br>
1535     */
1536    public static final String K_ENABLE_QSG_DM_TIMEOUT = "ENABLE_QSG_DM_TIMEOUT";
1537
1538    /**
1539     * 离线语义超时时间<br>
1540     * <p>
1541     * 取值:毫秒时间<br>
1542     * 是否必需:否<br>
1543     * 默认值:1000<br>
1544     */
1545    public static final String K_NLU_TIMEOUT = "NLU_TIMEOUT";
1546
1547    /**
1548     * 云端建连超时时间<br>
1549     * <p>
1550     * 取值:true or false<br>
1551     * 是否必需:否<br>
1552     * 默认值:false
1553     */
1554    public static final String K_WEBSOCKET_TIMEOUT = "PING_TIMEOUT";
1555
1556    /**
1557     * 音频焦点处理模式<br>
1558     * <p>
1559     * 取值:internal or external<br>
1560     * internal:由SDK内部处理音频焦点的获取与释放<br>
1561     * external:由外部根据对话状态及TTS播报状态处理对话及TTS等的焦点问题,SDK不再获取或者释放焦点<br>
1562     * 是否必需:否<br>
1563     * 默认值:internal
1564     */
1565    public static final String K_AUDIO_FOCUS_MODE = "AUDIO_FOCUS_MODE";
1566
1567    /**
1568     * SDK初始化超时时间,单位秒<br>
1569     * <p>
1570     * 是否必需:否<br>
1571     * 默认值:60<br>
1572     */
1573    public static final String K_INIT_TIMEOUT = "INIT_TIMEOUT";
1574
1575    /**
1576     * 是否支持本地识别增量更新
1577     * 支持: true
1578     * 不支持:false
1579     * 默认值:false
1580     */
1581    public static final String K_SUPPORT_INCREMENT_WAKEUP = "SUPPORT_INCREMENT_WAKEUP";
1582
1583    static final String K_CLOSE_TIPS = "CLOSE_TIPS";
1584
1585    public static final String K_CUSTOM_NATIVEPATH = "CUSTOM_NATIVEPATH";
1586
1587    /**
1588     * 全双工中关闭过滤消息的提示音<br>
1589     * <p>
1590     * 取值:true or false<br>
1591     * 是否必需:否<br>
1592     * 默认值:false<br>
1593     */
1594    public static final String K_FULLDUPLEX_CLOSE_DISCARD_TIPS = "FULLDUPLEX_CLOSE_DISCARD_TIPS";
1595
1596    /**
1597     * 云端asr++参数,设置为true后云端识别返回性别/年龄/情绪等字段<br>
1598     * <p>
1599     * 取值:true or false<br>
1600     * 是否必需:否<br>
1601     * 默认值:false<br>
1602     */
1603    public static final String K_ENABLE_CLOUD_ASRPP = "ENABLE_CLOUD_ASRPP";
1604
1605    /**
1606     * 离线ASR支持指定自定义技能优先级
1607     * <p>
1608     * 取值:string skillID:2021031600000058
1609     * 是否必须 :否 <br>
1610     * 默认值: ""
1611     */
1612    public static final String K_BUILTIN_SEMANTIC_SKILLID = "BUILTIN_SEMANTIC_SKILLID";
1613
1614    /**
1615     * 非对话过程中不feed可见即可说引擎,优化可见即可说引擎cpu占用
1616     * <p>
1617     * 取值:true/false
1618     * 是否必须 :否 <br>
1619     * 默认值: false
1620     */
1621    public static final String K_DISABLE_HOTWORD_FEED_PCM = "DISABLE_HOTWORD_FEED_PCM";
1622
1623    /***
1624     *   <p>
1625     *   取值:true or false<br>
1626     *   是否必需:否<br>
1627     *   默认值:false<br>
1628     */
1629    public static final String K_ENABLE_POSITIONING_MODE_UNDER_DELAY_LISTNING = "K_ENABLE_POSITIONING_MODE_UNDER_DELAY_LISTNING";
1630
1631    /**
1632     * 使用本地音频服务通道,开通后部分音频不再走bus通道<br>
1633     * <p>
1634     * 取值:true or false<br>
1635     * 是否必需:否<br>
1636     * 默认值:false<br>
1637     */
1638    public static final String K_USE_LOCAL_PCM_SERVER = "USE_LOCAL_PCM_SERVER";
1639
1640    public static final String K_WAKEUP_ROLL_BACK = "WAKEUP_ROLL_BACK";
1641
1642    /**
1643     * 对话接口里是否返回 tts 的 speakUrl <br>
1644     * 默认 true
1645     * <ul>
1646     * <li>true 对话接口返回 speakUrl</li>
1647     * <li>false 对话接口不返回 speakUrl,由sdk主动使用云端tts合成</li>
1648     * </ul>
1649     */
1650    public static final String K_ENABLE_STREAM_URL = "ENABLE_STREAM_URL";
1651
1652    /**
1653     * 是否开启首字上屏的优化,使用本地识别做首字上屏操作,提高反馈时间
1654     */
1655    public static final String K_ENABLE_FIRST_WORD_OPTIMIZATION = "ENABLE_FIRST_WORD_OPTIMIZATION";
1656
1657    /**
1658     * 首字上屏时间优化资源,支持用户自定义
1659     */
1660    public static final String K_FIRST_WORD_BIN = "FIRST_WORD_BIN";
1661
1662    /**
1663     * 设置首字缓存音频长度,单位ms,类型int
1664     */
1665    public static final String K_FIRST_WORD_CACHE_LENGTH = "MAX_FIRST_WORD_CACHE_LENGTH";
1666
1667    /**
1668     * 设置执行nativeCommand或者NativeApi等阻塞操作时,丢弃对话的音频数据,防止识别结果累积上屏
1669     * 默认值:false
1670     */
1671    public static final String K_DROP_AUDIO_WHEN_NATIVE = "DROP_AUDIO_WHEN_NATIVE";
1672
1673    /**
1674     * 是否使用本地对话 <br>
1675     * 默认值:false
1676     */
1677    public static final String K_ENABLE_LOCAL_DDS = "ENABLE_LOCAL_DDS";
1678
1679    static final String K_TIPS_PATH = "TIPS_PATH";
1680
1681    /**
1682     * tts播报前添加空音频,用于规避部分机型出现爆破音 <br>
1683     * <p>
1684     * 取值:ms <br>
1685     * 是否必需:否 <br>
1686     * 默认值:0
1687     */
1688    static final String K_TTS_HEAD_NULL_WAV = "TTS_HEAD_NULL_WAV";
1689
1690    /**
1691     * tts播报尾部添加空音频,用于规避部分机型出现爆破音 <br>
1692     * <p>
1693     * 取值:ms <br>
1694     * 是否必需:否 <br>
1695     * 默认值:0
1696     */
1697    public static final String K_TTS_TAIL_NULL_WAV = "TTS_TAIL_NULL_WAV";
1698
1699    static final String K_UPDATE_DUICORE_CONFIG = "UPDATE_DUICORE_CONFIG";
1700    static final String K_UPDATE_CUSTOM_CONFIG = "UPDATE_CUSTOM_CONFIG";
1701    public static final String K_DATA_HOME = "DATA_HOME";
1702    static final String K_DDS_PROTOCOL_VERSION_CODE = "DDS_PROTOCOL_VERSION_CODE";
1703    static final String K_DDS_SDK_VERSION = "DDS_SDK_VERSION";
1704    /**
1705     * 是否开启数据更新功能 <br>
1706     * 默认 true
1707     */
1708    public static final String K_USE_UPDATE = "USE_UPDATE";
1709    /**
1710     * 是否开启大数据上传功能 <br>
1711     * 默认 true
1712     */
1713    public static final String K_USE_UPLOAD = "USE_UPLOAD";
1714    /**
1715     * 是否开启推送功能 <br>
1716     * 默认 true
1717     */
1718    public static final String K_USE_PUSH = "USE_PUSH";
1719
1720    static final String K_AUTH_PLATFORM = "AUTH_PLATFORM";
1721    static final String K_AUTH_PACKAGE_NAME = "AUTH_PACKAGE_NAME";
1722    static final String K_AUTH_SDK_NAME = "AUTH_SDK_NAME";
1723    static final String K_AUTH_SIGNATURE = "AUTH_SIGNATURE";
1724    static final String K_DEVICE_INFO = "DEVICE_INFO";
1725    static final String K_SECURITY_CODE = "S_CODE";
1726
1727    static final String K_MINIMUM_STORAGE = "MINIMUM_STORAGE";
1728
1729    /**
1730     * 是否使用系统提供的 dns 解析 <br>
1731     * 默认 false 使用思必驰提供的dns解析
1732     */
1733    public static final String K_USE_SYSTEM_DNS = "USE_SYSTEM_DNS";
1734
1735    static final String K_DNS_SERVER = "DNS_SERVER";
1736    static final String K_ENABLE_CLOUD_VAD = "ENABLE_CLOUD_VAD";//云端vad
1737    static final String K_TTS_PLAY_BEFORE_TIME = "TTS_PLAY_BEFORE_TIME";//TTS播放前延迟时间
1738    static final String K_TTS_PLAY_AFTER_TIME = "TTS_PLAY_AFTER_TIME";//TTS结束后延迟时间
1739
1740    static final String K_LOGID_WAKEUP = "LOGID_WAKEUP";//唤醒数据上报log id
1741
1742    static final String K_USE_LDM_GRAM = "USE_LDM_GRAM";
1743
1744    static final String K_OPT_ONESHOT_DROP_WORD = "OPT_ONESHOT_DROP_WORD";// 开启oneshot 模式下云端识别唤醒词的优化,你好小驰,好小驰,小驰, 默认关闭
1745
1746    static final String K_ENABLE_DM_STREAM_DISPLAY = "ENABLE_DM_STEAM_DISPLAY";
1747
1748    public static final String K_FREE_DIALECT_PARAM = "FREE_DIALECT_PARAM";
1749
1750    /**
1751     * 英文转大写
1752     * <p>
1753     * 取值:true或者false<br>
1754     * 是否必需:否<br>
1755     * 默认值:false
1756     */
1757    public static final String K_ENABLE_REC_UPPERCASE = "ENABLE_REC_UPPERCASE";
1758
1759    public Map<String, String> map = new HashMap<>();
1760    private ConfigCheck mConfigCheck = new ConfigCheck();
1761
1762    /**
1763     * DDSConfig构造方法
1764     */
1765    public DDSConfig() {
1766        addConfig(K_DDS_PROTOCOL_VERSION_CODE, Version.DDS_PROTOCOL_VERSION_CODE);
1767        addConfig(K_DDS_SDK_VERSION, Version.DDS_SDK_VERSION_NAME);
1768        addConfig(K_DNS_SERVER, DDS.DNS_SERVER);
1769        addConfig(K_AUTH_TYPE, AuthType.PROFILE);
1770        addConfig(K_USE_LDM_GRAM, "true");
1771        addConfig(K_ENABLE_STREAM_URL, "true");
1772        addConfig(K_SUPPORT_INCREMENT_WAKEUP, "false");
1773        addConfig(K_OPT_ONESHOT_DROP_WORD, "true");
1774
1775        addConfig(K_USE_PUSH, "false");
1776        addConfig(K_USE_UPDATE, "false");
1777        addConfig(K_USE_UPLOAD, "true");
1778        addConfig(K_USER_ID, "USER2021ID");
1779        addConfig(K_USE_VAD_IN_FULLDUPLEX, "true");
1780        addConfig(K_ENABLE_QSG_IN_LDM,"true");
1781        addConfig(K_TTS_CACHE, "true");
1782        addConfig(K_MESSAGE_QUEUE_MAX_SIZE, 500);
1783
1784        addConfig(K_WAKEUP_NODE_ENABLE, "true");  //开启唤醒节点
1785        addConfig(K_VAD_NODE_ENABLE, "true");
1786        addConfig(K_TTS_NODE_ENABLE, "true");
1787        addConfig(K_VOIP_NODE_ENABLE, "true");
1788        addConfig(K_ASRPP_NODE_ENABLE, "true");
1789        addConfig(K_DMS_NODE_ENABLE, "true");
1790        addConfig(K_ASR_NODE_ENABLE, "true");
1791        addConfig(K_UPLOAD_NODE_ENABLE, "true");
1792        addConfig(K_PROCESSOR_NODE_ENABLE, "true");
1793        addConfig(K_PLAYER_NODE_ENABLE, "true");
1794        addConfig(K_RECORDER_NODE_ENABLE, "true");
1795        addConfig(K_NLU_NODE_ENABLE, "true");
1796
1797        addConfig(K_SOCKET_NODE_ENABLE, "false"); //默认关闭socket节点
1798        addConfig(K_H5_NODE_ENABLE, "false"); //关闭H5节点
1799
1800        addConfig(K_USE_SYSTEM_DNS, "true");
1801    }
1802
1803    /**
1804     * 设置config
1805     *
1806     * @param key   key
1807     * @param value value
1808     * @return DDSConfig DDSConfig
1809     */
1810    public DDSConfig addConfig(final String key, final String value) {
1811        map.put(key, value);
1812        return this;
1813    }
1814
1815    /**
1816     * 设置config
1817     *
1818     * @param key   key
1819     * @param value value
1820     * @return DDSConfig DDSConfig
1821     */
1822    public DDSConfig addConfig(final String key, final int value) {
1823        map.put(key, String.valueOf(value));
1824        return this;
1825    }
1826
1827    /**
1828     * 设置config
1829     *
1830     * @param key   key
1831     * @param value value
1832     * @return DDSConfig DDSConfig
1833     */
1834    public DDSConfig addConfig(final String key, final long value) {
1835        map.put(key, String.valueOf(value));
1836        return this;
1837    }
1838
1839    /**
1840     * 设置config
1841     *
1842     * @param key   key
1843     * @param value value
1844     * @return DDSConfig DDSConfig
1845     */
1846    public DDSConfig addConfig(final String key, final float value) {
1847        map.put(key, String.valueOf(value));
1848        return this;
1849    }
1850
1851    /**
1852     * 获取config中key对应的value
1853     *
1854     * @param key key
1855     * @return String key对应的值
1856     */
1857    public String getConfig(final String key) {
1858        return map.get(key);
1859    }
1860
1861    /**
1862     * 获取config中是否包含key
1863     *
1864     * @param key key
1865     * @return boolean true:包含 false:不包含
1866     */
1867    public boolean containsConfig(String key) {
1868        return map.containsKey(key);
1869    }
1870
1871    /**
1872     * toString
1873     *
1874     * @return String String
1875     */
1876    @Override
1877    public String toString() {
1878        StringBuilder sb = new StringBuilder("{\n");
1879        Iterator it = map.entrySet().iterator();
1880        while (it.hasNext()) {
1881            Map.Entry pair = (Map.Entry) it.next();
1882            sb.append(pair.getKey());
1883            sb.append("='");
1884            sb.append(pair.getValue());
1885            sb.append("';\n");
1886        }
1887        sb.append("}");
1888        return sb.toString();
1889    }
1890
1891    /**
1892     * 获取config中key对应的value
1893     *
1894     * @param key key
1895     * @return String key对应的值
1896     */
1897    public int getIntConfig(String key, int defaultValue) {
1898        String v = map.get(key);
1899        if (!TextUtils.isEmpty(v)) {
1900            try {
1901                return Integer.parseInt(v);
1902            } catch (Exception e) {
1903            }
1904        }
1905        return defaultValue;
1906    }
1907
1908    /**
1909     * 获取config中key对应的value
1910     *
1911     * @param key key
1912     * @return String key对应的值
1913     */
1914    public boolean getBooleanConfig(final String key) {
1915        return getBooleanConfig(key, false);
1916    }
1917
1918    /**
1919     * 获取config中key对应的value
1920     *
1921     * @param key key
1922     * @return String key对应的值
1923     */
1924    public boolean getBooleanConfig(String key, boolean defaultValue) {
1925        String v = map.get(key);
1926        if (!TextUtils.isEmpty(v)) {
1927            return Boolean.parseBoolean(v);
1928        }
1929        return defaultValue;
1930    }
1931
1932    /**
1933     * 检查必须的配置有没有设置
1934     *
1935     * @throws IllegalArgumentException 如果没有设置,会抛出IllegalArgumentException
1936     */
1937    public void checkConfigs() throws IllegalArgumentException {
1938        AILog.i(TAG, "checkConfigs");
1939        mConfigCheck.check();
1940        String mapStr = AIGsonUtil.getInstance().toJson(map);
1941        AILog.d(TAG, "ddsConfigJson->\n" + mapStr);
1942        String[] neededKeys = new String[]{
1943                K_DATA_HOME,
1944                K_PRODUCT_ID,
1945                K_DDS_PROTOCOL_VERSION_CODE,
1946                K_ALIAS_KEY,
1947                K_AUTH_TYPE,
1948                K_API_KEY,
1949                //K_PRODUCT_KEY,
1950                //K_PRODUCT_SECRET
1951        };
1952        for (String neededKey : neededKeys) {
1953            if (!map.containsKey(neededKey)) {
1954                AILog.i(TAG, toString());
1955                throw new IllegalArgumentException("DDS config is invalid, lost needed param:" + neededKey);
1956            }
1957        }
1958
1959        if (map.containsKey(K_CACHE_PATH) && !map.containsKey(K_CACHE_SIZE)) {
1960            AILog.i(TAG, toString());
1961            throw new IllegalArgumentException("DDS config is invalid, lost CACHE_SIZE");
1962        }
1963
1964        if (map.containsKey(K_PRODUCT_KEY) && !map.containsKey(K_PRODUCT_SECRET)) {
1965            AILog.i(TAG, toString());
1966            throw new IllegalArgumentException("DDS config is invalid, lost PRODUCT_SECRET");
1967        }
1968
1969//        if (map.containsKey(KEY_USE_LOCAL_DEVICE_NAME) && Boolean.parseBoolean(map.get(KEY_USE_LOCAL_DEVICE_NAME)) && !map.containsKey(K_DEVICE_NAME)) {
1970//            AILog.i(TAG, toString());
1971//            throw new IllegalArgumentException("DDS config is invalid, lost DEVICE_NAME");
1972//        }
1973
1974        if (map.containsKey(K_USER_ID)) {
1975            String userId = map.get(K_USER_ID);
1976            AILog.i(TAG, "USER_ID : " + userId);
1977            String encodedUserId = URLEncoder.encode(userId);
1978            map.put(K_USER_ID, encodedUserId);
1979            AILog.i(TAG, "encode USER_ID : " + encodedUserId);
1980        }
1981    }
1982
1983    public DDSConfig copyDeep() {
1984        final DDSConfig newConfig = new DDSConfig();
1985        newConfig.map = new HashMap<>(this.map);
1986        return newConfig;
1987    }
1988
1989    private class ConfigCheck {
1990        private String errTag = "DDSConfig error: ";
1991
1992        private void check() {
1993            try {
1994                checkRelation();
1995            } catch (Exception e) {
1996                com.aispeech.dui.manager.AIJavaException.printException(e);
1997            }
1998        }
1999
2000        // 检查配置之间的关联
2001        private void checkRelation() {
2002            // 声纹检查
2003            String vprintEnable = map.get(K_VPRINT_ENABLE);
2004            String useVprintInWakeup = map.get(K_USE_VPRINT_IN_WAKEUP);
2005            String vprintBin = map.get(K_VPRINT_BIN);
2006            if (!TextUtils.equals(vprintEnable, "true") && TextUtils.equals(useVprintInWakeup, "true")) {
2007                Log.e(TAG, errTag + "you must set K_VPRINT_ENABLE = true, before set K_USE_VPRINT_IN_WAKEUP!");
2008            }
2009            if (!TextUtils.equals(vprintEnable, "true") && !TextUtils.isEmpty(vprintBin)) {
2010                Log.e(TAG, errTag + "you must set K_VPRINT_ENABLE = true, before set K_VPRINT_BIN!");
2011            }
2012
2013            // 唤醒资源设置检查
2014            if (!TextUtils.isEmpty(map.get(K_MIC_ARRAY_WAKEUP_CFG))) {
2015                Log.e(TAG, errTag + "K_MIC_ARRAY_WAKEUP_CFG is Deprecated, Replaced by K_WAKEUP_BIN!");
2016            }
2017
2018            // 唤醒保存音频配置检查
2019            if (!TextUtils.isEmpty(map.get(K_WAKEUP_PCM))) {
2020                Log.e(TAG, errTag + "K_WAKEUP_PCM is Deprecated, Replaced by K_WAKEUP_DEBUG!");
2021            }
2022        }
2023    }
2024
2025}