feat: 新增 onAIReplied 提示语

This commit is contained in:
WJG 2024-05-26 22:32:16 +08:00
parent 50353e587a
commit 7ae4697574
No known key found for this signature in database
GPG Key ID: 258474EF8590014A
3 changed files with 52 additions and 20 deletions

View File

@ -34,10 +34,10 @@ export default {
// 设备唤醒指令
wakeUpCommand: [5, 3],
// 当消息以下面的关键词开头时,会调用 AI 来回复消息
callAIPrefix: ["请", "你", "傻妞"],
// 当消息中包含唤醒关键词时,会进入 AI 唤醒状态
callAIKeywords: ["请", "你", "傻妞"],
// 当消息以下面的关键词开头时,会进入 AI 唤醒状态
wakeUpKeywords: ["打开", "进入", "召唤"],
// 当消息中包含退出关键词时,会退出 AI 唤醒状态
// 当消息以下面的关键词开头时,会退出 AI 唤醒状态
exitKeywords: ["关闭", "退出", "再见"],
// 进入 AI 模式的欢迎语
onEnterAI: ["你好,我是傻妞,很高兴认识你"],
@ -45,6 +45,8 @@ export default {
onExitAI: ["傻妞已退出"],
// AI 开始回答时的提示语
onAIAsking: ["让我先想想", "请稍等"],
// AI 结束回答时的提示语
onAIReplied: ["我说完了", "还有其他问题吗"],
// AI 回答异常时的提示语
onAIError: ["啊哦,出错了,请稍后再试吧!"],
// 无响应一段时间后,多久自动退出唤醒模式(默认 30 秒)

View File

@ -126,12 +126,13 @@ main();
| `ttsCommand` | 小米音箱 TTS 指令([可在此查询](https://home.miot-spec.com) | `[5, 1]` |
| `wakeUpCommand` | 小米音箱唤醒指令([可在此查询](https://home.miot-spec.com) | `[5, 3]` |
| **speaker 其他参数(可选)** | | |
| `callAIPrefix` | 当消息以召唤关键词开头时,会调用 AI 来响应用户消息 | `["请","傻妞"]` |
| `wakeUpKeywords` | 当消息中包含唤醒关键词时,会进入 AI 唤醒状态 | `["召唤傻妞","打开傻妞"]` |
| `exitKeywords` | 当消息中包含退出关键词时,会退出 AI 唤醒状态 | `["退出傻妞","关闭傻妞"]` |
| `callAIKeywords` | 当消息以关键词开头时,会调用 AI 来响应用户消息 | `["请", "傻妞"]` |
| `wakeUpKeywords` | 当消息以关键词开头时,会进入 AI 唤醒状态 | `["召唤傻妞", "打开傻妞"]` |
| `exitKeywords` | 当消息以关键词开头时,会退出 AI 唤醒状态 | `["退出傻妞", "关闭傻妞"]` |
| `onEnterAI` | 进入 AI 模式的欢迎语 | `["你好,我是傻妞,很高兴认识你"]` |
| `onExitAI` | 退出 AI 模式的提示语 | `["傻妞已退出"]` |
| `onAIAsking` | AI 开始回答时的提示语 | `["请稍等,让我想想"]` |
| `onAIAsking` | AI 开始回答时的提示语 | `["让我先想想", "请稍等"]` |
| `onAIReplied` | AI 结束回答时的提示语 | `["我说完了", "还有其他问题吗"]` |
| `onAIError` | AI 回答异常时的提示语 | `["出错了,请稍后再试吧!"]` |
| `exitKeepAliveAfter` | 无响应一段时间后,多久自动退出唤醒模式(单位秒,默认 30 秒) | `30` |

View File

@ -15,6 +15,12 @@ export type AISpeakerConfig = SpeakerConfig & {
*
*/
onAIAsking?: string[];
/**
* AI
*
*
*/
onAIReplied?: string[];
/**
* AI
*
@ -34,7 +40,7 @@ export type AISpeakerConfig = SpeakerConfig & {
*
*
*/
callAIPrefix?: string[];
callAIKeywords?: string[];
/**
*
*
@ -90,10 +96,11 @@ export class AISpeaker extends Speaker {
switchSpeakerPrefix: string[];
onEnterAI: string[];
onExitAI: string[];
callAIPrefix: string[];
callAIKeywords: string[];
wakeUpKeywords: string[];
exitKeywords: string[];
onAIAsking: string[];
onAIReplied: string[];
onAIError: string[];
audioActive?: string;
audioError?: string;
@ -104,29 +111,32 @@ export class AISpeaker extends Speaker {
askAI,
name = "傻妞",
switchSpeakerPrefix,
callAIPrefix = ["请", "你", "傻妞"],
callAIKeywords = ["请", "你", "傻妞"],
wakeUpKeywords = ["打开", "进入", "召唤"],
exitKeywords = ["关闭", "退出", "再见"],
onEnterAI = ["你好,我是傻妞,很高兴认识你"],
onExitAI = ["傻妞已退出"],
onAIAsking = ["让我先想想", "请稍等"],
onAIReplied = ["我说完了", "还有其他问题吗"],
onAIError = ["啊哦,出错了,请稍后再试吧!"],
audioActive = process.env.AUDIO_ACTIVE,
audioError = process.env.AUDIO_ERROR,
} = config;
this.askAI = askAI;
this.name = name;
this.onAIError = onAIError;
this.onAIAsking = onAIAsking;
this.audioActive = audioActive;
this.audioError = audioError;
this.switchSpeakerPrefix =
switchSpeakerPrefix ?? getDefaultSwitchSpeakerPrefix();
this.callAIKeywords = callAIKeywords;
this.wakeUpKeywords = wakeUpKeywords;
this.exitKeywords = exitKeywords;
this.onEnterAI = onEnterAI;
this.onExitAI = onExitAI;
this.callAIPrefix = callAIPrefix;
this.onAIError = onAIError;
this.onAIAsking = onAIAsking;
this.onAIReplied = onAIReplied;
this.audioActive = audioActive;
this.audioError = audioError;
this.switchSpeakerPrefix =
switchSpeakerPrefix ?? getDefaultSwitchSpeakerPrefix();
}
async enterKeepAlive() {
@ -184,7 +194,7 @@ export class AISpeaker extends Speaker {
{
match: (msg) =>
this.keepAlive ||
this.callAIPrefix.some((e) => msg.text.startsWith(e)),
this.callAIKeywords.some((e) => msg.text.startsWith(e)),
run: (msg) => this.askAIForAnswer(msg),
},
] as SpeakerCommand[];
@ -203,16 +213,36 @@ export class AISpeaker extends Speaker {
let answer = await this.askAI?.(msg);
return { data: { answer } };
},
async (msg, data) => {
// 开始回复
if (data.answer) {
const res = await this.response({ ...data.answer });
return { data: { ...data, res } };
}
},
async (msg, data) => {
if (data.answer && data.res !== "break") {
// 回复完毕
await this.response({
text: pickOne(this.onAIReplied)!,
});
}
},
async (msg, data) => {
if (!data.answer) {
// 回答异常
await this.response({
audio: this.audioError,
text: pickOne(this.onAIError)!,
keepAlive: this.keepAlive,
});
}
},
async (msg, data) => {
if (this.keepAlive) {
// 重新唤醒
await this.wakeUp();
}
},
];
async askAIForAnswer(msg: QueryMessage) {
@ -231,7 +261,6 @@ export class AISpeaker extends Speaker {
break;
}
}
return data.answer;
}
}