www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 工業(yè)控制 > 電路設(shè)計(jì)項(xiàng)目集錦
[導(dǎo)讀]在這個(gè)項(xiàng)目中,我將帶你通過使用樹莓派和雙子座制作一個(gè)神奇的鏡子。我特別使用Gemini Live API,它目前處于預(yù)覽狀態(tài),所以如果你在發(fā)布后一段時(shí)間查看本教程,可能需要稍后更新,但沒關(guān)系!玩得開心,我希望你能學(xué)到一些有用的東西。

在這個(gè)項(xiàng)目中,我將帶你通過使用樹莓派和雙子座制作一個(gè)神奇的鏡子。我特別使用Gemini Live API,它目前處于預(yù)覽狀態(tài),所以如果你在發(fā)布后一段時(shí)間查看本教程,可能需要稍后更新,但沒關(guān)系!玩得開心,我希望你能學(xué)到一些有用的東西。

這個(gè)項(xiàng)目也使用了新的JavaScript/TypeScript SDK,所以你可以在這里找到擴(kuò)展項(xiàng)目的文檔。

初始硬件設(shè)置

這個(gè)項(xiàng)目是基于這個(gè)魔鏡項(xiàng)目。雖然我非常接近他們建造鏡子的方式,但我確實(shí)做了一些不同的事情,我將在這里介紹。也就是說,由于顯示器的尺寸、可用的材料和工具以及其他一些因素,你如何構(gòu)建鏡子很有可能會(huì)有所不同,所以這更多的是關(guān)于我如何構(gòu)建鏡子的解釋,希望它是對(duì)原始(偉大)教程的有益補(bǔ)充。

這里是我在這個(gè)項(xiàng)目中使用的材料列表(我將在亞馬遜上鏈接到它們,盡管取決于你什么時(shí)候讀到這篇文章,這些鏈接可能不再有效,所以我將盡我最大的努力來(lái)描述這些項(xiàng)目)。我想說的是,我和我在這里買的/列出的任何東西都沒有關(guān)系,它們只是碰巧是我挑選的或者已經(jīng)讓這個(gè)項(xiàng)目成功的東西——如果你有你認(rèn)為會(huì)更好的東西,絕對(duì)要使用它,并在評(píng)論中告訴別人。

?樹莓派。我使用了3B,因?yàn)槲矣写罅康?B,我想如果我能讓這個(gè)項(xiàng)目與只有1GB RAM的設(shè)備一起工作,那么如果其他人有更強(qiáng)大的主板,他們應(yīng)該是黃金。確保你有一根適合Pi的電源線——我用的是一根我非常喜歡的帶電源開關(guān)的電源線,這樣我就可以很容易地打開和關(guān)閉東西。

?SD卡。我用的是32gb的存儲(chǔ)卡,但有人可以使用更小的存儲(chǔ)卡,也不會(huì)有問題。

?一個(gè)迷你HDMI到HDMI電纜。我使用一個(gè)使用左90度角,以更好地適應(yīng)/隱藏它的設(shè)置。如果你使用的樹莓派與3B的版本不同,或者是沒有迷你HDMI接口的顯示器,你可能需要一個(gè)不同的連接器。

?這款顯示器(KYY便攜式顯示器15.6英寸)因?yàn)樗直∮中。钪匾氖莾r(jià)格實(shí)惠。

?18x24x0.04英寸雙向鏡像丙烯酸。你要確保你買的任何東西都是雙向鏡面玻璃,因?yàn)樗脑O(shè)置方式是,顯示器放在它后面,所以你想要有一個(gè)反射表面,讓光線通過它。

?11.69x16.53x0.08英寸透明亞克力板。厚度并不重要,只是高度和寬度。這將被用作將樹莓派和監(jiān)視器內(nèi)部連接在一起的一個(gè)部件。

?黑色的卡片紙。這是為了將鏡子的邊緣隱藏在顯示器周圍,所以你只需要確保它足夠大,可以被切割成16x10.75”

?一個(gè)麥克風(fēng)。我用的是AT2020,因?yàn)槲乙呀?jīng)擁有它了,但你應(yīng)該可以使用任何你可用的。當(dāng)我們進(jìn)入本教程的代碼時(shí),我將指出需要更改的一個(gè)值以匹配麥克風(fēng)的輸入采樣率(例如,我為AT2020使用44,000,但其他麥克風(fēng)可能是16,000)。

?黑色管道膠帶,用于粘貼東西和阻擋光線從卡紙的邊緣進(jìn)入顯示器。

?雙面安裝膠帶。這用于將監(jiān)視器內(nèi)部連接回它。

?M3螺釘和墊片。您將需要一些不同的長(zhǎng)度,在原始教程中提到過。我個(gè)人選擇了一個(gè)更大的品種盒,因?yàn)檫@些東西在很多不同的項(xiàng)目中都有使用。

?監(jiān)控框拆卸工具。我買了一套便宜的電子開啟工具,效果很好,但我只使用了幾件。你還需要一個(gè)熱風(fēng)槍或吹風(fēng)機(jī)來(lái)加熱和軟化將顯示器電子設(shè)備粘在塑料框架上的膠水。

?可選材料的站立框架。我使用了一些我從另一個(gè)項(xiàng)目中得到的廢棄中密度纖維板,并用激光切割了一個(gè)我在網(wǎng)上找到的免費(fèi)支架(盡管我確實(shí)按比例放大了),但我認(rèn)為你也可以使用畫架或其他任何適合你的東西。我強(qiáng)烈建議在這個(gè)項(xiàng)目中使用某種支架。

好了,現(xiàn)在我想所有的材料都準(zhǔn)備好了,讓我們開始做這個(gè)很棒的項(xiàng)目吧。我將跳過如何拆卸顯示器,因?yàn)槲艺J(rèn)為這在最初的教程中已經(jīng)講得很好了,我認(rèn)為對(duì)于一個(gè)優(yōu)秀的項(xiàng)目應(yīng)該給予贊揚(yáng),所以去看看吧。

首先,我沒有最穩(wěn)定的手來(lái)得分和折斷鏡像丙烯酸,并以各種方式切割造成了很多碎片。經(jīng)過幾次失敗的嘗試(和破壞丙烯酸。對(duì)不起谷歌,但謝謝你讓我花這個(gè)!),我把所有的床單切割成兩個(gè)12“x18”的桌子鋸,這工作得很好。如果你對(duì)其他方法更熟悉,那很好,但我只想說,這不是最容易處理的材料。

在我的鏡像丙烯酸樹脂變成一個(gè)可行的尺寸后,我想我可以省去下一個(gè)頭痛,把所有的東西都移到激光切割機(jī)上。注意,如果你對(duì)激光切割機(jī)不太熟悉,我建議你在切割過程中,尤其是在切割卡紙的時(shí)候,把它放在寶寶身邊。我第一次嘗試的時(shí)候是不是把東西點(diǎn)著了?絕對(duì)的。以后我一不小心還會(huì)放火嗎?有可能,但希望不是!一定要注意你的工具。

如果你碰巧使用我上面鏈接的顯示器,我發(fā)現(xiàn)整體鏡子的尺寸是16“乘10.75”,黑色卡紙上有一個(gè)13.25“乘7.25”的缺口。我還在M3螺絲的邊緣添加了孔,這樣你就不需要鉆它們或3D打印夾具(盡管我確實(shí)在單獨(dú)的嘗試上打印了這些夾具,而且它們確實(shí)很好!)。我已經(jīng)附上了一個(gè)PDF,這是96 DPI的文件,我設(shè)計(jì)的親和設(shè)計(jì)師。你需要在每一塊(鏡像丙烯酸、透明丙烯酸和卡紙)上剪下綠色和紅色的部分,但是中間的藍(lán)色矩形只從卡紙上剪下來(lái)。

在這結(jié)束時(shí),你應(yīng)該有三個(gè)單獨(dú)的材料全部削減到匹配的尺寸與對(duì)齊孔。在把所有東西擰在一起之前,別忘了把兩個(gè)亞克力板上的塑料蓋去掉!

對(duì)于此項(xiàng)目程序集的其余部分,請(qǐng)遵循原始教程。安裝好樹莓派后,你需要完成安裝魔鏡軟件的步驟,確保顯示器旋轉(zhuǎn)90度,刻度正確,一切都在啟動(dòng)時(shí)啟動(dòng)。一旦有了基礎(chǔ)項(xiàng)目,就可以深入研究新的Gemini連接魔鏡代碼了。

我強(qiáng)烈建議能夠SSH到您的樹莓派,因?yàn)楸窘坛讨械钠渌袃?nèi)容都將通過終端和git完成,盡管您也可以將鍵盤連接到鏡像并直接與設(shè)備的終端交互。

初始代碼設(shè)置

這個(gè)項(xiàng)目的所有代碼都附在這個(gè)黑客身上。不過,如果你想直接在鏡像上運(yùn)行最新的代碼,而不是從頭開始構(gòu)建它,你可以將這個(gè)github項(xiàng)目克隆到樹莓派上Magic mirror項(xiàng)目下的modules文件夾中,運(yùn)行npm install,然后更新你的配置文件以顯示該模塊。這將持續(xù)播放音頻,所以你可能想要修改項(xiàng)目以考慮預(yù)算問題(例如,添加麥克風(fēng)上的對(duì)話按鈕),但由于這是一個(gè)黑客項(xiàng)目,你應(yīng)該以任何對(duì)你有意義的方式進(jìn)行修改。如果您處于嘈雜的環(huán)境中,請(qǐng)注意API非常敏感,并且在檢測(cè)到新聲音時(shí)容易中斷。

您還需要更新配置文件以包含Gemini API密鑰,該密鑰可以在谷歌的AI Studio中創(chuàng)建或找到。

雖然作為該項(xiàng)目的核心的Live API每天可以免費(fèi)提供有限數(shù)量的請(qǐng)求,但圖像生成不是免費(fèi)的(在撰寫本文時(shí)),因此您可能需要根據(jù)您想要做的事情更改應(yīng)用程序。您可以在這里找到定價(jià)的完整描述,因?yàn)樾滦吞?hào)不斷推出,具有不同的功能和定價(jià)。

這個(gè)項(xiàng)目的基礎(chǔ)是魔鏡模塊模板,如果您想從頭開始,可以在這里找到并克隆它。有了基本項(xiàng)目之后,就該更新魔鏡的config/config.js文件了。作為參考,我對(duì)這個(gè)模塊的添加看起來(lái)像這樣:

最重要的部分是配置文件中的API密鑰,因?yàn)檫@是驅(qū)動(dòng)設(shè)置和可用信息的部分,并且它是本機(jī)的。

我們將在這個(gè)項(xiàng)目中使用三個(gè)主要文件:mm - gemini .js(盡管如果你克隆了模板,它將被稱為mm - template .js),它處理所有的UI, mm - gemini .css,它為UI設(shè)置樣式,以及node_helper.js,它是所有繁重工作發(fā)生的地方。為了簡(jiǎn)單起見,我將跳過css文件,但是您可以在這個(gè)項(xiàng)目頁(yè)面或完成的GitHub項(xiàng)目中找到它的代碼。

至于UI文件,我們基本上創(chuàng)建了一個(gè)UI狀態(tài)機(jī),它經(jīng)歷了initialize、READY、RECORDING和ERROR。socketNotificationReceived函數(shù)可以從helper接收有效負(fù)載和通知,幫助器告訴它應(yīng)該在UI中顯示哪個(gè)狀態(tài),然后它將更新DOM。

該函數(shù)還將接受GEMINI_IMAGE_GENERATING和GEMINI_IMAGE_GENERATED的通知,以便在調(diào)用該操作時(shí)顯示進(jìn)度旋轉(zhuǎn)器或生成的圖像(以base64格式接收),或者它將顯示Gemini Live API生成的任何文本,直到收到turnComplete響應(yīng),然后在發(fā)送下一個(gè)響應(yīng)時(shí)清除該文本。您可以找到這個(gè)項(xiàng)目附帶的UI的所有代碼,并將其作為起點(diǎn)。

如果一切工作如預(yù)期,你應(yīng)該有一個(gè)類似于這樣的UI:

將核心應(yīng)用程序放在一起后,是時(shí)候深入研究node_helper.js文件,并真正使用Gemini了解這個(gè)魔鏡的功能了!

設(shè)置Gemini Live API和語(yǔ)音輸入

讓魔鏡工作的第一個(gè)主要步驟是,我們需要能夠與魔鏡對(duì)話,將音頻數(shù)據(jù)實(shí)時(shí)發(fā)送到Gemini Live API,并等待響應(yīng)。為了簡(jiǎn)單起見,我們將從請(qǐng)求以文本形式發(fā)送的響應(yīng)開始,我們的UI將顯示它。進(jìn)入node_helper.js文件,讓我們添加整個(gè)項(xiàng)目中需要的各種常量。

NodeHelper常量應(yīng)該已經(jīng)存在于您的基本項(xiàng)目中,因?yàn)镸agic Mirror項(xiàng)目使用它來(lái)知道這是模塊的幫助器。

由于這個(gè)項(xiàng)目使用的是最新的JavaScript/TypeScript SDK,我們需要導(dǎo)入谷歌/genai庫(kù),并包含多個(gè)將在整個(gè)項(xiàng)目中使用的類型對(duì)象。您可以從官方文檔或源代碼中找到有關(guān)這些類型的更多信息。

緩沖器和揚(yáng)聲器都與輸出音頻有關(guān),我們將在本項(xiàng)目的后面進(jìn)行。記錄器是我們將用來(lái)記錄從Pi的麥克風(fēng)發(fā)送到live API的實(shí)時(shí)音頻流。

進(jìn)入下一個(gè)模塊,INPUT_SAMPLE_RATE與您連接到樹莓派上的麥克風(fēng)有關(guān)。因?yàn)槲沂褂玫氖茿T2020,我的采樣率是44100,但你的麥克風(fēng)可能有不同的值。

OUTPUT_SAMPLE_RATE是我們開始播放接收到的音頻時(shí)Gemini API的預(yù)期采樣率。API目前僅輸出24kHz。API使用一個(gè)通道,輸出原始PCM音頻數(shù)據(jù),編碼為帶符號(hào)整數(shù),16位。GEMINI_INPUT_MIME_TYPE是您將從Pi發(fā)送到API的數(shù)據(jù)類型。GEMINI_SESSION_HANDLE是一個(gè)值,我們稍后將使用它來(lái)保持關(guān)閉和重新打開之間的會(huì)話連續(xù)性,因?yàn)槟壳癎emini Live API將在大約十分鐘后自動(dòng)關(guān)閉。

最后,我們有GEMINI_MODEL。在撰寫本文時(shí),Gemini Live API處于預(yù)覽階段,因此該模型絕對(duì)會(huì)隨著時(shí)間的推移而改變,這取決于您閱讀本教程的時(shí)間。您需要檢查L(zhǎng)ive API文檔,以確保您使用的是項(xiàng)目的最佳選項(xiàng)。

有了這個(gè)集合,現(xiàn)在是時(shí)候添加將在整個(gè)項(xiàng)目中使用的所有變量了。我在NodeHelper.create()中初始化它們,然后我有一個(gè)applyDefaultState()函數(shù),該函數(shù)可用于在會(huì)話關(guān)閉或發(fā)生錯(cuò)誤時(shí)重置所有內(nèi)容。我還添加了一組用于調(diào)試的日志功能。你不需要包括這些,但我發(fā)現(xiàn)它們?cè)谡麄€(gè)項(xiàng)目中很有用,所以我將把它們留在本文中。我還創(chuàng)建了一個(gè)名為sendToFrontend的輔助函數(shù),用于封裝將套接字通知發(fā)送到UI前端(mm - gemini .js)。

其中大部分用于維護(hù)狀態(tài),再加上一個(gè)closePersistentSpeaker()函數(shù),我們將在音頻輸出時(shí)添加該函數(shù)。如果您正在跟隨,請(qǐng)稍后再對(duì)其進(jìn)行注釋。您還會(huì)注意到genAI和imaGenAI的值。genAI將管理我們的實(shí)時(shí)會(huì)話,而imaGenAI是將用于圖像生成的Gemini對(duì)象。如果你沒有在項(xiàng)目中使用圖像生成,你可以刪除它。

現(xiàn)在讓我們進(jìn)入一些好東西。我有一個(gè)名為initialize的函數(shù),它將用于啟動(dòng)這個(gè)項(xiàng)目所需的大部分內(nèi)容。現(xiàn)在我將發(fā)布一個(gè)編輯后的版本,我們可以隨著時(shí)間的推移添加。

這段代碼驗(yàn)證API密鑰是否可用,創(chuàng)建用于使用Gemini API的GoogleGenAI對(duì)象,然后創(chuàng)建一個(gè)新的LiveSession。這個(gè)實(shí)時(shí)會(huì)話使用SDK內(nèi)置的web套接字框架來(lái)處理雙子座模型和樹莓派之間的發(fā)送和接收數(shù)據(jù),它有一組回調(diào),將驅(qū)動(dòng)設(shè)備的狀態(tài)。最重要的是onmessage,它將把雙子座的響應(yīng)發(fā)送到一個(gè)新函數(shù),該函數(shù)將決定鏡子應(yīng)該如何反應(yīng)。這里還有onclose的代碼,它將重置回放狀態(tài)和一些其他尚未編寫的東西,所以可以隨意注釋掉onclose回調(diào),直到最后。

您還會(huì)注意到一個(gè)配置對(duì)象。這將是這個(gè)項(xiàng)目的核心部分,因?yàn)樗鼘c我們正在做的鏡子和雙子座API相關(guān)的每一個(gè)設(shè)置?,F(xiàn)在它只有一個(gè)響應(yīng)的模態(tài)。TEXT,這意味著我們希望Gemini模型只在onmessage回調(diào)中使用文本進(jìn)行響應(yīng)。

下面轉(zhuǎn)到helper的socketNotificationReceived函數(shù),我們想要進(jìn)入通知開關(guān)語(yǔ)句并為START_CONNECTION和START_CONTINUOUS_RECORDING添加新的用例。START_CONNECTION將調(diào)用initialize,它將告訴前端在初始化完成后更新它的UI狀態(tài)。一旦UI狀態(tài)被更新,就會(huì)收到另一個(gè)開始錄制的通知。完整的函數(shù)是這樣的:

實(shí)際上錄音是一個(gè)很大的步驟,所以我會(huì)把它分成更小的部分。我們將從創(chuàng)建一個(gè)名為startRecording()的新函數(shù)開始。這將檢查設(shè)備是否已經(jīng)在錄制,連接是否已經(jīng)打開,或者直播流是否正在運(yùn)行。如果其中任何一個(gè)為真,則該函數(shù)將提前退出。

如果一切都沒有問題,那么就可以開始錄音了。我們可以更新isRecording狀態(tài)值,然后創(chuàng)建一個(gè)recorderOptions對(duì)象。

從這里開始,是時(shí)候調(diào)用我們?cè)谖募敳慷x的記錄器上的record,然后存儲(chǔ)對(duì)音頻流的引用。我還在這里創(chuàng)建了一個(gè)chunkCounter用于調(diào)試,但是如果您想要更簡(jiǎn)潔的代碼,可以忽略它。

audioStream將為通過的任何數(shù)據(jù)提供偵聽器。如果它不是空的(如果你拔掉麥克風(fēng),或者當(dāng)你不使用麥克風(fēng)時(shí)設(shè)置了一鍵接通),那么它會(huì)將音頻數(shù)據(jù)轉(zhuǎn)換為base64編碼的字符串,然后使用liveSession將其作為新的JSON有效負(fù)載發(fā)送到Gemini Live API。sendRealtimeInput函數(shù)。

對(duì)于這個(gè)函數(shù)的其余部分,我有用于錯(cuò)誤、結(jié)束和退出的偵聽器,我將在這里包括它們以完成。

我還有一個(gè)stopRecording()函數(shù),用于錯(cuò)誤情況和直播流關(guān)閉時(shí)。重置所有內(nèi)容和更新UI非常簡(jiǎn)單,所以我不會(huì)在本教程中深入討論。

最后,讓我們添加handleGeminiResponse()函數(shù)。該塊將針對(duì)從Gemini Live API獲得的各種類型的響應(yīng)進(jìn)行更新,但對(duì)于基本版本,我們只需要檢索消息的內(nèi)容并檢查是否存在文本。如果是,我們會(huì)將文本塊發(fā)送到UI顯示。我也有一個(gè)if語(yǔ)句來(lái)檢查安裝是否完成,但我目前沒有做任何與我的這個(gè)項(xiàng)目的版本。

此外,我們可以檢查L(zhǎng)ive API是否說我們已經(jīng)完成了響應(yīng)回合。這是一個(gè)非常有價(jià)值的響應(yīng),因?yàn)樗嬖V我們模型何時(shí)完成生成文本,之后它會(huì)告訴我們何時(shí)應(yīng)該完成音頻響應(yīng)的播放。你現(xiàn)在可以將這個(gè)塊添加到handlegeminiResponse中,因?yàn)樗鼘⒈籙I用于清除響應(yīng)之間的文本。

好了,這是很多,我略過了一些因?yàn)橛泻芏酄顟B(tài)管理的模板,但在這一點(diǎn)上你應(yīng)該能夠和鏡子對(duì)話并顯示來(lái)自Gemini Live API的文本響應(yīng)。

音頻響應(yīng)和中斷

既然我們有了文本,讓我們深入研究如何獲得音頻,因?yàn)槔蠈?shí)說,魔鏡應(yīng)該真的在和你說話。其工作方式是,我們將responseModality設(shè)置為modal。當(dāng)Gemini Live API響應(yīng)時(shí),它將發(fā)送一個(gè)base64編碼的字符串,用于多個(gè)可以在設(shè)備上播放的音頻塊。因?yàn)檫@些回應(yīng)來(lái)得很快,而不是在他們大聲播放的時(shí)候,我們還需要?jiǎng)?chuàng)建一個(gè)排隊(duì)系統(tǒng),當(dāng)任何當(dāng)前的音頻播放完畢時(shí),它就會(huì)轉(zhuǎn)移到下一個(gè)音頻塊。最重要的是,Gemini Live API支持中斷,所以如果用戶在播放音頻時(shí)說了什么,我們可以清除隊(duì)列,讓揚(yáng)聲器保持打開狀態(tài),等待下一個(gè)音頻響應(yīng)從API返回。

讓我們從更新實(shí)時(shí)會(huì)話responseModality開始。

我們還將創(chuàng)建一個(gè)名為processQueue的新函數(shù)來(lái)處理回放邏輯。讓我們一步一步地復(fù)習(xí)一下。首先,我們想看看隊(duì)列中是否有任何東西。如果沒有,那么我們可以關(guān)閉揚(yáng)聲器,假設(shè)隊(duì)列沒有被中斷清除,并期待很快會(huì)有更多的音頻塊。

接下來(lái),我們可以將processingQueue標(biāo)志設(shè)置為true,用于狀態(tài)管理。

然后我們要檢查我們的揚(yáng)聲器是否已經(jīng)創(chuàng)建,否則我們將創(chuàng)建一個(gè)新的。我想在這里指出的一件事是,我特別使用了一個(gè)存儲(chǔ)在類級(jí)別的持久揚(yáng)聲器,因?yàn)槲覀兿胍钚』瘬P(yáng)聲器被創(chuàng)建和銷毀的次數(shù)。這是一個(gè)很好的內(nèi)存平衡,如果你使用的是內(nèi)存超過1GB的新樹莓派,這可能不是一個(gè)問題。

一旦我們知道我們有一個(gè)可用的揚(yáng)聲器,我們就可以從隊(duì)列中檢索base64編碼的音頻剪輯字符串,并在將緩沖區(qū)發(fā)送給揚(yáng)聲器播放之前將其寫入緩沖區(qū)。

如果到目前為止一切順利,我們將希望查看隊(duì)列中是否還有剩余的內(nèi)容,然后讓processQueue函數(shù)調(diào)用本身移動(dòng)到下一個(gè)塊,否則我們將轉(zhuǎn)義整個(gè)播放循環(huán)。

在這里,讓我們定義用于錯(cuò)誤情況的closePersistentSpeaker函數(shù)。這并沒有做太多可怕的事情,除了關(guān)閉揚(yáng)聲器,移除聽眾,并試圖清理我們的狀態(tài)。

最后,在測(cè)試之前,讓我們確保我們正在處理從Gemini Live API返回的音頻和中斷消息類型。我們可以通過向handleGeminiResponse函數(shù)中添加以下代碼塊來(lái)實(shí)現(xiàn)這一點(diǎn)。

現(xiàn)在,您應(yīng)該能夠重新啟動(dòng)鏡像模塊以與它進(jìn)行對(duì)話,也可以在音頻播放過程中中斷它以更改對(duì)話的過程。很酷,對(duì)吧?

函數(shù)調(diào)用,搜索基礎(chǔ)和圖像生成

現(xiàn)在我們已經(jīng)有了項(xiàng)目的核心,是時(shí)候更進(jìn)一步了。函數(shù)調(diào)用是我最喜歡的Gemini API特性之一,因?yàn)樗梢宰屓魏问褂肎emini的設(shè)備或應(yīng)用基于與模型的交互來(lái)做一些非常有趣的事情。為了使用鏡像啟用函數(shù)調(diào)用,我們需要回到initialize中的配置對(duì)象,并添加一個(gè)tools數(shù)組。這將包括一個(gè)functionDeclarations數(shù)組,其中包含一個(gè)生成圖像的函數(shù)(我將其命名為generate_image),以及Gemini模型用來(lái)知道何時(shí)應(yīng)該調(diào)用該函數(shù)的描述,以及與該函數(shù)相關(guān)的任何其他指令。對(duì)于這個(gè)案例,我告訴鏡報(bào),它應(yīng)該是異想天開和有趣的,同時(shí)使用幻想的繪畫風(fēng)格。我們會(huì)在鏡子中添加更多的個(gè)性。在這個(gè)單獨(dú)的函數(shù)中,我們還需要為將用于生成圖像的提示符包含一個(gè)參數(shù)。

除了函數(shù)調(diào)用之外,我還在本節(jié)中向鏡像添加了另外兩個(gè)工具。第一個(gè)是谷歌搜索。這使得Gemini模型可以使用谷歌提供的各種工具,例如查找天氣或當(dāng)前時(shí)間。我還啟用了googleSearchRetrieval,允許鏡像進(jìn)行谷歌搜索,在適用的情況下找到有關(guān)請(qǐng)求的最新和最相關(guān)的信息。您可以在functionDeclarations上面的tools數(shù)組中添加這兩個(gè)工具。

此時(shí),我們應(yīng)該能夠期望Gemini Live API觸發(fā)函數(shù)調(diào)用,因此讓我們確保在handleGeminiResponse中接受這些消息。返回到該函數(shù),我們可以檢查消息中是否存在函數(shù)調(diào)用塊,然后我們可以將函數(shù)調(diào)用負(fù)載發(fā)送到將處理該代碼的單獨(dú)函數(shù)。

在handleFunctionCall中,我們將確保擁有函數(shù)所需的所有信息,然后使用switch語(yǔ)句確定調(diào)用了哪個(gè)函數(shù)。因?yàn)槲覀儸F(xiàn)在只支持一個(gè)函數(shù),所以我們要么生成一個(gè)圖像,要么退出這個(gè)函數(shù)。

由于這使用了一個(gè)獨(dú)立的模型,而不是用于Live API的Gemini模型,因此我們還需要確保在initialize中初始化了適當(dāng)?shù)腉oogleGenAI對(duì)象。

現(xiàn)在讓我們?cè)囈辉嚕岀R子在給我們講故事的同時(shí)創(chuàng)造出一個(gè)物體的圖像。

由于我們已經(jīng)啟用了搜索接地功能,我們可以詢問當(dāng)前的事情,比如我的家鄉(xiāng)科羅拉多州博爾德的時(shí)間和天氣。

添加個(gè)性

經(jīng)過我們到目前為止所做的一切,我們終于有了一面可以工作的魔法鏡子,但它感覺并不“神奇”,不是嗎?讓我們使用Gemini SDK中提供的一些工具來(lái)修復(fù)這個(gè)問題,這些工具可以賦予模型一點(diǎn)個(gè)性?;氐轿覀兊呐渲脤?duì)象,讓我們添加一個(gè)systemInstruction對(duì)象。我們會(huì)告訴人工智能,它是一個(gè)無(wú)所不知的、強(qiáng)大的魔法鏡子,有趣、異想天開、輕松愉快,它從與人互動(dòng)中獲得快樂,用自己的知識(shí)和能力讓人驚嘆。

我們還可以添加一個(gè)新的speechConfig對(duì)象,它允許我們將聲音配置為一些不同的東西。有一個(gè)視圖的聲音是可用的,所以你應(yīng)該玩不同的,看看哪一個(gè)最適合你。以下是目前可用的簡(jiǎn)短列表,但未來(lái)可能會(huì)擴(kuò)展:Puck, Charon, Kore, Fenrir, Aoede, Leda, Orus和Zephyr。

如果我們想要更多的定制聲音,我們也可以給它一個(gè)語(yǔ)言代碼。就我個(gè)人而言,我覺得魔鏡應(yīng)該說法語(yǔ),所以我的語(yǔ)音配置是這樣的,盡管我也很喜歡英語(yǔ)的“Puck”的聲音。

結(jié)束

在這一點(diǎn)上,事情看起來(lái)很棒,所以讓我們做更多的潤(rùn)飾項(xiàng)目,以真正使這個(gè)項(xiàng)目脫穎而出。我遇到的一個(gè)問題是,我需要不斷地告訴AI完成它的故事,所以讓我們?cè)谙到y(tǒng)指令中添加一個(gè)新句子:“當(dāng)你從一個(gè)故事中中斷以顯示故事中的圖像時(shí),請(qǐng)?jiān)谡{(diào)用函數(shù)后繼續(xù)講述故事,而不需要提示。你還應(yīng)該盡可能在沒有用戶輸入的情況下繼續(xù)寫故事——你是無(wú)所不知的鏡子,用你對(duì)故事的了解讓觀眾驚訝。”

在對(duì)話過程中,鏡子也會(huì)嘗試恢復(fù)為英語(yǔ),所以讓我們直接告訴它以用戶使用的語(yǔ)言與鏡子交談,通過在系統(tǒng)指令中添加另一句話來(lái)響應(yīng)用戶:“如果檢測(cè)到非英語(yǔ)語(yǔ)言,則以說話者輸入的音頻語(yǔ)言進(jìn)行響應(yīng)?!闭?qǐng)用說話者通過音頻輸入的語(yǔ)言準(zhǔn)確無(wú)誤地回答?!币?yàn)檫@是我們可以開箱即用來(lái)支持多種語(yǔ)言的東西,所以我非常喜歡它。

這就是這個(gè)項(xiàng)目的全部?jī)?nèi)容!你還可以做很多事情來(lái)修改它,所以如果你建造了自己的魔鏡,一定要玩得開心。添加一個(gè)攝像頭,嘗試生成視頻顯示給用戶,玩語(yǔ)言和個(gè)性,或嘗試創(chuàng)建代理系統(tǒng),真正把鏡子變成你自己的個(gè)人神奇助手。

本文編譯自hackster.io

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉