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

使用LLaMA 3.1、Firebase和Node.js,構建一個音控的智能廚房應用程序

譯文 精選
人工智能
我在本教程中將介紹從設置Firebase、配置LLaMA以操控語音命令到實時存儲和管理購物清單的整個過程。

譯者 | 布加迪

審校 | 重樓

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

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

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

我在本教程中將介紹從設置Firebase、配置LLaMA以操控語音命令到實時存儲和管理購物清單的整個過程。

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

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

1. 安裝Node.js和npm

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

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

啟動終端,進入到你想要創(chuàng)建項目的位置。之后,運行這些命令:

  • npx create-next-app@latestsmart-kitchen app(使用@latest標志,npm可獲得最新版本的Next.js啟動設置。)
  • cd smart-kitchen-app

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

  • 你想使用TypeScript嗎?
  • 你想使用ESLint嗎?
  • 你想使用Tailwind CSS嗎?
  • 你想使用src/目錄嗎?
  • 你想使用App Router(應用路由器)嗎?
  • 你想定制默認導入別名嗎?

3. 安裝Firebase和Material-UI

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

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

設置Firebase

  • 在Firebase控制臺上啟動一個新項目。
  • 項目創(chuàng)建完畢后,點擊“添加應用程序”,選擇web平臺(</>)。
  • 當你注冊應用程序時給它取個名字,比如“smart-kitchen-app”。
  • 復制Firebase設置文件。之后,這個副本很有用。

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

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

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令牌?

我們將使用來自OpenRouter的免費版本LLaMA 3.1,為此,我們需要獲得API令牌。以下是獲得API令牌的幾個步驟:

第1步:注冊或登錄到OpenRouter

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

第2步:導航進入到API密鑰設置

  • 登錄后,進入到儀表板。
  • 在儀表板中,查找API或開發(fā)人員工具部分。
  • 點擊API密鑰或令牌選項。

第3步:生成新的API密鑰

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

第4步:復制API密鑰

  • 生成API密鑰后,它將顯示在屏幕上。立即復制API密鑰,因為一些服務在你離開頁面后可能不會再次顯示它。
  • 將API密鑰安全地存儲在環(huán)境配置文件中(比如.env.local)。

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

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

OPENROUTER_API_KEY = your-generated-api-key-here

確保將your-generated-api-key-here換成你復制的實際的API密鑰。

第6步:在應用程序中使用API密鑰

  • 現(xiàn)在你已經將API密鑰存儲在.env. local文件中,就可以在應用程序中使用它。
  • 通過服務器端代碼中的process.env.OPENROUTER_API_KEY或發(fā)出API請求時訪問密鑰。確保密鑰安全,避免將其暴露給生產級應用程序中的客戶端。

構建核心邏輯,導入LLaMa 3.1以創(chuàng)建智能廚房應用程序響應

創(chuàng)建一個名為app的新文件夾,并在其下創(chuàng)建一個名為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

這段代碼定義了一個POST API端點,該端點使用LLaMA 3.1模型從用戶的語音命令中提取特定信息(商品名稱和數(shù)量),專注于提供JSON格式的結構化數(shù)據(jù)。

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

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

在app文件夾下,創(chuàng)建一個名為Llama的子文件夾,文件名為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為廚房助理應用程序設置了POST API端點,使其能夠利用OpenRouter AI和LLaMA 3.1模型通過語音輸入處理用戶命令。終端先建立一個引導AI行為的系統(tǒng)提示,確保交互友好、清晰、得到支持,特別是與食譜建議、購物清單創(chuàng)建和烹飪技巧等廚房任務相關方面。一收到POST請求,系統(tǒng)從請求主體部分提取用戶的命令,并將其與系統(tǒng)提示一起轉發(fā)給OpenRouter AI API。

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

在app文件夾下,創(chuàng)建一個名為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

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

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

構建智能廚房應用程序的核心組件

第1步:導入和狀態(tài)設置

導入必要的依賴項并設置狀態(tài)變量,以管理用戶輸入和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組件,并為用戶命令、響應和語音識別初始化狀態(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步:處理語音命令

這段代碼處理用戶的語音命令。它驗證命令是否有結束語句(比如“thank you”)來結束對話,或者它是否有諸如“建議食譜”或“向食品儲藏室添加商品”之類的短語。根據(jù)給定的命令,它激活相關的操作(比如“建議食譜”或“發(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端點的POST請求來處理一般命令,端點通過LLaMA模型處理命令。來自AI的響應被設置為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步:為購物清單添加商品

該函數(shù)將商品添加到Firebase中的購物清單中。它估算過期日期,更新Firestore文檔,并通過設置響應并大聲朗讀響應來確認已添加給用戶。

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步:語音識別

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

在這段代碼中,我使用WebSpeech API的SpeechRecognition接口來啟用應用程序中的語音命令功能。

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,或者對于像Chrome這樣通過webkit前綴支持它的瀏覽器,退回到webkitSpeechRecognition。這個API允許應用程序監(jiān)聽用戶的語音輸入,將其轉換成文本,然后將其作為命令來處理。

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

使用這個API,該應用程序可以通過語音命令與用戶進行交互,支持諸多功能,比如將商品添加到購物清單、建議食譜或檢索食品儲藏室的食材,使體驗更自動化、交互式。

你可以使用Whisper或所選擇的任何其他語音識別機制。

創(chuàng)建前端組件

這個TSX布局為你的智能廚房應用程序定義了用戶界面的結構。該設計使用了Tailwind CSS類,以實現(xiàn)迅即響應、又不失美感的樣式。

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
  • 布局是兩欄設計:左側顯示背景圖像,右側包含應用程序的主要功能。
  • 右邊部分包括一個標題、兩個操作按鈕和兩個顯示動態(tài)文本的區(qū)域:一個用于用戶的語音命令(Transcript),另一個用于AI助理的響應(Response)。
  • 界面干凈、簡潔、響應迅速,允許用戶與智能廚房應用程序高效交互,同時保持外觀漂亮的設計。

一旦你完成了它,就會有一個類似下面的界面:

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

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

責任編輯:姜華 來源: 51CTO內容精選
相關推薦

2022-05-09 17:33:23

PWA漸進式Web應用程序離線優(yōu)先

2024-03-22 11:40:40

Node.jsNodeCRUD

2024-03-27 11:18:02

2013-03-28 14:54:36

2020-09-04 15:06:04

Docker容器化Node.js

2013-05-17 09:41:02

Node.js云應用開發(fā)IaaS

2020-09-22 07:35:42

Node.jsVue.js文件壓縮

2022-12-14 14:40:27

Node.js開發(fā)應用程序

2025-05-06 08:23:56

Llama 4AutoGenAI智能體

2018-11-14 19:00:24

PythonRedis共享單車

2010-07-12 10:11:27

ibmdwWeb

2023-09-21 08:00:00

ChatGPT編程工具

2021-07-14 17:39:46

ReactRails API前端組件

2020-08-07 10:40:56

Node.jsexpress前端

2023-03-07 14:31:44

Node.jsPython應用程序

2022-09-12 16:02:32

Docker安全Node.js

2025-11-21 08:00:00

FirebaseGeminiAI智能體

2023-01-10 14:11:26

2025-07-24 09:08:31

2020-01-15 14:20:07

Node.js應用程序javascript
點贊
收藏

51CTO技術棧公眾號

久久久久成人网站| 欧美色爱综合| 亚洲一本视频| 欧美三级一区二区| 91sao在线观看国产| 国产美女18xxxx免费视频| 黄色小视频免费在线观看| 97视频精品| 在线视频一区二区三| 久久99精品久久久久久秒播放器| 中文字幕在线2021| 96sao精品免费视频观看| 国产亚洲人成网站| 555www成人网| 黄色av网址在线观看| 丁香花视频在线观看| 精品国产欧美日韩| 色综合视频在线观看| 国产福利久久| 久久丫精品久久丫| 欧美色图激情小说| 日韩电影免费观看中文字幕| 免费拍拍拍网站| 后进极品白嫩翘臀在线视频| 男男视频亚洲欧美| 久久亚洲私人国产精品va| 亚洲观看高清完整版在线观看| 九九热在线精品视频| 亚洲一级片网站| 丁香婷婷在线观看| 日韩影院在线观看| www.亚洲一区| 国产农村妇女精品久久| 中文字幕有码在线视频| 国产白丝精品91爽爽久久 | 少妇高潮一区二区三区99小说| 伊人成人网在线看| 久久精品男人天堂| 91人妻一区二区| www在线观看黄色| 久久嫩草精品久久久精品| 国产精品99久久久久久久久久久久| 天堂久久精品忘忧草| 国产综合色区在线观看| 国产精品三级视频| 444亚洲人体| 日韩欧美高清在线观看| 九色精品91| 777a∨成人精品桃花网| 福利视频一二区| 成人亚洲综合天堂| 国产成人精品综合在线观看| 欧美在线观看一区二区三区| 亚洲调教欧美在线| 风间由美中文字幕在线看视频国产欧美| 五月天久久比比资源色| 视频一区国产精品| 亚洲精华国产精华精华液网站| 国产精品一卡| 久久精品国产91精品亚洲| 超薄肉色丝袜一二三| 一区中文字幕电影| 在线看日韩精品电影| 国产精品视频黄色| 国产精品69xx| 午夜久久福利影院| 日韩视频在线观看视频| 天堂av在线7| 国产中文字幕一区| 欧美一级淫片丝袜脚交| 日韩精品久久久久久免费| 国产精品99视频| 日韩精品免费在线| 一道本在线观看| 日韩一区二区在线| 日韩av有码在线| 无码国产69精品久久久久同性| 亚洲91网站| 欧美精品777| 亚洲欧美另类动漫| 麻豆视频久久| 在线播放91灌醉迷j高跟美女 | av免费观看网| 97超碰在线公开在线看免费| 午夜久久久久久久久久一区二区| 热久久精品免费视频| 国产高清视频色在线www| 精品国产91乱高清在线观看| 91欧美视频在线| jizzjizzjizz欧美| 欧美日产国产精品| 色七七在线观看| 青草伊人久久| 亚洲人在线视频| 粉嫩av懂色av蜜臀av分享| 精品高清在线| 欧美国产日韩一区| 日韩视频中文字幕在线观看| 亚洲成色精品| 91精品久久久久久久久中文字幕| 中文字幕 国产| 日韩中文字幕亚洲一区二区va在线 | 国产性生活网站| 日韩精品乱码免费| 国产一区自拍视频| 国模无码一区二区三区| 日本一区二区视频在线观看| 日本免费高清一区| 精品影院一区| 欧美国产日韩a欧美在线观看| 欧美一区二区三区四区夜夜大片 | 同心难改在线观看| 亚洲免费三区一区二区| 在线无限看免费粉色视频| 美女扒开腿让男人桶爽久久软| 亚洲成av人影院| 五月花丁香婷婷| 国产影视精品一区二区三区| 国产亚洲欧洲黄色| 69xxx免费| 亚洲一区国产| 日韩av片免费在线观看| 九九热最新视频| 麻豆成人在线观看| 96pao国产成视频永久免费| 午夜精品久久久久久久99热黄桃 | 波多野一区二区| 91精品国产色综合久久| 国产精品99精品无码视亚| 国产91精品入| 欧美久久精品一级黑人c片| 欧美日韩人妻精品一区二区三区 | 亚洲成熟丰满熟妇高潮xxxxx| 欧美色网一区| 欧美精品自拍偷拍| wwwww黄色| 日韩av在线发布| 国产一区私人高清影院| www.国产免费| 亚洲色图丝袜美腿| www.中文字幕在线| 精品国产午夜肉伦伦影院| 亚洲色图13p| 亚洲影院在线播放| 久久先锋影音av鲁色资源| 又粗又黑又大的吊av| 欧美aaaaa级| 中文字幕日韩综合av| 私库av在线播放| 国产一区二区三区视频在线播放| 日日噜噜夜夜狠狠久久丁香五月| 黄色污网站在线观看| 亚洲国产精品va在看黑人| 你懂得视频在线观看| 欧美日韩爆操| 国产精品丝袜白浆摸在线| 欧美一级淫片aaaaaa| 国产精品乱人伦中文| 8x8x成人免费视频| 精品一区在线| 国产精品白嫩美女在线观看| 性一交一乱一精一晶| 亚洲国产视频直播| 亚洲国产精品三区| 欧美黄色录像| 国产精品扒开腿爽爽爽视频 | 国产精品成人一区二区三区夜夜夜| wwwwww欧美| 成人在线免费| 亚洲精品第一页| 国产av无码专区亚洲av毛网站| 国产麻豆精品95视频| 日韩福利一区二区三区| 国产三级电影在线播放| 亚洲男人天堂久| 日韩乱码在线观看| 国产在线精品一区二区不卡了| 超碰97在线看| 久久女人天堂| 一区二区三区www| 成年人午夜视频| 国产蜜臀av在线一区二区三区 | 99视频一区二区| 在线观看免费91| 精品亚洲美女网站| 亚洲成人网在线观看| 亚洲乱码国产乱码精品| a美女胸又www黄视频久久| 99草草国产熟女视频在线| 66视频精品| 亚洲伊人成综合成人网| 成人免费看视频网站| 日韩精品免费看| 国产人妖一区二区三区| 一区在线播放视频| 想看黄色一级片| 亚洲视频1区| 国产又黄又爽免费视频| 久草成人在线| 国产伦精品一区二区三区高清| av在线免费网站| 91超碰这里只有精品国产| 男人的天堂一区| 亚洲免费视频成人| 天天摸日日摸狠狠添| 2023国产一二三区日本精品2022| 亚洲欧美日韩一二三区| 免费高清成人在线| 又粗又黑又大的吊av| 国自产拍偷拍福利精品免费一| 成人欧美视频在线| yiren22亚洲综合| 欧美最近摘花xxxx摘花| 欧美xxxx黑人又粗又长| 欧美大片拔萝卜| 日本一二三区视频| 亚洲免费在线视频| 国产高清视频免费在线观看| 国产一区二区三区免费播放| 久久精品香蕉视频| 亚洲在线日韩| 热99这里只有精品| 不卡在线一区二区| 久久国产精品久久| 久久a爱视频| 国产98在线|日韩| 日韩免费精品| 97超级在线观看免费高清完整版电视剧| 色成人免费网站| 国产精品成人国产乱一区| 国产精品13p| 91精品国产777在线观看| 欧美aaa免费| 久久久久久久久久久成人| 日韩二区三区| 欧美日韩国产影片| 中文字幕福利视频| 欧美日精品一区视频| 精品国产青草久久久久96| 亚洲男人的天堂一区二区| 久久久久久久麻豆| 亚洲欧美激情视频在线观看一区二区三区| 狂野欧美性猛交| ㊣最新国产の精品bt伙计久久| 在线观看美女av| 91麻豆文化传媒在线观看| 性欧美1819| 毛片av中文字幕一区二区| 三级一区二区三区| 国产精品69久久久久水密桃| www.黄色网| 成人sese在线| 一本一道久久a久久综合蜜桃| 日韩av一区二区在线影视| 中文字幕亚洲乱码| 国产精品一区在线| 亚洲精品久久一区二区三区777| 成人精品国产福利| 91精彩刺激对白露脸偷拍| 亚洲国产精品黑人久久久| 午夜激情福利电影| 久久久精品蜜桃| 韩国三级丰满少妇高潮| 肉肉av福利一精品导航| 手机看片福利盒子久久| 久久99精品久久久| 欧洲av无码放荡人妇网站| 欧美在线1区| 亚洲 国产 日韩 综合一区| 久久婷婷蜜乳一本欲蜜臀| 五月天激情图片| 校园激情久久| 五月婷婷之婷婷| 成人精品一区二区三区四区| 国内自拍第二页| 成人久久18免费网站麻豆| mm131丰满少妇人体欣赏图| 综合中文字幕亚洲| 久久精品性爱视频| 亚洲永久免费av| 9999热视频| 亚洲成a人在线观看| 日韩电影在线观看一区二区| 91精品国产手机| 欧美视频综合| 精品亚洲永久免费精品 | 亚洲男人天堂2019| 黄av在线免费观看| 久久精品99久久久香蕉| 黄色漫画在线免费看| 国产中文字幕日韩| 日本成人中文| 天天操天天干天天玩| 午夜亚洲视频| 人妻巨大乳一二三区| 久久久久亚洲蜜桃| 久操视频免费在线观看| 亚洲一区二区三区在线播放| 波多野结衣电车痴汉| 精品久久久久av影院| 免费观看的毛片| 日韩在线视频观看正片免费网站| 69视频在线| 日韩一区二区久久久| 成人美女黄网站| 成人三级在线| 999久久久精品国产| 亚洲 中文字幕 日韩 无码| www.在线成人| 久久精品99久久久久久| 欧美男男青年gay1069videost| 男人天堂综合| 777午夜精品福利在线观看| 精品一区二区三区中文字幕| 西游记1978| 丝袜诱惑亚洲看片| 国内自拍第二页| 欧美激情在线一区二区| 中文字幕免费观看| 精品国产麻豆免费人成网站| 亚洲 美腿 欧美 偷拍| 亚洲人成欧美中文字幕| а√天堂8资源中文在线| 动漫精品视频| 国产一区二区三区四区老人| 免费欧美一级片| 亚洲精品国产精品乱码不99| 日本午夜视频在线观看| 欧美性生活久久| av一区二区三| 亚洲欧美国产日韩天堂区| 高清毛片在线观看| 国精产品99永久一区一区| 禁久久精品乱码| 超碰caoprom| 国产欧美综合在线观看第十页| 一级片免费网址| 亚洲精品久久久久久久久| 福利影院在线看| 久久国产主播精品| 亚洲免费一区二区| 久久精品成人av| 在线日韩国产精品| 91在线免费看| 亚洲xxxxx性| 欧美日韩网址| 精品人妻一区二区免费| 亚洲va欧美va人人爽午夜| 五月婷中文字幕| 日韩免费视频在线观看| 日本精品三区| 色网站在线视频| 亚洲成人精品影院| 精品无吗乱吗av国产爱色| 国产精品十八以下禁看| 免费福利视频一区| 欧美视频第一区| 中文字幕乱码亚洲精品一区| 99er热精品视频| 久久久久久久久久久免费精品| 猫咪成人在线观看| 999在线免费视频| 综合在线观看色| 肥臀熟女一区二区三区| 欧美亚洲激情在线| 精品久久久久久久久久久aⅴ| 亚洲18在线看污www麻豆| 夜夜爽夜夜爽精品视频| 麻豆av电影在线观看| 国产日韩欧美在线| 国产精品videosex极品| 精品无码一区二区三区| 欧美精品v日韩精品v韩国精品v| av资源网在线播放| 97se国产在线视频| 亚洲一卡久久| 小早川怜子一区二区的演员表| 精品日韩欧美在线| 欧美不卡高清一区二区三区| 激情五月五月婷婷| 久久欧美一区二区| 国内精品久久久久久久久久 | а天堂中文最新一区二区三区| 99久久99久久精品| 久久草av在线| 日韩大片免费在线观看| 中文字幕日韩视频| 999久久久精品一区二区| 成人性视频欧美一区二区三区| 亚洲色图欧美激情| 亚洲人视频在线观看| 91久久精品国产| 2023国产精品久久久精品双| 9.1成人看片| 一本久道中文字幕精品亚洲嫩| 黄色在线免费| 色噜噜狠狠色综合网| 91在线小视频| 好吊色在线视频| 九九视频直播综合网|