大数跨境
0
0

【技研录】⽤scriptable+chatgpt得到⼀个免费的会说话的GPT

【技研录】⽤scriptable+chatgpt得到⼀个免费的会说话的GPT 众安科技
2023-04-27
1
导读:如何利⽤语⾳识别技术,实现与ChatGPT口语交流

写作思考 

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


本文作者 : 徐翔


往期回顾:


【声明】内容源于网络
0
0
众安科技
众安信息技术服务有限公司官方账号
内容 327
粉丝 0
众安科技 众安信息技术服务有限公司官方账号
总阅读56
粉丝0
内容327