精品欧美一区二区三区在线观看 _久久久久国色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一区二区三| 自由日本语热亚洲人| 日韩一区在线播放| 美日韩免费视频| 国产成人麻豆精品午夜在线| 久久一区欧美| 欧美高清性猛交| 欧美午夜激情影院| 粉嫩的18在线观看极品精品| 欧美日韩一二区| 欧美人成在线观看| 动漫一区在线| 久久精品一区四区| 国产精品一区二区三区精品| 亚洲熟妇无码久久精品| 激情久久中文字幕| 久久精品视频在线| 欧美大波大乳巨大乳| 91成人在线精品视频| 欧美日韩在线一区二区| 国产午夜福利视频在线观看| 天堂av在线电影| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 亚洲国产精品第一区二区三区| 伊人久久综合97精品| 奇米777第四色| 麻豆一区在线| 欧美日高清视频| 欧美精品一区二区三区免费播放| 女人天堂av在线播放| 亚洲天堂精品在线观看| 亚洲v国产v| 国产在线视频网址| 91视频你懂的| 久99久视频| 天堂在线中文字幕| 懂色av中文字幕一区二区三区 | 国产精品国产精品国产| 99亚洲伊人久久精品影院红桃| 欧美成人中文字幕| 国产免费一区二区三区四区| 你微笑时很美电视剧整集高清不卡| 欧美r级电影在线观看| 中文 日韩 欧美| 成人在线啊v| 91.com在线观看| 日韩a一级欧美一级| 亚洲欧美专区| 7777精品伊人久久久大香线蕉的 | 特级西西444www大精品视频| 国产一级二级三级在线观看| 久久新电视剧免费观看| 久久手机视频| 毛片免费在线观看| 国产婷婷色一区二区三区四区| 欧美男人的天堂| 久久久久久女乱国产| 久久久久88色偷偷免费| 免费av在线一区二区| 日夜干在线视频| 中文字幕精品一区二区三区精品| 日韩成人在线资源| 在线观看黄av| 亚洲手机成人高清视频| 300部国产真实乱| 色呦呦网站在线观看| 亚洲h在线观看| 任你操这里只有精品| 91成人在线| 7777精品伊人久久久大香线蕉完整版 | 亚洲国产欧美一区二区三区不卡| √新版天堂资源在线资源| 国产精品久久久久久久久免费桃花| 综合色婷婷一区二区亚洲欧美国产| 国产视频一区二区| 亚洲国产成人av好男人在线观看| 国产午夜福利100集发布| 欧美动物xxx| 69堂国产成人免费视频| 免费看黄色片的网站| 国产在线观看91一区二区三区| 色偷偷偷综合中文字幕;dd| 午夜少妇久久久久久久久| 中文一区在线| 国产美女被下药99| 后进极品白嫩翘臀在线视频| 久久久激情视频| 99久久久无码国产精品性色戒| 青青青国内视频在线观看软件| 欧美日韩亚洲一区二| 久久婷婷综合色| 亚洲日本va中文字幕| 亚洲精品一区二区网址| 熟女av一区二区| 国产欧美日韩亚洲一区二区三区| 国产精品久久久久影院日本| 国产高清免费观看| 国产日韩欧美精品综合| 免费成人进口网站| 经典三级一区二区| 日韩欧美中文一区| a资源在线观看| 亚洲人成久久| 91免费电影网站| 男女污污视频在线观看| 一区二区三区在线观看国产| 日韩精品一区二区三区不卡 | 蜜臀av性久久久久蜜臀av麻豆| 高清av免费一区中文字幕| www.成人.com| 欧美午夜电影在线| 色诱av手机版| 91嫩草亚洲精品| 日韩美女视频在线观看| 国产91久久久| 亚洲激情成人在线| 九色porny自拍| 国产不卡一二三区| 久久久久久久久久国产| 国产视频在线免费观看| 中文字幕av资源一区| 免费无码av片在线观看| 超碰cao国产精品一区二区| www日韩欧美| 中文字幕有码视频| 久久久久国产精品麻豆| 日本黄色三级大片| 香蕉久久99| 国外视频精品毛片| 亚洲av无码一区二区三区性色| 国产精品麻豆视频| 亚洲老女人av| 成人在线免费观看视频| 国产精品久久久久久久久久久久久| 污视频网站免费观看| 偷窥少妇高潮呻吟av久久免费| 麻豆精品国产传媒| 欧美视频一区| 99在线高清视频在线播放| √天堂8在线网| 日韩精品一区在线| 久久久久亚洲av无码专区 | 欧美videos极品另类| 欧美日韩视频在线观看一区二区三区 | 中文字幕乱码亚洲精品一区| 亚洲少妇第一页| 精品国产精品国产偷麻豆| 日本伊人精品一区二区三区介绍| 先锋av资源站| 岛国视频午夜一区免费在线观看| 美女100%无挡| 日韩高清不卡一区二区三区| 亚洲mv在线看| 伊人久久大香线蕉综合影院首页| 视频在线一区二区| 国产夫绿帽单男3p精品视频| 亚洲国产视频直播| 日本丰满少妇裸体自慰| 天堂一区二区在线免费观看| 性欧美videosex高清少妇| 成人全视频免费观看在线看| 播播国产欧美激情| 99热这里只有精品在线观看| 亚洲国产日韩一区二区| 久久一区二区电影| 热久久一区二区| 亚洲国产精品女人| 国产劲爆久久| 日本不卡免费高清视频| 思思99re6国产在线播放| 欧美一区二区三区四区久久| 国产一级片免费| 国产视频911| 国产亚洲色婷婷久久| 欧美99久久| 欧美精品在线一区| 国产精品视频一区二区三区综合 | 亚洲精品国产精品国自产观看浪潮| 久久99国产综合精品免费| 国产精品久久久99| 国产在线不卡av| 日本午夜精品视频在线观看| 国产成人三级视频| 亚洲综合小说图片| 91精品中文在线| 中国色在线日|韩| 久久精品国产亚洲一区二区 | 99久久伊人网影院| 五月激情婷婷在线| 国产农村妇女精品一二区| 亚洲在线播放电影| 牛牛精品成人免费视频| 国产欧美精品在线| 涩涩在线视频| 欧美成人午夜激情| 国产黄色免费在线观看| 亚洲成av人片在线观看香蕉| 中文字幕在线网址| 精品成人av一区| 91免费公开视频| 久久久久久久免费视频了| 久久久久中文字幕亚洲精品| 日韩国产欧美视频| 九色在线视频观看| 午夜欧美视频| 亚洲一区二区三区色| 女人丝袜激情亚洲| 肥熟一91porny丨九色丨| 日韩第二十一页| 欧美亚洲第一页| 啦啦啦中文在线观看日本| 精品久久久999| eeuss影院www在线播放| 亚洲欧美日韩精品久久| 日本精品一二区| 日韩片之四级片| 国产免费无遮挡| 欧美日韩aaaaaa| 亚洲精品一区二三区| 精品国产乱码久久久久久虫虫漫画| 男女性高潮免费网站| 欧美国产精品专区| 一色道久久88加勒比一| av一区二区不卡| 无码人妻精品一区二区三| 国产69精品久久777的优势| 亚洲制服中文字幕| 精品制服美女丁香| 天天干天天爽天天射| 蜜臀久久99精品久久久久久9| 人妻内射一区二区在线视频| 亚洲欧美日韩国产一区二区| 僵尸世界大战2 在线播放| 黑人一区二区三区四区五区| 18黄暴禁片在线观看| 欧美午夜视频| www.av91| 国产精品毛片| 大肉大捧一进一出好爽视频| 国产亚洲网站| 国产成人精品视频免费看| 国产精品久久777777毛茸茸 | 性欧美1819sex性高清| 欧美一级视频免费在线观看| 亚洲午夜天堂| 国产91热爆ts人妖在线| 影视一区二区三区| 国产美女主播一区| 麻豆精品在线| 国产乱码精品一区二区三区卡| 久久免费视频66| 久久久久久久久久久一区| 最新国产精品视频| 亚洲精品视频一二三| 五月精品视频| 日韩人妻无码精品久久久不卡| 99国内精品| 密臀av一区二区三区| 寂寞少妇一区二区三区| 日韩精品xxx| 91蝌蚪porny| 夫妇交换中文字幕| 亚洲女人的天堂| 伊人久久综合视频| 在线视频一区二区三| 国产一区二区视频免费观看| 日韩精品一区二区三区在线| 头脑特工队2免费完整版在线观看| 亚洲片av在线| 超碰在线最新| 777777777亚洲妇女| 成人免费毛片嘿嘿连载视频…| 亚洲最大福利网| 亚洲三级精品| 日本特级黄色大片| 亚洲大胆视频| wwww.国产| 国产99精品在线观看| 四虎影成人精品a片| 综合久久给合久久狠狠狠97色 | 欧美日韩在线观看一区二区| 亚洲精品久久久久avwww潮水| 亚洲精品视频免费| 国产区在线观看| 欧美综合一区第一页| 日韩一级特黄| 就去色蜜桃综合| 中文无码久久精品| 精品国产成人av在线免| 国产一区欧美二区| 亚洲综合网在线观看| 一级做a爱片久久| 中国女人真人一级毛片| 亚洲国产99精品国自产| 美女免费久久| 日本不卡高字幕在线2019| 中文字幕日韩高清在线| 亚洲国产精品视频一区| 国产视频一区三区| 4438x全国最大成人| 亚洲国产精品ⅴa在线观看| 日韩欧美一区二区一幕| 这里只有精品电影| 国产视频福利在线| 国内精品久久久久久久久| 亚洲精品成人一区| 日本婷婷久久久久久久久一区二区| 国产精品jizz在线观看美国| 超碰超碰在线观看| 久久免费偷拍视频| 国产奶水涨喷在线播放| 欧美一区二区三区四区视频| 91看片在线观看| 日本在线精品视频| 羞羞色国产精品网站| 日韩a级在线观看| 国产成人午夜精品影院观看视频 | 中文字幕乱码亚洲无线精品一区| 亚洲人成无码www久久久| av在线一区二区| 国产大片中文字幕在线观看| 91精品国产综合久久精品图片| av在线免费一区| 国产精品欧美激情| gogogo高清在线观看一区二区| 黄色a级片免费| 91麻豆精品一区二区三区| 日韩精品久久久久久久| 日韩精品中文字幕在线一区| 中文字幕资源网在线观看| 成人av番号网| 99热在线成人| 日韩av加勒比| 亚洲女爱视频在线| 国产丰满美女做爰| 色综合天天狠天天透天天伊人| 久久国产精品美女| 国产四区在线观看| 国产精品一区二区免费不卡 | 亚洲色图欧美色| 欧美三级电影精品| 欧美成年黄网站色视频| 成人黄色免费片| 欧美国内亚洲| 中文字幕99页| 性久久久久久久| 青青青草原在线| 国产精品成人播放| 日韩理论电影院| 国产农村妇女精品久久| 亚洲精品免费在线| 成人免费视频国产| 97精品视频在线观看| 综合亚洲色图| 国产三级三级看三级| 亚洲男同性视频| 天天干视频在线| 日本一本a高清免费不卡| 色喇叭免费久久综合网| www.偷拍.com| 欧美日韩国产在线| 亚洲欧美丝袜中文综合| 国产成人精品久久亚洲高清不卡| 欧洲杯半决赛直播| 日韩av影视大全| 午夜伊人狠狠久久| 阿v免费在线观看| av激情久久| 久久激情一区| 尤物在线免费视频| 精品对白一区国产伦| 伊人久久高清| 2022中文字幕| 久久久三级国产网站| 国产理论视频在线观看| 98视频在线噜噜噜国产| 日韩精品影视| 麻豆精品国产传媒av| 欧美日韩在线播放一区| xxx性欧美| 图片区小说区区亚洲五月| 粉嫩av一区二区三区在线播放| 久久99国产综合精品免费| 欧美成人免费全部| 国产精品一区二区三区av麻 | 欧美成人一二三| 国产免费av一区二区三区| 免费高清视频在线观看| 欧美午夜精品久久久久久浪潮| 日韩精品毛片| 久久精品国产精品国产精品污 | 精品午夜一区二区三区在线观看| 精品在线视频免费| 日韩在线观看av|