作者:徐翔

前言

在使用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会说出答案

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐