音频播放(音乐、有声书)
651字约2分钟
2024-11-07
功能
Nodejs 代码
const config = {
gen_client_config: async (){
return {
intention: [
{
/**
* 这里使用正则匹配,你也可以使用 nlp 能力
* 返回匹配的字符串为匹配成功
*/
key: async (text = "", { llm_historys, prev_play_audio_ing }) => {
let songName = "";
// 匹配名称 :播放最后的倔强
const regex = /^(播放音乐)(.*)$/;
const match = text.match(reg)
// 判断是否要切换歌曲
const prevText = llm_historys[llm_historys.length - 2]?.content;
if (prevText && prev_play_audio_ing) {
const prevTextMatch = prevText.match(reg)
infoLog.info("用户上次说:", prevText)
// 这里要用,用户信息去请求数据,服务端应该使用用户信息去记录数据
if (
(prevTextMatch && prevTextMatch[2]) ||
(prevText === "上一曲" || prevText === "下一曲") ||
(prevText === "播放上一曲" || prevText === "播放下一曲") ||
(prevText === "上一集" || prevText === "下一集") ||
(prevText === "播放上一集" || prevText === "播放下一集")
) {
if (text === "上一曲" || text === "上一集" || text === "播放上一集" || text === "播放上一曲") {
// 返回的和 music_server 配置一样
// 请求切换接口...
return {
url: "https://xxx.mp3",
seek: 0,
message: ""
};
}
else if (text === "下一曲" || text === "下一集" || text === "播放下一集" || text === "播放下一曲") {
// 返回的和 music_server 配置一样
// 请求切换接口...
return {
url: "https://xxx.mp3",
seek: 0,
message: ""
};
}
}
}
if (match && match[2]) {
songName = match[2].replace(/(,)/g, "");
infoLog.info("音乐名称:", songName);
return songName;
}
return false;
},
// 向客户端发送的指令
instruct: "__play_music__",
message: "好的!",
/**
* 用于返回音频地址和播放进度
* seek 进度控制: (以秒为单位)
* name 是歌曲名称
* 目前只支持 mp3、wav 格式
*/
music_server: async (name, { user_config }) => {
if (name && (typeof name === "object")) {
return name;
}
// 请求音乐接口...
return {
url: "https://xxx.mp3",
seek: 0,
message: ""
};
},
/**
* 当音频结束后的回调
* 注意:这里面别把 audioInf 清空了,否则上一曲啥的就读取不到信息了
*
* @param {object} arg.break_second 停止时的进度,单位秒。也就是用户播放了到了多少秒(seek+play_time)
* @param {object} arg.play_time 实际播放音频的时间,单位秒。
* @param {object} arg.seek 音频开始播放时间,其实也就是 music_server 函数中返回的 seek 值
* @param {object} arg.start_time 开始播放音频的 Unix 毫秒数时间戳
* @param {object} arg.end_time 结束播放音频的 Unix 毫秒数时间戳
* @param {object} arg.event 结束原因: "user_break" 用户打断 | play_end 播放完毕 | foo 未知事件
*/
on_end: async (arg) => {
// 请求业务服务器保存进度信息
// ...
if (arg.event === "play_end") {
// 自动播放下一曲
// 请求音乐接口...
return {
url: "https://xxx.mp3",
seek: 0,
message: ""
};
}
}
},
]
}
}
}
视频教程
录制中...