精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用LLaMA 3.1、Firebase和Node.js,構(gòu)建一個(gè)音控的智能廚房應(yīng)用程序 原創(chuàng)

發(fā)布于 2024-12-24 08:10
瀏覽
0收藏

這篇指南逐步介紹了創(chuàng)建一個(gè)自動(dòng)化的廚房助理的過(guò)程,附有語(yǔ)音命令、實(shí)時(shí)購(gòu)物清單管理以及食譜建議。

?我在本教程中將介紹創(chuàng)建一個(gè)智能廚房應(yīng)用程序(Chent),它可以根據(jù)個(gè)性化偏好簡(jiǎn)化雜貨清單管理。該應(yīng)用程序通過(guò)語(yǔ)音命令操作,簡(jiǎn)化了人機(jī)交互和添加商品。對(duì)于那些只需說(shuō)出需求就能快速創(chuàng)建購(gòu)物清單的用戶(hù)來(lái)說(shuō),這是理想的選擇。

該項(xiàng)目使用LLaMA 3.1用于自然語(yǔ)言處理(NLP)以解釋語(yǔ)音輸入、使用Firebase用于實(shí)時(shí)數(shù)據(jù)庫(kù)存儲(chǔ)和用戶(hù)驗(yàn)證,并使用Node.js處理后端邏輯和集成。用戶(hù)可以輸入命令以添加商品,設(shè)置飲食偏好,甚至指定數(shù)量,該應(yīng)用程序可以智能化生成滿(mǎn)足這些要求的購(gòu)物清單。

我在本教程中將介紹從設(shè)置Firebase、配置LLaMA以操控語(yǔ)音命令到實(shí)時(shí)存儲(chǔ)和管理購(gòu)物清單的整個(gè)過(guò)程。?

搭建開(kāi)發(fā)環(huán)境

在開(kāi)始為smart-kitchen-app應(yīng)用程序編寫(xiě)代碼之前,我們需要搭建好工作環(huán)境。

1. 安裝Node.js和npm

第一步是安裝Node.js和npm。訪(fǎng)問(wèn)Node.js網(wǎng)站:??https://nodejs.org/en??,獲取你電腦的運(yùn)行系統(tǒng)所需的長(zhǎng)期支持版本。然后,按照安裝步驟操作。

2. 使用Next.js創(chuàng)建項(xiàng)目

?啟動(dòng)終端,進(jìn)入到你想要?jiǎng)?chuàng)建項(xiàng)目的位置。之后,運(yùn)行這些命令:

?npx create-next-app@latestsmart-kitchen app(使用@latest標(biāo)志,npm可獲得最新版本的Next.js啟動(dòng)設(shè)置。)

?cd smart-kitchen-app

它將創(chuàng)建一個(gè)新的Next.js項(xiàng)目,并將你帶到項(xiàng)目路徑。在安裝過(guò)程中,你會(huì)看到許多配置選擇,設(shè)置如下:

  • 你想使用TypeScript嗎?
  • 你想使用ESLint嗎?
  • 你想使用Tailwind CSS嗎?
  • 你想使用src/目錄嗎?
  • 你想使用App Router(應(yīng)用路由器)嗎?
  • 你想定制默認(rèn)導(dǎo)入別名嗎?

3. 安裝Firebase和Material-UI

在項(xiàng)目目錄下,執(zhí)行以下命令:

Shell
1 npm install @mui/material @emotion/react @emotion/styled firebase

設(shè)置Firebase

  • 在Firebase控制臺(tái)上啟動(dòng)一個(gè)新項(xiàng)目。
  • 項(xiàng)目創(chuàng)建完畢后,點(diǎn)擊“添加應(yīng)用程序”,選擇web平臺(tái)(</>)。
  • 當(dāng)你注冊(cè)應(yīng)用程序時(shí)給它取個(gè)名字,比如“smart-kitchen-app”。
  • 復(fù)制Firebase設(shè)置文件。之后,這個(gè)副本很有用。

4. 創(chuàng)建Firebase配置文件

在項(xiàng)目的根目錄下創(chuàng)建一個(gè)名為Firebase .js的新文件,并添加以下代碼,將占位符換成你項(xiàng)目的真實(shí)Firebase設(shè)置:?

JavaScript
1 import { initializeApp } from "firebase/app";
2 import { getAnalytics } from "firebase/analytics";
3 import { getAuth } from "firebase/auth";
4 import { getFirestore } from "firebase/firestore";
5 ?
6 const firebaseConfig = {
7 apiKey: "YOUR_API_KEY",
8 authDomain: "YOUR_PROJECT_ID.firebaseapp.com",
9 projectId: "YOUR_PROJECT_ID",
10 storageBucket: "YOUR_PROJECT_ID.appspot.com",
11 messagingSenderId: "YOUR_MESSAGING_SENDER_ID",
12 appId: "YOUR_APP_ID"
13 };
14
?15 const app = initializeApp(firebaseConfig);
16 const analytics = getAnalytics(app);
17 export const auth = getAuth(app);
18 export const db = getFirestore(app);

如何在OpenRouter中創(chuàng)建API令牌?

我們將使用來(lái)自O(shè)penRouter的免費(fèi)版本LLaMA 3.1,為此,我們需要獲得API令牌。以下是獲得API令牌的幾個(gè)步驟:

第1步:注冊(cè)或登錄到OpenRouter

  • 訪(fǎng)問(wèn)OpenRouter的官方網(wǎng)站:進(jìn)入到OpenRouter.ai。
  • 如果你還沒(méi)有帳戶(hù),創(chuàng)建一個(gè)帳戶(hù)。你可以用電子郵件注冊(cè),也可以使用谷歌、GitHub或其他OAuth提供商。
  • 如果你已經(jīng)有了OpenRouter帳戶(hù),請(qǐng)登錄。?

第2步:導(dǎo)航進(jìn)入到API密鑰設(shè)置

  • ?登錄后,進(jìn)入到儀表板。
  • 在儀表板中,查找API或開(kāi)發(fā)人員工具部分。
  • 點(diǎn)擊API密鑰或令牌選項(xiàng)。?

第3步:生成新的API密鑰

  • 在API密鑰部分,你應(yīng)該看到“生成新API密鑰”的按鈕或鏈接。
  • 點(diǎn)擊“生成”按鈕來(lái)創(chuàng)建一個(gè)新的API密鑰。
  • 可能會(huì)要求你給API密鑰取一個(gè)名字。如果你有多個(gè)不同項(xiàng)目的API密鑰(比如“Smart-Kitchen App Key”),這有助于你井然有序地組織密鑰。?

第4步:復(fù)制API密鑰

  • 生成API密鑰后,它將顯示在屏幕上。立即復(fù)制API密鑰,因?yàn)橐恍┓?wù)在你離開(kāi)頁(yè)面后可能不會(huì)再次顯示它。
  • 將API密鑰安全地存儲(chǔ)在環(huán)境配置文件中(比如.env.local)。

第5?步:將API Key添加到.env.local文件

  • 在Next.js項(xiàng)目中,打開(kāi).env.local文件(如果沒(méi)有,創(chuàng)建一個(gè))。
  • 添加下面這行:

OPENROUTER_API_KEY = your-generated-api-key-here

確保將your-generated-api-key-here換成你復(fù)制的實(shí)際的API密鑰。?

第6步:在應(yīng)用程序中使用API密鑰

  • 現(xiàn)在你已經(jīng)將API密鑰存儲(chǔ)在.env. local文件中,就可以在應(yīng)用程序中使用它。
  • 通過(guò)服務(wù)器端代碼中的process.env.OPENROUTER_API_KEY或發(fā)出API請(qǐng)求時(shí)訪(fǎng)問(wèn)密鑰。確保密鑰安全,避免將其暴露給生產(chǎn)級(jí)應(yīng)用程序中的客戶(hù)端。?

構(gòu)建核心邏輯,導(dǎo)入LLaMa 3.1以創(chuàng)建智能廚房應(yīng)用程序響應(yīng)

創(chuàng)建一個(gè)名為app的新文件夾,并在其下創(chuàng)建一個(gè)名為Extract的子文件夾,文件名為route.ts,按照下面給出的代碼操作:

TypeScript
1 import { NextRequest, NextResponse } from 'next/server';
2
?3 export async function POST(req: NextRequest) {
4  const { prompt } = await req.json();
5
?6  // Check if the API key is available
7  const apiKey = process.env.OPENROUTER_API_KEY;
8  if (!apiKey) {
9    console.error('API key not found');
10   return NextResponse.json({ error: "API key is missing" }, { status: 500 });
11  }
12
?13  const response = await fetch("https://openrouter.ai/api/v1/chat/completions", {
14    method: "POST",
15    headers: {
16      "Authorization": `Bearer ${apiKey}`,
17      "Content-Type": "application/json",
18    },
19    body: JSON.stringify({
20      model: "meta-llama/llama-3.1-8b-instruct",
21      messages: [
22        { role: "system", content: "You are an assistant that extracts information and outputs only valid JSON. Do not include any explanation or extra information. Only respond with a JSON object that has the following structure: {\"itemName\": \"string\", \"quantity\": \"number\"}." },
23        { role: "user", content: `Extract the item name and quantity from the following command: "${prompt}"` }
24      ],
25    })
26  });
27
?28  if (!response.ok) {
29    console.error('LLaMA API request failed with status:', response.status);
30    return NextResponse.json({ error: "Failed to process command with LLaMA" }, { status: 500 });
31  }
32?
33  const completion = await response.json();
34  const rawJson = completion.choices[0].message.content;
35  console.log('Raw response from LLaMA:', rawJson); // Detailed logging of the raw response
36
?37  // Extracting JSON from the response content
38  const startIndex = rawJson.indexOf('{');
39  const endIndex = rawJson.lastIndexOf('}') + 1;
40
?41  if (startIndex === -1 || endIndex === -1) {
42    console.error('Failed to find valid JSON in LLaMA response');
43    return NextResponse.json({ error: "Failed to extract JSON from LLaMA response" }, { status: 500 });
44  }
45
?46  const jsonString = rawJson.substring(startIndex, endIndex);
47  console.log('Extracted JSON string:', jsonString); // Logging extracted JSON string
48?
49  try {
50    const parsedData = JSON.parse(jsonString);
51    console.log('Parsed data:', parsedData); // Logging the parsed data
52?
53    const { itemName, quantity } = parsedData;
54?
55    if (!itemName || !quantity) {
56      console.error('Missing fields in parsed data:', parsedData);
57      return NextResponse.json({ error: "Invalid data received from LLaMA" }, { status: 500 });
58    }
59
?60    return NextResponse.json({ itemName, quantity });
61  } catch (error) {
62    console.error('Error parsing JSON from LLaMA response:', error);
63    return NextResponse.json({ error: "Failed to parse JSON from LLaMA response" }, { status: 500 });
64  }
65}
66

??這段代碼定義了一個(gè)POST API端點(diǎn),該端點(diǎn)使用LLaMA 3.1模型從用戶(hù)的語(yǔ)音命令中提取特定信息(商品名稱(chēng)和數(shù)量),專(zhuān)注于提供JSON格式的結(jié)構(gòu)化數(shù)據(jù)。

首先,它接收一個(gè)含有提示的請(qǐng)求,并檢查是否有所需的API密鑰(OPENROUTER_API_KEY)。如果缺少API密鑰,它會(huì)給出錯(cuò)誤響應(yīng)。然后將請(qǐng)求發(fā)送到OpenRouter AI API,要求AI僅返回有效的JSON,其中包含從用戶(hù)輸入中提取的字段itemName和quantity。

記錄并檢查來(lái)自AI的響應(yīng),以確保返回有效的JSON對(duì)象。如果響應(yīng)包含有效的JSON,則解析字符串,并檢查字段的完整性。如果itemName和quantity都存在,數(shù)據(jù)則以JSON格式返回給用戶(hù);否則,將記錄并返回相應(yīng)的錯(cuò)誤。這段代碼確保AI助理提供結(jié)構(gòu)化、可操作的響應(yīng),適合智能廚房應(yīng)用程序中的購(gòu)物清單創(chuàng)建。

在app文件夾下,創(chuàng)建一個(gè)名為L(zhǎng)lama的子文件夾,文件名為route.ts,按照下面給出的代碼操作:?

TypeScript
1 import { NextRequest, NextResponse } from 'next/server';
2
?3 const systemPrompt = `
4 You are a helpful and friendly AI kitchen assistant. Your role is to assist users in their kitchen tasks, providing guidance, suggestions, and support in a clear and concise manner. Follow these guidelines:
5?
6 1. Provide friendly, helpful, and respectful responses to all user inquiries, ensuring a positive experience.
7 2. When asked for a recipe, suggest simple and delicious recipes based on the ingredients the user has available. Keep the instructions clear and easy to follow.
8 3. Assist with creating grocery lists by accurately adding items mentioned by the user. Confirm each addition and offer to help with more items.
9 4. Handle common kitchen-related tasks such as suggesting recipes, checking pantry items, offering cooking tips, and more.
10 5. If the user is unsure or needs help deciding, offer suggestions or ask clarifying questions to better assist them.
11 6. Recognize when the user is trying to end the conversation and respond politely, offering a warm closing message.
12 7. Avoid overly technical language or complex instructions. Keep it simple, friendly, and approachable.
13 8. Provide accurate and practical information, such as cooking times, ingredient substitutions, or food storage tips.
14 9. Tailor responses to the user's preferences and dietary restrictions whenever mentioned.
15 10. Ensure every interaction feels personal, supportive, and designed to help the user enjoy their cooking experience.
16?
17 Remember, your goal is to make cooking and kitchen tasks easier, more enjoyable, and stress-free for the user.
18 `;
19
?20 export async function POST(req: NextRequest) {
21   try {
22     const { command } = await req.json();
23     console.log('Received command:', command);
24
?25     const response = await fetch("https://openrouter.ai/api/v1/chat/completions", {
26      method: "POST",
27      headers: {
28        "Authorization": `Bearer ${process.env.OPENROUTER_API_KEY}`,
29        "Content-Type": "application/json",
30      },
31      body: JSON.stringify({
32        model: "meta-llama/llama-3.1-8b-instruct",
33        messages: [
34          { role: "system", content: systemPrompt },
35          { role: "user", content: command }
36        ],
37      })
38    });
39
?40    if (!response.ok) {
41      throw new Error(`Failed to fetch from OpenRouter AI: ${response.statusText}`);
42    }
43
?44    const completion = await response.json();
45    const responseMessage = completion.choices[0].message.content;
46    console.log('Received response:', responseMessage);
47?
48    return NextResponse.json({ response: responseMessage });
49  } catch (error) {
50    console.error("Error processing request:", error);
51    return NextResponse.json({ error: "Error processing request" }, { status: 500 });
52  }
53}

?這段代碼使用Next.js為廚房助理應(yīng)用程序設(shè)置了POST API端點(diǎn),使其能夠利用OpenRouter AI和LLaMA 3.1模型通過(guò)語(yǔ)音輸入處理用戶(hù)命令。終端先建立一個(gè)引導(dǎo)AI行為的系統(tǒng)提示,確保交互友好、清晰、得到支持,特別是與食譜建議、購(gòu)物清單創(chuàng)建和烹飪技巧等廚房任務(wù)相關(guān)方面。一收到POST請(qǐng)求,系統(tǒng)從請(qǐng)求主體部分提取用戶(hù)的命令,并將其與系統(tǒng)提示一起轉(zhuǎn)發(fā)給OpenRouter AI API。

來(lái)自AI的響應(yīng)根據(jù)命令予以定制,隨后以JSON格式提供給用戶(hù)。如果在過(guò)程中發(fā)生錯(cuò)誤,將記錄錯(cuò)誤消息,并返回500狀態(tài)碼,確保無(wú)縫的用戶(hù)體驗(yàn)。

在app文件夾下,創(chuàng)建一個(gè)名為Recipe的子文件夾,文件名為route.ts,并按照下面給出的代碼操作:?

TypeScript
1 import { NextRequest, NextResponse } from 'next/server';
2
?3 export async function POST(req: NextRequest) {
4   const { availableItems } = await req.json();
5
?6   // Check if the API key is available
7   const apiKey = process.env.OPENROUTER_API_KEY;
8   if (!apiKey) {
9     console.error('API key not found');
10    return NextResponse.json({ error: "API key is missing" }, { status: 500 });
11  }
12
?13   const response = await fetch("https://openrouter.ai/api/v1/chat/completions", {
14    method: "POST",
15    headers: {
16      "Authorization": `Bearer ${apiKey}`,
17      "Content-Type": "application/json",
18    },
19    body: JSON.stringify({
20      model: "meta-llama/llama-3.1-8b-instruct",
21      messages: [
22        { role: "system", content: "You are an assistant that provides specific recipe suggestions based on available ingredients. Only respond with a recipe or cooking instructions based on the provided ingredients." },
23        { role: "user", content: `Here are the ingredients I have: ${availableItems}. Can you suggest a recipe using these ingredients?` }
24      ],
25    })
26  });
27?
28  if (!response.ok) {
29    console.error('LLaMA API request failed with status:', response.status);
30    return NextResponse.json({ error: "Failed to process recipe request with LLaMA" }, { status: 500 });
31  }
32
?33  const completion = await response.json();
34  const recipe = completion.choices[0].message.content.trim();
35
?36  return NextResponse.json({ recipe });
37 }
38

??這段代碼建立了一個(gè)POST API端點(diǎn),該端點(diǎn)利用LLaMA 3.1模型生成適合用戶(hù)手頭配料的食譜建議。請(qǐng)求包括系統(tǒng)提示指示AI充當(dāng)廚房助手,特別是根據(jù)給定的配料推薦食譜。AI會(huì)收到消息,包括現(xiàn)有配料列表,并請(qǐng)求食譜建議。

一收到成功的API請(qǐng)求,來(lái)自AI的響應(yīng)(包括配方)將被提取并以JSON格式提供。如果操作失敗,代碼將記錄錯(cuò)誤并提供表明出現(xiàn)失敗的消息。這段代碼保證了AI根據(jù)用戶(hù)在智能廚房應(yīng)用程序中手頭的配料提供量身定制的食譜建議。?

構(gòu)建智能廚房應(yīng)用程序的核心組件

第1步:導(dǎo)入和狀態(tài)設(shè)置

導(dǎo)入必要的依賴(lài)項(xiàng)并設(shè)置狀態(tài)變量,以管理用戶(hù)輸入和Firebase集成。

TypeScript
1 "use client";
2 import React, { useState } from 'react';
3 import { db } from './firebase';
4 import { collection, updateDoc, arrayUnion, doc, getDoc } from 'firebase/firestore';
5

第2步:組件聲明和初始狀態(tài)

定義KitchenAssistant組件,并為用戶(hù)命令、響應(yīng)和語(yǔ)音識(shí)別初始化狀態(tài)。

TypeScript
1 export default function KitchenAssistant() {
2   const [command, setCommand] = useState('');
3   const [response, setResponse] = useState('');
4   const [recognition, setRecognition] = useState<SpeechRecognition | null>(null);
5

第3步:處理語(yǔ)音命令

這段代碼處理用戶(hù)的語(yǔ)音命令。它驗(yàn)證命令是否有結(jié)束語(yǔ)句(比如“thank you”)來(lái)結(jié)束對(duì)話(huà),或者它是否有諸如“建議食譜”或“向食品儲(chǔ)藏室添加商品”之類(lèi)的短語(yǔ)。根據(jù)給定的命令,它激活相關(guān)的操作(比如“建議食譜”或“發(fā)聲朗讀”)。

TypeScript
1 const handleVoiceCommand = async (commandText: string) => {
2   setCommand(commandText.toLowerCase());
3   const closingStatements = ["no thank you", "thank you", "that's all", "goodbye", "i'm done"];
4 const isClosingStatement = closingStatements.some(statement => commandText.includes(statement));
5?
6   if (isClosingStatement) {
7     const closingResponse = "Thank you! If you need anything else, just ask. Have a great day!";
8     setResponse(closingResponse);
9     speak(closingResponse);
10    return;
11  }
12?
13   if (commandText.includes("suggest a recipe")) {
14    await suggestRecipe();
15  } else if (commandText.includes("add items to pantry")) {
16    setResponse("Sure, start telling me the items you'd like to add.");
17    speak("Sure, start telling me the items you'd like to add.");
18  }
19 };
20?

第4步:一般命令處理

該函數(shù)使用發(fā)送到/api/llama端點(diǎn)的POST請(qǐng)求來(lái)處理一般命令,端點(diǎn)通過(guò)LLaMA模型處理命令。來(lái)自AI的響應(yīng)被設(shè)置為response狀態(tài),并使用speak函數(shù)大聲朗讀。

TypeScript
1 const handleGeneralCommand = async (commandText: string) => {
2   try {
3     const res = await fetch('/api/llama', {
4     method: 'POST',
5     headers: { 'Content-Type': 'application/json' },
6     body: JSON.stringify({ command: commandText }),
7    });
8    const data = await res.json();
9    setResponse(data.response);
10    speak(data.response);
11  } catch (error) {
12    setResponse("Sorry, I couldn't process your request.");
13    speak("Sorry, I couldn't process your request.");
14  }
15 }; 
16?

第5步:為購(gòu)物清單添加商品

該函數(shù)將商品添加到Firebase中的購(gòu)物清單中。它估算過(guò)期日期,更新Firestore文檔,并通過(guò)設(shè)置響應(yīng)并大聲朗讀響應(yīng)來(lái)確認(rèn)已添加給用戶(hù)。

TypeScript
1 const addToGroceryList = async (itemName: string, quantity: number) => {
2   try {
3     const expiryDate = new Date();
4     expiryDate.setDate(expiryDate.getDate() + 7);
5     const docRef = doc(db, 'grocery-list', 'Available Grocery Items');
6     await updateDoc(docRef, {
7       items: arrayUnion({
8         itemName,
9         quantity,
10        expiryDate: expiryDate.toISOString(),
11      }),
12    });
13    const responseText = `Grocery list updated. You now have: ${itemName} (${quantity}).`;
14    setResponse(responseText);
15    speak(responseText);
16  } catch (error) {
17    setResponse("Sorry, I couldn't add the item to the list.");
18    speak("Sorry, I couldn't add the item to the list.");
19  }
20 };
21

第6步:語(yǔ)音識(shí)別

?該函數(shù)初始化瀏覽器的語(yǔ)音識(shí)別API,監(jiān)聽(tīng)用戶(hù)輸入,并使用handleVoiceCommand處理已識(shí)別的文本。它設(shè)置了語(yǔ)言,確保持續(xù)監(jiān)聽(tīng)。

在這段代碼中,我使用WebSpeech API的SpeechRecognition接口來(lái)啟用應(yīng)用程序中的語(yǔ)音命令功能。?

TypeScript
1 const startRecognition = () => {
2 const SpeechRecognition = window.SpeechRecognition || (window as any).webkitSpeechRecognition;
3  const newRecognition = new SpeechRecognition();
4  newRecognition.lang = 'en-US';
5  newRecognition.onresult = (event: any) => {
6    const speechToText = event.results[0][0].transcript;
7    handleVoiceCommand(speechToText);
8  };
9  newRecognition.start();
10  setRecognition(newRecognition);
11 };
12

這一行檢查瀏覽器中是否存在原生SpeechRecognition API,或者對(duì)于像Chrome這樣通過(guò)webkit前綴支持它的瀏覽器,退回到webkitSpeechRecognition。這個(gè)API允許應(yīng)用程序監(jiān)聽(tīng)用戶(hù)的語(yǔ)音輸入,將其轉(zhuǎn)換成文本,然后將其作為命令來(lái)處理。

JavaScript
1 const SpeechRecognition = window.SpeechRecognition || (window as any).webkitSpeechRecognition;

?使用這個(gè)API,該應(yīng)用程序可以通過(guò)語(yǔ)音命令與用戶(hù)進(jìn)行交互,支持諸多功能,比如將商品添加到購(gòu)物清單、建議食譜或檢索食品儲(chǔ)藏室的食材,使體驗(yàn)更自動(dòng)化、交互式。

你可以使用Whisper或所選擇的任何其他語(yǔ)音識(shí)別機(jī)制。?

創(chuàng)建前端組件

這個(gè)TSX布局為你的智能廚房應(yīng)用程序定義了用戶(hù)界面的結(jié)構(gòu)。該設(shè)計(jì)使用了Tailwind CSS類(lèi),以實(shí)現(xiàn)迅即響應(yīng)、又不失美感的樣式。

TypeScript
1 return (
2   <div className="flex min-h-screen">
3     <div className="w-1/2 background-image"></div>
4     <div className="w-1/2 flex flex-col justify-center p-8 bg-white bg-opacity-80">
5       <h1 className="text-4xl font-bold mb-8 text-indigo-500">Welcome to Chent</h1>
6       <div className="button-group flex justify-between mb-8">
7        <button onClick={startRecognition} className="bg-green-500">Start Listening</button>
8       <button onClick={interruptSpeech} className="bg-yellow-500">Interrupt</button>
9      </div>
10      <div className="transcript">{command}</div>
11      <div className="response">{response}</div>
12    </div>
13  </div>
14?
  • 布局是兩欄設(shè)計(jì):左側(cè)顯示背景圖像,右側(cè)包含應(yīng)用程序的主要功能。
  • 右邊部分包括一個(gè)標(biāo)題、兩個(gè)操作按鈕和兩個(gè)顯示動(dòng)態(tài)文本的區(qū)域:一個(gè)用于用戶(hù)的語(yǔ)音命令(Transcript),另一個(gè)用于AI助理的響應(yīng)(Response)。
  • 界面干凈、簡(jiǎn)潔、響應(yīng)迅速,允許用戶(hù)與智能廚房應(yīng)用程序高效交互,同時(shí)保持外觀漂亮的設(shè)計(jì)。

一旦你完成了它,就會(huì)有一個(gè)類(lèi)似下面的界面:

使用LLaMA 3.1、Firebase和Node.js,構(gòu)建一個(gè)音控的智能廚房應(yīng)用程序-AI.x社區(qū)

以上就是我們創(chuàng)建智能廚房應(yīng)用程序的整個(gè)過(guò)程。我在本例中使用了LLaMA 3.1語(yǔ)言模型,不過(guò)你可以隨意試用自己選擇的任何其他模型。?

原文標(biāo)題??Building a Voice-Powered Smart Kitchen App Using LLaMA 3.1, Firebase, and Node.js??作者:Vaibhavi Tiwari

?著作權(quán)歸作者所有,如需轉(zhuǎn)載,請(qǐng)注明出處,否則將追究法律責(zé)任
收藏
回復(fù)
舉報(bào)
回復(fù)
相關(guān)推薦
免费av在线电影| 亚洲毛片在线观看.| 日日狠狠久久偷偷四色综合免费 | 亚洲中文字幕在线观看| 国产羞羞视频在线播放| 久久国产精品99久久久久久老狼| 亚洲午夜一区二区三区| 国产精品久久久久久久美男| 欧美激情一区二区三区p站| 成人高潮成人免费观看| 国产一区二区精品| 亚洲电影天堂av| 一区二区三区四区免费观看| 懂色av蜜臀av粉嫩av喷吹| 亚洲婷婷丁香| 精品久久中文字幕| 精品麻豆av| 久久国产精品波多野结衣av | 成人乱人伦精品视频在线观看| 超碰caoprom| 日韩三级电影视频| 成人性色生活片| 久久99精品久久久久久青青91| 天天影视综合色| 蝌蚪视频在线播放| 粉嫩aⅴ一区二区三区四区| 欧美疯狂做受xxxx高潮| 日本亚洲一区二区三区| 国产黄网站在线观看| 国产综合成人久久大片91| 久久久999成人| 国产一区二区在线观看免费视频| 1pondo在线播放免费| 美女看a上一区| 在线成人激情黄色| jizzzz日本| 国产福利在线播放麻豆| 国产嫩草影院久久久久| 成人亲热视频网站| 天天爱天天做天天爽| 欧美色爱综合| 欧美美女喷水视频| 男女激烈动态图| 成人18在线| 久久久精品国产免费观看同学| 国产精品高清在线| 日本美女黄色一级片| 欧美久久久网站| 亚洲美女视频在线观看| 国产福利一区二区三区在线观看| 久久亚洲成人av| 欧美亚洲色图校园春色| 91久久国产综合久久| 亚洲欧美精品| 囯产精品久久久久久| 久久xxxx| 久久国产精品久久久久久久久久 | 丁香婷婷综合色啪| 99re在线观看| 国产www在线| 日韩精品一区二区久久| 日韩区在线观看| 日韩avxxx| 欧美精品日韩少妇| www.日本不卡| 国产精品自拍偷拍| 国产在线一区视频| 成人区精品一区二区婷婷| 亚洲男人7777| 我想看黄色大片| 综合激情久久| 在线一区二区三区四区| 潘金莲一级淫片aaaaa免费看| av成人手机在线| 国产精品久久久久影视| eeuss一区二区三区| www日本在线| 日韩av不卡在线观看| 欧美精品手机在线| 久久久久久国产精品视频| 黄色另类av| 中文字幕亚洲一区二区三区五十路| 国产精品91av| 亚洲男男av| 日韩欧美在线免费观看| 香蕉视频免费版| av白虎一区| 亚洲人一二三区| 色综合电影网| 国产在线色视频| 99热在这里有精品免费| 日韩欧美一区二区三区四区 | 黑人巨大亚洲一区二区久 | 26uuu成人| 精品乱码一区二区三四区视频| 中文无字幕一区二区三区| 久久国产精品久久| 亚洲高清精品视频| 国产成人自拍高清视频在线免费播放| 国产国语刺激对白av不卡| 成人免费看片98| 久久精品国语| 91九色极品视频| 国产一区二区三区在线观看| 久久亚洲一区| 国产成人精品日本亚洲专区61| 亚洲天堂999| eeuss鲁片一区二区三区在线观看| 日韩jizzz| freexxx性亚洲精品| 欧美日韩一区二区三区在线| 十八禁视频网站在线观看| 老色鬼在线视频| 亚洲高清免费观看| 欧美一级欧美一级| 黄色国产网站在线播放| 国产精品不卡在线| 福利网在线观看| 欧美xxx网站| 一本大道综合伊人精品热热| 亚洲人成无码www久久久| 91精品啪在线观看国产手机 | 成人黄色在线免费观看| 午夜视频在线看| 国产日产亚洲精品系列| 日韩欧美精品久久| 精品人人视频| 欧美在线色视频| 亚洲一区二区乱码| 一区三区在线欧| 久久久亚洲国产| 国产精品午夜影院| 久久一区二区三区四区五区| 丁香五月网久久综合| 日本精品一区二区三区在线播放| 欧美丝袜一区二区三区| 50一60岁老妇女毛片| 国产精品欧美日韩一区| xvideos国产精品| 在线观看 亚洲| 狠狠色丁香婷综合久久| aaa级精品久久久国产片| 欧美性天天影视| 欧美三级日本三级少妇99| 少妇无套高潮一二三区| 国产精品久久占久久| 精品少妇v888av| 国产美女免费视频| 99视频国产精品| 国产手机免费视频| 黑人巨大精品欧美一区二区桃花岛| 亚洲电影免费观看高清| 国产成人啪精品午夜在线观看| 久久精品官网| 日韩久久在线| xxxxx.日韩| 日韩精品资源二区在线| 大黑人交xxx极品hd| 99精品一区| 成人精品久久一区二区三区| 欧美成人精品一区二区男人看| 欧美日韩在线精品一区二区三区激情| 91麻豆制片厂| 国内精品免费**视频| 97超碰在线视| 国产原创一区| 美女福利精品视频| 黄色成人一级片| 日韩欧美国产网站| 亚洲天堂精品一区| 国产精品老牛| 日韩精品欧美专区| 91精品视频一区二区| 九九热精品视频| 偷拍25位美女撒尿视频在线观看| 成人欧美一区二区三区1314| 亚洲乱码中文字幕久久孕妇黑人| 日韩成人在线看| 一区二区三区国产在线观看| 一二三四区在线| 亚洲五码中文字幕| 老牛影视av老牛影视av| 日韩视频二区| 成人三级在线| 深夜福利视频一区二区| 中文字幕在线日韩| 丁香六月色婷婷| 91国在线观看| 久久久精品99| 国产亚洲人成网站| 亚洲少妇中文字幕| 日韩av午夜在线观看| www.-级毛片线天内射视视| 日本久久成人网| 91九色国产社区在线观看| av亚洲在线| 精品久久国产字幕高潮| www欧美com| 久久99九九99精品| 成年人午夜视频在线观看| 亚洲精品午夜| 国产精品久久激情| 99爱在线观看| 精品国产一区二区三区久久狼黑人| 狠狠躁日日躁夜夜躁av| 欧美日韩中文国产| 日韩精品久久久久久久酒店| 成人禁用看黄a在线| 久久久久久久香蕉| 国产99久久| 国产精品美女免费看| 91福利在线免费| 久久影院资源网| 精品国自产在线观看| 欧美性色xo影院| 久久国产精品二区| 1024成人网| 国产又黄又粗又猛又爽的| 久久综合九色综合欧美就去吻| 99久久久无码国产精品6| 中出一区二区| 国产精品国产三级国产专区53| 蜜臀av在线播放| 亚洲成avwww人| 人人干人人干人人干| 亚洲精品久久嫩草网站秘色| 性生交大片免费看l| 奇米色一区二区三区四区| 99999精品视频| 伊人久久亚洲影院| 欧美日韩一区二区三区在线观看免| free性欧美| 欧美国产视频日韩| 国产欧美久久久久久久久| 色七七影院综合| 成人午夜视频一区二区播放| 日韩一区二区精品葵司在线| 91在线你懂的| 欧美美女激情18p| 国产一区二区在线视频聊天| 欧美丝袜丝nylons| 成人免费黄色小视频| 国产精品三级电影| 欧美乱大交做爰xxxⅹ小说| 国产蜜臀av在线一区二区三区| 熟女俱乐部一区二区| 久久久久久综合| 国产aⅴ激情无码久久久无码| 狠狠色综合日日| 一个色综合久久| 一本色道久久综合亚洲精品高清| 欧美一区二区视频在线播放| 色综合中文网| 日韩三级电影| 日韩在线观看电影完整版高清免费悬疑悬疑 | 色屁屁影院www国产高清麻豆| 偷拍一区二区三区四区| 国产黄色片免费看| 色噜噜狠狠色综合欧洲selulu| 波多野结衣高清视频| 欧美三区免费完整视频在线观看| 亚洲最新av网站| 日韩一级高清毛片| 国产综合在线播放| 国产视频亚洲视频| 国产乱淫a∨片免费视频| 无吗不卡中文字幕| 日日夜夜操视频| 亚洲大尺度视频在线观看| 国产无遮挡又黄又爽| 欧美性xxxx极品高清hd直播| 99久久久久久久久| 欧美乱妇15p| 黑人操亚洲女人| 亚洲日本成人网| 四虎永久在线观看| 日韩一区二区三区免费看 | 粉嫩aⅴ一区二区三区四区| 国产一线在线观看| 欧美激情在线一区二区三区| 久久精品亚洲a| 久久久久久久久久久黄色| 91精品国产福利| 国产毛片欧美毛片久久久| 国产精品久久久一本精品| 久久久久99精品成人片毛片| 色一情一乱一乱一91av| 97在线视频人妻无码| 日韩国产高清视频在线| 国产成人av免费看| 在线不卡的av| 美日韩一二三区 | 91精品视频免费在线观看| 精品国产三级a在线观看| 黄色软件在线| 欧美激情视频一区二区三区不卡| 伊人久久在线| 成人精品一二区| 欧美色图国产精品| 精品少妇人妻av免费久久洗澡| 另类小说一区二区三区| www.日本xxxx| 久久亚洲精选| 岛国精品一区二区三区| 国产精品美女www爽爽爽| 久久久久久久久久影院| 日韩午夜av一区| 91成人高清| 国产69久久精品成人| 成人观看网址| 91麻豆国产精品| 精品国产一区二区三区香蕉沈先生| 欧美精品七区| 欧美精品入口| 日韩在线观看a| 久久国产夜色精品鲁鲁99| 少妇光屁股影院| 久久久www成人免费无遮挡大片| 国模无码国产精品视频| 樱花草国产18久久久久| 中文在线免费看视频| 欧美精品乱码久久久久久按摩 | 日韩在线精品强乱中文字幕| 四虎永久国产精品| 久久久久.com| 野外性满足hd| 欧美天堂在线观看| 日本1级在线| 国产亚洲一区二区精品| www.亚洲免费| 国产成人精品999| 要久久爱电视剧全集完整观看| 日韩视频在线视频| 成人自拍视频在线| 精品无码一区二区三区电影桃花| 在线成人av网站| 超碰在线caoporen| 91精品综合视频| 午夜精品av| 欧美日韩一道本| 日韩高清不卡一区二区三区| 色18美女社区| 成人免费小视频| 国产特级aaaaaa大片| 欧美成年人网站| 亚洲日本va| 日韩五码在线观看| 99国产欧美久久久精品| 91大神福利视频| 欧美日韩久久久| 少妇一级淫片免费看| 午夜精品久久17c| 久久久加勒比| 在线观看成人av| 国产亚洲成人一区| 亚洲黄色在线网站| 色爱区综合激月婷婷| av在线中文| 91精品国产综合久久香蕉的用户体验 | 精品久久久久久久久久久久| 色屁屁草草影院ccyycom| 91av视频在线播放| 四虎精品永久免费| 久久精品美女| 久久综合狠狠| 啪啪一区二区三区| 欧美va在线播放| 色是在线视频| 亚洲7777| 国产成a人无v码亚洲福利| 日韩久久久久久久久| 亚洲美女激情视频| 六九午夜精品视频| 男人添女荫道口喷水视频| 久久综合一区二区| 91亚洲国产成人久久精品麻豆| 欧美精品在线免费播放| 色狼人综合干| 91黄色在线看| 久久精品夜夜夜夜久久| 国产免费黄色录像| 久久久亚洲网站| 精品视频网站| 亚洲一区和二区| 色婷婷激情一区二区三区| 黄色在线播放网站| 国产综合av一区二区三区| 欧美日韩国产高清| 极品白嫩丰满美女无套| 欧美中文字幕一二三区视频| 2021国产在线| 92看片淫黄大片欧美看国产片| 成人高清电影网站| 蜜桃视频无码区在线观看| 一本大道久久a久久综合| 国产区在线看| 特级西西444www大精品视频| 成人av综合一区| 在线观看色网站| 欧美孕妇与黑人孕交|