作者:徐翔
前言
在使用ChatGPT时,我们经常遇到需要双手不能释放的情境,这使得我们无法充分发挥ChatGPT的文本输入和输出功能。 然而,随着技术的不断进步,语音识别技术越来越精准和便捷,这为我们实现与ChatGPT的无缝交互提供了可能。
利用语音识别技术,我们可以通过口述提问的方式与ChatGPT进行交流,而无需通过文本输入。语音识别软件会将我们的提 问转化为文本,并将其发送给ChatGPT进行处理。最后,ChatGPT的回答可以通过语音识别软件以语音的形式播报出来, 从而实现真正的语音交互。这样一来,在需要双手不能自由操作的情况下,我们仍能够与ChatGPT进行无缝交流,提高交互 效率,享受更加愉悦的交互体验。
认识Scriptable
Siri自带语音识别的能力,我们可以通过Scriptable调用Siri的语音识别来实现语音交互。Scriptable是一个iOS脚本工具, 允许我们使用Swift或JavaScript开发小工具和Applets。它提供了丰富的API,能实现定时任务、网络请求、文件操作以及 UI展示等功能。我们将使用Scriptable来实现与Siri的交互和ChatGPT的请求。
下载并打开 scriptable 点击右上方“加号”新建一个项目并命名为SiriChatGPT
本次我们做一个小尺寸的小组件
function createWidget(img) { //
定义一个创建组件的函数
const w = new ListWidget();
w.addSpacer();
w.spacing = 5;
const bgColor = new LinearGradient(); //
定义一个渐变背景
bgColor.colors = [new Color("#333"), new Color("#333")]; //
设置渐变颜色
bgColor.locations = [0.0, 1.0]; //
设置渐变位置
if (config.widgetFamily == "small" || config.widgetFamily === undefined) { //
如果是小组件
w.backgroundImage = img; //
设置背景图片
w.presentSmall(); //
显示小组件
}
return w;
}
我们定义了一个创建组件的函数createWidget,通过传入img参数可以设置组件的背景图片。
根据config.widgetFamily获取到组件当前渲染的尺寸,widgetFamily: small(小)、medium(中)、large(大)
try {
var img = await new Request("https://n.sinaimg.cn/sinakd20230202s/348/w184h164/20230202/ad51-f00728753f8f5e1c53c10ae5dd1cf3de.png").loadImage();
} catch (err) {
throw new Error("
图片地址不支持
");
}
let widget = createWidget(img);
通过Request方法加载一张图片做为组件的logo图片并展示,通过try来捕获加载错误,并调用createWidget方法将图片传给widget,要想让siri发声。
读
要用siri将固定的内容借siri的能力,将数据读出通过调用小组件暴露出来的Speech API。
await Speech.speak('
请说出你的问题
');
直接调用Speech.speak的命令,返回是一个promise 所以需要在前加一个await.
Speech有个需要注意的是他必须依赖于siri环境,不然会报错“命令不支持”
完成了小组件的创建和语音提示后,接下来就是实现与ChatGPT的交互了。这里我们需要用到OpenAI提供的API,将语音转换为文本,再将文本传给ChatGPT进行处理,最后将ChatGPT的回答转换为语音播放出来。
听
要将我们口述的问题,给到Siri并进行语音转文字的供给chatGPT识别。Dictation API 提供一个异步的start方法
let result = await Dictation.start();
通过调用start的方法,将会新开一个对话框,我们可以尝试说写话,将可以看见话被转为文字并显示在对话框内
以这为例,咨询了"红烧肉的做法"完成后点击"Done".
思
完成了小组件的创建和语音提示后,接下来就是实现与ChatGPT的交互了。这里我们需要用到OpenAI提供的API,将语音转换为文本,再将文本传给ChatGPT进行处理,最后将ChatGPT的回答转换为语音播放出来。
async function queryOpenAI(text) {
let req = new Request("https://api.openai.com/v1/engines/davinci-codex/completions");
req.headers = {
"Authorization": "Bearer " + apiKey,
"Content-Type": "application/json",
};
req.method = "POST";
req.body = JSON.stringify({
prompt: text,
max_tokens: 2048,
temperature: 0.7,
n: 1,
stream: false,
stop: "\n",
});
let result = await req.loadJSON();
return result.choices[0].text;
}
将通过Dictation获取识别的文案,传给查询接口并向openai发出请求。
apiKey请替换为自己的chatgpt Api key即可
代码如下
//
如果是在
Siri
中运行,则使用语音提示用户说出问题
if(config.runsWithSiri) {
await Speech.speak('
请说出你的问题
');
}
//
如果是在应用中运行,则调用
Dictation.start()
方法开始语音识别,并将识别结果发送到服
if (config.runsInApp) {
let result = await Dictation.start(); //
开启识别
let r = await _post({ //
发送识别的文案
url: 'chat.openapi.com/request',
body: JSON.stringify({
value: result,
}),
headers: {
"Content-Type": "application/json",
}
})
await Speech.speak(r.response); //
朗读
chatGPT
的返回内容
}
Script.setWidget(widget);
Script.complete();
将小组件安装到Mac
打开scriptable左下方的settings按钮
打开设置面板,点击"Add to Siri"按钮,更改语音指令 "嘿 Siri 快出来"好了完成了组件和指令部分
点击"编辑小组件"
将"Run Script"添加到桌面小组件内
点击新加入的组件
将Script选取为我们刚开发的 SiriChatGPT组件
至此完成了所有开发和设置,我们可以试这玩一下了,对着Mac说一句"嘿 Siri 快出来"说出你的问,就会听到Siri会说出答案