Gradio全解11——Streaming:流式傳輸的視頻應用(9)——使用FastRTC+Gemini創建沉浸式音頻+視頻的藝術評論家

Gradio全解11——Streaming:流式傳輸的視頻應用(9)——使用FastRTC+Gemini創建沉浸式音頻+視頻的藝術評論家

    • 11.9 使用FastRTC+Gemini創建實時沉浸式音頻+視頻的藝術評論家
      • 11.9.1 準備工作及音頻圖像編碼器
        • 1. 項目說明及準備工作
        • 2. 音頻和圖像編碼器
      • 11.9.2 使用Gemini+fastrtc.Stream進行音視頻處理
        • 1. GeminiHandler:實時音視頻發送與接受
        • 2. 設置流媒體fastrtc.Stream對象并啟動UI
      • 11.9.3 Gradio.Blocks替換Stream.ui實現自定義界面
        • 1. 實現代碼及解讀
        • 2. 運行效果及參考資源

本章目錄如下:

  1. 《Gradio全解11——Streaming:流式傳輸的視頻應用(1)——FastRTC:Python實時通信庫》
  2. 《Gradio全解11——Streaming:流式傳輸的視頻應用(2)——Twilio:網絡服務提供商》
  3. 《Gradio全解11——Streaming:流式傳輸的視頻應用(3)——YOLO系列模型技術架構與實戰》
  4. 《Gradio全解11——Streaming:流式傳輸的視頻應用(4)——基于Gradio.WebRTC+YOLO的實時目標檢測》
  5. 《Gradio全解11——Streaming:流式傳輸的視頻應用(5)——RT-DETR:實時端到端檢測模型》
  6. 《Gradio全解10——Streaming:流式傳輸的視頻應用(6)——基于RT-DETR模型構建目標檢測系統》
  7. 《Gradio全解11——Streaming:流式傳輸的視頻應用(7)——多模態Gemini模型及其思考模式》
  8. 《Gradio全解11——Streaming:流式傳輸的視頻應用(8)——Gemini Live API:實時音視頻連接》
  9. 《Gradio全解11——Streaming:流式傳輸的視頻應用(9)——使用FastRTC+Gemini創建沉浸式音頻+視頻的藝術評論家》

11.9 使用FastRTC+Gemini創建實時沉浸式音頻+視頻的藝術評論家

作為對本章知識的總結,本節將實現一個綜合演示:讓Gemini扮演藝術評論家,對用戶通過FastRTC上傳的藝術作品進行點評。本節內容包括準備工作及音頻圖像編碼器、實現Gemini音視頻處理程序使用gr.Blocks替換Stream.ui。

11.9.1 準備工作及音頻圖像編碼器

本節先介紹項目及安裝等準備工作,然后實現音頻和圖像編碼器。

1. 項目說明及準備工作

FastRTC是一個支持通過WebRTC構建低延遲實時應用的庫,Gemini是DeepMind發布的支持多模態和實時任務的大模型。本演示將完成以下工作:

  • 將網絡攝像頭和麥克風數據流式傳輸至Gemini的實時會話。
  • 定期發送視頻幀(及可選上傳圖像)至模型。
  • 實時流式返回模型的音頻響應。
  • 創建精美的全屏Gradio WebRTC用戶界面。

在開始之前,需已安裝Python>=3.10并獲取GEMINI_API_KEY,并安裝以下依賴:

pip install "fastrtc[vad, tts]" gradio google-genai python-dotenv websockets pillow
2. 音頻和圖像編碼器

本節實現編碼器功能,它將音頻轉換為base64編碼數據,將圖像轉換為base64編碼的JPEG格式,轉換代碼如下所示:

import base64
import numpy as np
from io import BytesIO
from PIL import Image
def encode_audio(data: np.ndarray) -> dict:"""Encode audio data (int16 mono) for Gemini."""return {"mime_type": "audio/pcm","data": base64.b64encode(data.tobytes()).decode("UTF-8"),}
def encode_image(data: np.ndarray) -> dict:with BytesIO() as output_bytes:pil_image = Image.fromarray(data)pil_image.save(output_bytes, "JPEG")bytes_data = output_bytes.getvalue()base64_str = str(base64.b64encode(bytes_data), "utf-8")return {"mime_type": "image/jpeg", "data": base64_str}

這段代碼包含兩個函數,分別用于音頻和圖像數據的編碼處理,解讀如下:

  • encode_audio:接收int16格式的單聲道音頻numpy數組,將音頻數據轉換為字節流并進行base64編碼,最后返回包含MIME類型和編碼數據的字典。輸出格式適用于Gemini系統。
  • encode_image:接收圖像數據的numpy數組,使用Pillow庫將數組轉為JPEG格式圖像。將圖像數據轉換為字節流并進行base64編碼,最后返回包含JPEG類型和編碼數據的字典。

兩個函數都實現了將原始二進制數據轉換為base64編碼字符串的功能,并附帶相應的MIME類型信息,這種編碼方式常用于網絡傳輸或API交互場景。音頻處理保持原始PCM格式,而圖像處理則轉換為JPEG格式進行壓縮。

11.9.2 使用Gemini+fastrtc.Stream進行音視頻處理

本節先詳細講述實時進行音視頻發送與接受的GeminiHandler對象的處理邏輯,然后設置fastrtc.Stream并啟動其UI進行展示。

1. GeminiHandler:實時音視頻發送與接受

異步音視頻流處理核心類GeminiHandler的實現代碼如下所示:

import asyncio
import os
import time
import numpy as np
import websockets
from dotenv import load_dotenv
from google import genai
from fastrtc import AsyncAudioVideoStreamHandler, wait_for_item, WebRTCError
load_dotenv()
class GeminiHandler(AsyncAudioVideoStreamHandler):def __init__(self) -> None:super().__init__("mono",output_sample_rate=24000,input_sample_rate=16000,)self.audio_queue = asyncio.Queue()self.video_queue = asyncio.Queue()self.session = Noneself.last_frame_time = 0.0self.quit = asyncio.Event()async def start_up(self):await self.wait_for_args()api_key = self.latest_args[3]hf_token = self.latest_args[4]if hf_token is None or hf_token == "":raise WebRTCError("HF Token is required")os.environ["HF_TOKEN"] = hf_tokenclient = genai.Client(api_key=api_key, http_options={"api_version": "v1alpha"})config = {"response_modalities": ["AUDIO"], "system_instruction": "You are an art critic that will critique the artwork passed in as an image to the user. Critique the artwork in a funny and lighthearted way. Be concise and to the point. Be friendly and engaging. Be helpful and informative. Be funny and lighthearted."}async with client.aio.live.connect(model="gemini-2.0-flash-exp", # Replaceable version: gemini-2.0-flash. Latest version: gemini-live-2.5-flash-previewconfig=config,) as session:self.session = sessionwhile not self.quit.is_set():turn = self.session.receive()try:async for response in turn:if data := response.data:audio = np.frombuffer(data, dtype=np.int16).reshape(1, -1)self.audio_queue.put_nowait(audio)except websockets.exceptions.ConnectionClosedOK:print("connection closed")break# Video: receive and (optionally) send frames to Geminiasync def video_receive(self, frame: np.ndarray):self.video_queue.put_nowait(frame)if self.session and (time.time() - self.last_frame_time > 1.0):self.last_frame_time = time.time()await self.session.send(input=encode_image(frame))# If there is an uploaded image passed alongside the WebRTC component,# it will be available in latest_args[2]if self.latest_args[2] is not None:await self.session.send(input=encode_image(self.latest_args[2]))async def video_emit(self) -> np.ndarray:frame = await wait_for_item(self.video_queue, 0.01)if frame is not None:return frame# Fallback while waiting for first framereturn np.zeros((100, 100, 3), dtype=np.uint8)# Audio: forward microphone audio to Geminiasync def receive(self, frame: tuple[int, np.ndarray]) -> None:_, array = framearray = array.squeeze()  # (num_samples,)audio_message = encode_audio(array)if self.session:await self.session.send(input=audio_message)# Audio: emit Gemini’s audio back to the clientasync def emit(self):array = await wait_for_item(self.audio_queue, 0.01)if array is not None:return (self.output_sample_rate, array)return arrayasync def shutdown(self) -> None:if self.session:self.quit.set()await self.session.close()self.quit.clear()

該類繼承自AsyncAudioVideoStreamHandler,實現了一個基于Gemini Live API的、通過WebRTC進行實時音視頻處理的雙向流傳輸系統,它使用Gemini模型進行實時藝術評論(圖像分析)和對話處理,核心功能解析如下:

  1. __init__(self)方法:初始化類參數。①音頻隊列(audio_queue)和視頻隊列(video_queue):使用asyncio實現非阻塞IO操作,用于異步數據交換。②quit事件:傳輸關閉控制機制。③采樣率配置:支持16kHz輸入/24kHz輸出的音頻流轉換。
  2. start_up(self):初始化Gemini會話配置并連接,處理響應消息。 config:系統指令設置響應模態為AUDIO,并讓模型扮演藝術評論角色。client.aio.live.connect(...) :配置模型參數(gemini-2.0-flash-exp),實時持續接收Gemini響應并存入客戶端的音頻隊列audio_queue。
  3. 音頻處理流程。receive():接受麥克風輸入,編碼后發送至Gemini。emit():從音頻隊列audio_queue獲取Gemini響應音頻,并返回給客戶端處理。兩個函數通過隊列緩沖處理音頻數據,最終實現音頻流的雙向傳輸。
  4. 視頻處理流程。video_receive():接收攝像頭視頻流圖像幀并存入video_queue,按1秒間隔發送至Gemini,且每秒最多發送一幀視頻(避免對API造成過載)。同時可額外處理預設圖像(latest_args[2] ),因此可選擇同時發送上傳的圖像(gr.Image)和網絡攝像頭視頻幀。video_emit():從視頻隊列video_queue獲取視頻幀輸出(含空幀處理),將輸出發送到客戶端。注意:Gemini Live API只返回評論視頻幀和圖像幀的音頻流,視頻隊列video_queue中的視頻直接來自客戶端的攝像頭。

系統在初始化時加載環境變量,然后建立Gemini長連接并循環處理音視頻數據流:每秒發送一幀視頻進行分析,并實時雙向傳輸音頻,最后再關閉時清理會話資源。GeminiHandler類的模型版本可替換,支持自定義系統指令,其模塊化的隊列設計非常便于擴展 。

2. 設置流媒體fastrtc.Stream對象并啟動UI

我們將在WebRTC組件旁添加一個可選的gr.Image輸入組件,在向Gemini發送幀時,處理程序可通過self.latest_args[2]訪問該圖像。fastrtc.Stream代碼如下所示:

import gradio as gr
from fastrtc import Stream, WebRTC, get_hf_turn_credentials
stream = Stream(handler=GeminiHandler(),modality="audio-video",mode="send-receive",server_rtc_configuration=get_hf_turn_credentials(ttl=600*10000),rtc_configuration=get_hf_turn_credentials(),additional_inputs=[gr.Markdown("## 🎨 Art Critic\n\n""Provide an image of your artwork or hold it up to the webcam, and Gemini will critique it for you.""To get a Gemini API key, please visit the [Gemini API Key](https://aistudio.google.com/apikey) page.""To get an HF Token, please visit the [HF Token](https://huggingface.co/settings/tokens) page."),gr.Image(label="Artwork", value="mona_lisa.jpg", type="numpy", sources=["upload", "clipboard"]),gr.Textbox(label="Gemini API Key", type="password"),gr.Textbox(label="HF Token", type="password"),],ui_args={"icon": "https://www.gstatic.com/lamda/images/gemini_favicon_f069958c85030456e93de685481c559f160ea06b.png","pulse_color": "rgb(255, 255, 255)","icon_button_color": "rgb(255, 255, 255)","title": "Gemini Audio Video Chat",},time_limit=90,concurrency_limit=5,
)
if __name__ == "__main__":stream.ui.launch()

在FastRTC的Stream中,設置各項配置,核心功能有:

  1. FastRTC流配置。首先,配置自定義的Gemini處理程序,設置為支持音視頻模態及雙向通信模式。然后,設置服務器端TURN和客戶端TURN,使用Hugging Face的TURN服務器實現NAT穿透,10小時(600*10000毫秒)的憑證有效期確保長時會話穩定性。
  2. Gradio界面設計。首先,定義輸入組件,包括Markdown說明文檔、圖像上傳組件、和安全憑證輸入。然后,實現UI定制,包括Gemini官方圖標URL、按鈕顏色及標題。
  3. 設置系統約束,包括單次會話最長90秒和最大并發連接數5。

該界面結合WebRTC+P2P通信減少中間環節延遲,實現低延遲架構。通過密碼框保護API密鑰,符合敏感信息處理規范。運行效果如圖11-10所示:
在這里插入圖片描述

圖11-10

11.9.3 Gradio.Blocks替換Stream.ui實現自定義界面

在11.10.2節中,使用fastrtc.Stream對象的默認ui啟動,如果希望實現自定義界面且保留Stream設置,該怎么辦呢?

1. 實現代碼及解讀

使用gr.Blocks替換Stream.ui實現代碼如下所示:

stream = Stream(handler=GeminiHandler(),modality="audio-video",mode="send-receive",rtc_configuration=get_cloudflare_turn_credentials_async,time_limit=180 if get_space() else None,additional_inputs=[gr.Image(label="Image", type="numpy", sources=["upload", "clipboard"])],ui_args={"icon": "https://www.gstatic.com/lamda/images/gemini_favicon_f069958c85030456e93de685481c559f160ea06b.png","pulse_color": "rgb(255, 255, 255)","icon_button_color": "rgb(255, 255, 255)","title": "Gemini Audio Video Chat",},
)css = """
#video-source {max-width: 600px !important; max-height: 600 !important;}
"""
with gr.Blocks(css=css) as demo:gr.HTML("""<div style='display: flex; align-items: center; justify-content: center; gap: 20px'><div style="background-color: var(--block-background-fill); border-radius: 8px"><img src="https://www.gstatic.com/lamda/images/gemini_favicon_f069958c85030456e93de685481c559f160ea06b.png" style="width: 100px; height: 100px;"></div><div><h1>Gen AI SDK Voice Chat</h1><p>Speak with Gemini using real-time audio + video streaming</p><p>Powered by <a href="https://gradio.app/">Gradio</a> and <a href=https://freddyaboulton.github.io/gradio-webrtc/">WebRTC</a>??</p><p>Get an API Key <a href="https://support.google.com/googleapi/answer/6158862?hl=en">here</a></p></div></div>""")with gr.Row() as row:with gr.Column():webrtc = WebRTC(label="Video Chat", modality="audio-video",mode="send-receive", elem_id="video-source",rtc_configuration=get_cloudflare_turn_credentials_async,icon="https://www.gstatic.com/lamda/images/gemini_favicon_f069958c85030456e93de685481c559f160ea06b.png",pulse_color="rgb(255, 255, 255)",icon_button_color="rgb(255, 255, 255)",)with gr.Column():image_input = gr.Image(label="Image", type="numpy", sources=["upload", "clipboard"])webrtc.stream(GeminiHandler(), inputs=[webrtc, image_input],outputs=[webrtc], time_limit=180 if get_space() else None,concurrency_limit=2 if get_space() else None)
stream.ui = demo
if __name__ == "__main__":if (mode := os.getenv("MODE")) == "UI":stream.ui.launch(server_port=7860)elif mode == "PHONE":raise ValueError("Phone mode not supported for this demo")else:stream.ui.launch(server_port=7860)

本段代碼先定義fastrtc.Stream配置,然后構建Gradio界面,最后定義組件交互邏輯,詳細解讀如下:

  • fastrtc.Stream流媒體配置。核心組件,處理音視頻流傳輸和AI集成,使用GeminiHandler作為數據處理核心。支持雙工通信模式(send-receive),使用Cloudflare TURN服務器處理NAT穿透。動態設置會話時長限制180秒,通過get_space()函數判斷是否啟用限制。
  • Gradio界面構建。采用Blocks模式創建響應式布局。首先,通過CSS約束視頻源尺寸(600x600像素)。然后,左側顯示Gemini品牌圖標和產品標題,右側提供API獲取指引。最后在雙列布局中,左列是實時音視頻組件(WebRTC),右列是圖像輸入組件(支持上傳/粘貼)。嚴格使用Gemini官方視覺元素(圖標、配色),通過HTML/CSS實現品牌展示區。
  • 組件交互邏輯。WebRTC組件綁定GeminiHandler處理器,同時接收音視頻流和圖像輸入。設置時長限制和并發限制數,通過get_space()函數實現動態資源配置。啟動時根據環境變量MODE選擇UI模式或Phone模式(后者暫不支持)
2. 運行效果及參考資源

最終運行效果如圖11-11所示:
在這里插入圖片描述

圖11-11

如需進一步學習,請參考資源:

  • Gemini音視頻聊天示例——Gemini藝術評論家參考代碼:gradio/Gemini-Art-Critic🖇?鏈接11-61。Gradio Blocks界面版本:fastrtc/gemini-audio-video🖇?鏈接11-62。
  • FastRTC的Audio + Video音視頻用戶指南:🖇?鏈接11-63。
  • Gradio參考資料:Create a Real-Time Immersive Audio + Video Demo with FastRTC🖇?鏈接11-64。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/922005.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/922005.shtml
英文地址,請注明出處:http://en.pswp.cn/news/922005.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Django入門筆記

Python知識點&#xff1a;函數、面向對象。前端開發&#xff1a;HTML、CSS、JavaScript、jQuery、BootStrap。MySQL數據庫。Python的Web框架&#xff1a;Flask&#xff0c;自身短小精悍 第三方組件。Django&#xff0c;內部已集成了很多組件 第三方組件。【主要】1.安裝djang…

當Claude Code失靈,Qwen Code能否成為你的救星?

當Claude Code失靈&#xff0c;Qwen Code能否成為你的救星&#xff1f; 一、開頭&#xff1a;點明困境&#xff0c;引出主角 作為一個大模型博主&#xff0c;日常工作中我經常會使用各種 AI 工具來提高效率&#xff0c;Claude Code 就是我之前非常依賴的一款代碼生成助手 。它…

Go語言快速入門教程(JAVA轉go)——1 概述

優勢 第一個理由&#xff1a;對初學者足夠友善&#xff0c;能夠快速上手。 業界都公認&#xff1a;Go 是一種非常簡單的語言。Go 的設計者們在發布 Go 1.0 版本和兼容性規范后&#xff0c;似乎就把主要精力放在精心打磨 Go 的實現、改進語言周邊工具鏈&#xff0c;還有提升 Go …

【Rust多進程】征服CPU的藝術:Rust多進程實戰指南

?? 歡迎大家來到景天科技苑?? &#x1f388;&#x1f388; 養成好習慣&#xff0c;先贊后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者簡介&#xff1a;景天科技苑 &#x1f3c6;《頭銜》&#xff1a;大廠架構師&#xff0c;華為云開發者社區專家博主&#xff0c;…

OpenCV 高階實戰:圖像直方圖與掩碼圖像深度解析

目錄 一、圖像直方圖&#xff1a;讀懂圖像的 “像素分布報告” 1. 什么是圖像直方圖&#xff1f; 2. 圖像直方圖的核心作用 &#xff08;1&#xff09;分析亮度分布 &#xff08;2&#xff09;判斷對比度高低 &#xff08;3&#xff09;輔助圖像增強與閾值分割 &#xf…

基于stm32的家庭安全監測系統設計

若該文為原創文章&#xff0c;轉載請注明原文出處。一、引言&#xff08;一&#xff09;研究背景及意義背景&#xff1a;隨著智能家居概念的普及&#xff0c;人們對家庭安全、舒適度和節能提出了更高要求。傳統安防系統功能單一、各系統獨立&#xff0c;缺乏聯動和遠程管理能力…

Oracle體系結構-控制文件(Control Files)

一、 原理 (Principle) 核心定位&#xff1a; 控制文件是一個小型的二進制文件&#xff0c;由 Oracle 實例在啟動和操作過程中持續讀寫。它是數據庫物理結構的權威記錄。數據庫無法啟動或正常操作時&#xff0c;如果無法訪問控制文件&#xff0c;實例將無法識別數據文件和重做日…

路由 下一跳 網關 兩個不同網段的ip如何通過路由器互通

路由 (Routing)核心思想&#xff1a;路徑選擇是什么&#xff1f; 路由是指數據包從源主機傳輸到目標主機的整個過程。這個過程就像寄快遞&#xff1a;你需要決定包裹經過哪些中轉站才能最終到達收件人手里。做什么&#xff1f; 網絡中的設備&#xff08;主要是路由器&#xff0…

HiDDeN論文解讀與代碼實現

論文&#xff1a;HiDDeN: Hiding Data With Deep Networks 作者&#xff1a;Jiren Zhu, Russell Kaplan, Justin Johnson, Li Fei-Fei一、研究背景 在圖像信息隱藏領域&#xff0c;通常有兩類典型的應用場景&#xff1a;隱寫 (Steganography) 目標&#xff1a;實現秘密通信。要…

實驗室服務器配置|實驗室多人共享GPU|通過Docker實現Linux系統多用戶隔離與安全防控

利用實驗室服務器跑實驗的時候&#xff0c;通常就是兩種方案&#xff0c;一個是向日葵遠程桌面進行操作&#xff0c;一個是通過ssh進行連接&#xff0c;用ssh的話&#xff0c;一般服務器都在內網&#xff08;例如校園網&#xff09;&#xff0c;是無法在公網&#xff08;不在校…

2019考研數學(二)真題

一、選擇題 (1) (2) (3) (4) 遺漏點&#xff1a;由通解知特解&#xff0c;特解代入微分方程 (5) ★記住這個題&#xff0c;用的泰勒展開(6) (7) 遺忘點&#xff1a; ★伴隨矩陣的秩與原矩陣秩的關系&#xff1a; (8) 錯誤點&#xff1a;粗心 二、填空題 (9) 易混淆點&#xff…

10 分鐘上手 ECharts:從“能跑”到“生產級”的完整踩坑之旅

10 分鐘上手 ECharts&#xff1a;從“能跑”到“生產級”的完整踩坑筆記 如果你也曾 復制了官方 Demo 卻不知道怎么拆、窗口一拉伸圖表就變形、切換標簽頁后內存暴漲——這篇博客就是為你寫的。 我會用 6 個遞進版本 的源碼&#xff0c;帶你把一張 最簡柱狀圖 逐步進化成 可銷毀…

二級緩存在實際項目中的應用

二級緩存在項目中的應用 目錄 1. 二級緩存簡介2. 應用場景3. 重難點分析4. 結合SpringBoot使用5. 最佳實踐與案例6. 總結 1. 二級緩存簡介 1.1 什么是二級緩存 二級緩存&#xff08;Second-Level Cache&#xff09; 是Hibernate框架中的一個重要特性&#xff0c;它提供了應…

深入淺出CRC校驗:從數學原理到單周期硬件實現 (2)CRC數學多項式基礎

數學的優雅&#xff1a;剖開CRC的多項式除法核心看似復雜的CRC校驗&#xff0c;其核心建立在優雅的數學基礎之上。本文將為您揭開CRC算法的數學面紗&#xff0c;讓您真正理解多項式除法的精妙之處。模2運算&#xff1a;CRC世界的特殊算術 CRC計算建立在一種特殊的代數系統上——…

軟考初級有沒有必要考?

對正在學習相關專業的學生或者是行業新人&#xff0c;這篇文章從軟考初級的含義、適合哪些人考、考試難度等方面解答&#xff0c;幫助你判斷要不要報考。一、軟考初級是什么&#xff1f; 軟考初級是軟考體系里面的基礎級別&#xff0c;主要面向在校大學生或是IT行業新人&#x…

11 Prompt 工程進階:Few-shot 與 Chain-of-Thought

11 Prompt 工程進階&#xff1a;Few-shot 與 Chain-of-Thought 前10節總結 & 后10節展望 在前 10 節&#xff0c;我們已經完成了 AI 產品經理的入門階段&#xff1a; 1–3&#xff1a;理解了大模型的基本概念、Token、Prompt 基礎&#xff1b;4–5&#xff1a;體驗了本地部…

ARM1.(ARM體系結構)

1.基本概念嵌入式:以應用為心&#xff0c;以計算機技術為礎&#xff0c;軟便件可被的專用計算機系統。計算機系統的軟件基本組成: 系統軟件、應用軟件。計算機系統的硬件基本組成&#xff1a;運算器、控制器、存諸器、輸入設備、輸出設備日常生活中遇到的專業術語&#xff1a…

Django全棧班v1.01 Python簡介與特點 20250910

從零開始的Python編程之旅 “人生苦短&#xff0c;我用Python。”這不僅僅是Python程序員的口頭禪&#xff0c;更是對Python強大能力的最好詮釋&#xff01;&#xff01;&#xff01; 為什么全世界有超過1500萬開發者選擇Python&#xff1f; 為什么Python連續多年蟬聯最受歡…

【WebApi】什么情況開啟如何開啟緩存

在 ASP.NET Core WebAPI 中開啟緩存是優化性能、減少服務器負載和提升用戶體驗的非常重要的手段。但并非所有情況都適合開啟緩存。 下面我將從 “什么情況下開啟” 和 “如何開啟” 兩個方面為你詳細解釋。 一、什么情況下應該開啟緩存? 總的來說,緩存適用于 “變化不頻繁但…

Go語言類型斷言全解析

類型斷言的基本概念類型斷言(Type Assertion)是Go語言中用于檢查接口值底層具體類型的機制。它本質上是一種運行時類型檢查的操作&#xff0c;允許程序在運行時判斷接口變量是否持有特定的類型值&#xff0c;并提取該類型的值。這是Go語言類型系統中的一個重要特性&#xff0c;…