×

AI Conversation Speaker aka Friend Bot:第1部分对话

消耗积分:0 | 格式:zip | 大小:0.00 MB | 2023-06-13

杨勇

分享资料个

描述

Conversational Speaker,非正式地称为“Friend Bot”,使用 Raspberry Pi 实现与 OpenAI 大型语言模型的口头对话。此实现收听语音,通过 OpenAI 服务处理对话,并做出回应。

有关用于维护对话上下文的提示引擎的更多信息,请转到此处:python typescript dotnet

有关一般提示设计的更多信息,请查看 OpenAI 关于该主题的文档:https ://beta.openai.com/docs/guides/completion/prompt-design

本项目使用 .NET 6 编写,支持 Raspberry Pi OS、Linux、macOS 和 Windows。

构建时间:30分钟

阅读时间:15分钟

硬件:~$50

软件:

Azure 认知语音服务,免费层支持每月 5 个免费音频小时和 1 个并发请求(Azure 认知服务定价)。新的 Azure 帐户包含 200 美元的免费额度,可在前 30 天内使用。

  • OpenAI、Davinci 模型(最强大):0.02 美元/~750 个单词,Curie 模型(仍然相当不错,响应时间更快):0.002 美元/~750 个单词。新的 OpenAI 帐户包含 18 美元的免费信用额度,可在您的前 90 天内使用。更多详情:https ://openai.com/api/pricing/

设置

您将需要一个用于语音转文本和文本转语音的 Azure 认知服务实例,以及一个用于对话的 OpenAI 帐户。您几乎可以在任何平台上运行该软件,但让我们先从设置 Raspberry Pi 开始……

树莓派

如果您是 Raspberry Pis 的新手,现在是查看入门的好时机。

操作系统

1. 将 SD 卡插入您的 PC

2. 转到https://www.raspberrypi.com/software/然后下载并运行 Raspberry Pi Imager

3. 单击“选择操作系统”并选择默认的树莓派操作系统(32 位)。

4.点击`Choose Storage`,选择SD卡

5. 点击`Write`,等待镜像完成。

6. 将 SD 卡插入树莓派,连接键盘、鼠标和显示器。

7. 完成初始设置,确保配置 Wi-Fi。

USB 扬声器/麦克风

1. 如果您还没有插入 USB 扬声器/麦克风

2. 右键单击​​屏幕右上角的音量图标,确保选择了 USB 设备。

3. 右键单击​​屏幕右上角的麦克风图标,确保选择了 USB 设备。

蔚蓝

对话式演讲者使用 Azure 认知服务进行语音转文本和文本转语音。以下是创建 Azure 帐户和 Azure 认知服务实例的步骤。

创建一个 Azure 帐户(如果您还没有)

1. 在 Web 浏览器中,导航至https://aka.ms/friendbot/azure并单击Try Azure for Free

2. 单击Start Free开始创建免费的 Azure 帐户。

3. 使用您的 Microsoft 或 GitHub 帐户登录。

4. 登录后,系统会提示您输入一些信息。

5. 即使这是一个免费帐户,Azure 仍然需要信用卡信息。除非您稍后更改设置,否则不会向您收费。

6. 帐户设置完成后,导航至https://aka.ms/friendbot/azureportal。

创建 Azure 认知服务实例

1. 在https://aka.ms/friendbot/azureportal登录你的帐户。

2. 在顶部的搜索栏中,输入Cognitive Services并在下方Marketplace选择Cognitive Services(可能需要一些时间来填充)。

3. 确认选择了正确的订阅,然后在Resource Group选择下Create New输入资源组名称(例如conv-speak-rg

4. 为您的 Azure 认知服务实例选择区域和名称(例如my-conv-speak-cog-001)。我建议使用美国东部、西欧或东南亚,因为这些地区往往支持最多的功能。

5. 点击 ,Review + Create验证通过后点击Create

6. 部署完成后,您可以单击Go to resource以查看您的 Azure 认知服务资源。

7. 在左侧导航栏中,选择Keys and EndpointResource Management复制两个认知服务密钥中的任意一个并保存在安全位置以备后用。

Windows 11 用户:如果应用程序在调用文本到语音 API 时停滞,请确保您已应用所有当前安全更新(链接)。

开放人工智能

对话式演讲者使用 OpenAI 的模型进行友好对话。以下是创建新帐户和访问 AI 模型的步骤。

创建一个 OpenAI 帐户(如果您还没有)

1. 在网络浏览器中,导航至https://openai.com/api并单击“注册”

2. 您可以使用谷歌账户、微软账户或邮箱创建新账户。

3. 完成注册过程(例如,创建密码、验证您的电子邮件等)。如果您是 OpenAI 的新手,请查看使用指南 ( https://beta.openai.com/docs/usage-guidelines )。

4. 在右上角点击您的账户,然后点击View API keys

5. 单击+ Create new secret key,复制并保存在安全位置以备后用。

  • 如果您想直接使用大型语言模型,请查看页面顶部的“游乐场”。

代码

获取并配置代码。

1. 在 Raspberry Pi 或您的 PC 上,打开命令行终端

2.安装.NET 6 SDK

  • 对于树莓派和 Linux:
curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --channel 6.0

安装完成后(可能需要几分钟),将 dotnet 添加到命令搜索路径

echo 'export DOTNET_ROOT=$HOME/.dotnet' >> ~/.bashrc
echo 'export PATH=$PATH:$HOME/.dotnet' >> ~/.bashrc
source ~/.bashrc

您可以通过检查版本来验证是否已成功安装 dotnet

dotnet --version

3. 克隆 repo 并签出适当的分支。

git clone --recursive --branch hackster-tutorial-1 https://github.com/microsoft/conversational-speaker.git

4. 设置您的 API 密钥,将 {MyCognitiveServicesKey} 替换为您的 Azure 认知服务密钥,将 {MyCognitiveServiceRegion} 替换为您的 Azure 认知服务区域(例如,EastUS),并将 {MyOpenAIKey} 替换为上述部分中的 OpenAI API 密钥。

cd ~/conversational-speaker/src/ConversationalSpeaker
dotnet user-secrets set "AzureCognitiveServices:Key" "{MyCognitiveServicesKey}"
dotnet user-secrets set "AzureCognitiveServices:Region" "{MyCognitiveServiceRegion}"
dotnet user-secrets set "OpenAI:Key" "{MyOpenAIKey}"

5. 构建并运行代码!

cd ~/conversational-speaker/src/ConversationalSpeaker
dotnet build
dotnet run

(可选)将应用程序设置为开机启动

Raspberry Pi 启动时有几种方法可以运行程序。下面是我的首选方法,它会在可见的终端窗口中自动运行应用程序。这使您不仅可以看到输出,还可以通过单击终端窗口并按 CTRL+C 来取消应用程序。

1.创建文件/etc/xdg/autostart/friendbot.desktop

sudo nano /etc/xdg/autostart/friendbot.desktop

2.将以下内容放入文件中

[Desktop Entry]
Exec=lxterminal --command "/bin/bash -c '~/.dotnet/dotnet run --project ~/conversational-speaker/src/ConversationalSpeaker; /bin/bash'"

按 CTRL+O 保存文件,按 CTRL+X 退出。这将在 Raspberry Pi 完成启动后在终端窗口中运行应用程序。

3. 要测试更改,您只需运行即可重新启动

reboot

怎么运行的

有关如何使用代码字的更多详细信息,请查看README

用法

  • 建议以“你好,我叫乔丹,住在华盛顿州雷德蒙德”开头来设置上下文。
  • 看看~/conversational-speaker/src/ConversationalSpeaker/configuration.json.
  • 更改 AI 的名称 ( PromptEngine:OutputPrefix),
  • 改变 AI 的声音 ( AzureCognitiveServices:SpeechSynthesisVoiceName)
  • 改变 AI 的性格 ( PromptEngine:Description)
  • 对于中短对话,提示引擎的当前状态通常保持稳定。然而,有时在较长的对话中,人工智能可能不仅会开始回应它自己的回应,还会回应它认为你接下来可能会说的话。

下次...

在下一个教程中,我们将向我们的会话扬声器添加唤醒阶段(例如“嘿,计算机”)。

玩得开心!


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'AI Conversation Speaker aka Friend Bot:第1部分对话',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);