%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
!pip install gradio
!pip install deep-translator
Collecting gradio Downloading gradio-4.40.0-py3-none-any.whl.metadata (15 kB) Collecting aiofiles<24.0,>=22.0 (from gradio) Downloading aiofiles-23.2.1-py3-none-any.whl.metadata (9.7 kB) Requirement already satisfied: anyio<5.0,>=3.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (3.7.1) Collecting fastapi (from gradio) Downloading fastapi-0.112.0-py3-none-any.whl.metadata (27 kB) Collecting ffmpy (from gradio) Downloading ffmpy-0.4.0-py3-none-any.whl.metadata (2.9 kB) Collecting gradio-client==1.2.0 (from gradio) Downloading gradio_client-1.2.0-py3-none-any.whl.metadata (7.1 kB) Collecting httpx>=0.24.1 (from gradio) Downloading httpx-0.27.0-py3-none-any.whl.metadata (7.2 kB) Requirement already satisfied: huggingface-hub>=0.19.3 in /usr/local/lib/python3.10/dist-packages (from gradio) (0.23.5) Requirement already satisfied: importlib-resources<7.0,>=1.3 in /usr/local/lib/python3.10/dist-packages (from gradio) (6.4.0) Requirement already satisfied: jinja2<4.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (3.1.4) Requirement already satisfied: markupsafe~=2.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (2.1.5) Requirement already satisfied: matplotlib~=3.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (3.7.1) Requirement already satisfied: numpy<3.0,>=1.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (1.26.4) Collecting orjson~=3.0 (from gradio) Downloading orjson-3.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (50 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 50.4/50.4 kB 3.6 MB/s eta 0:00:00 Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from gradio) (24.1) Requirement already satisfied: pandas<3.0,>=1.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (2.1.4) Requirement already satisfied: pillow<11.0,>=8.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (9.4.0) Requirement already satisfied: pydantic>=2.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (2.8.2) Collecting pydub (from gradio) Downloading pydub-0.25.1-py2.py3-none-any.whl.metadata (1.4 kB) Collecting python-multipart>=0.0.9 (from gradio) Downloading python_multipart-0.0.9-py3-none-any.whl.metadata (2.5 kB) Requirement already satisfied: pyyaml<7.0,>=5.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (6.0.1) Collecting ruff>=0.2.2 (from gradio) Downloading ruff-0.5.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (24 kB) Collecting semantic-version~=2.0 (from gradio) Downloading semantic_version-2.10.0-py2.py3-none-any.whl.metadata (9.7 kB) Collecting tomlkit==0.12.0 (from gradio) Downloading tomlkit-0.12.0-py3-none-any.whl.metadata (2.7 kB) Requirement already satisfied: typer<1.0,>=0.12 in /usr/local/lib/python3.10/dist-packages (from gradio) (0.12.3) Requirement already satisfied: typing-extensions~=4.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (4.12.2) Requirement already satisfied: urllib3~=2.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (2.0.7) Collecting uvicorn>=0.14.0 (from gradio) Downloading uvicorn-0.30.5-py3-none-any.whl.metadata (6.6 kB) Requirement already satisfied: fsspec in /usr/local/lib/python3.10/dist-packages (from gradio-client==1.2.0->gradio) (2024.6.1) Collecting websockets<13.0,>=10.0 (from gradio-client==1.2.0->gradio) Downloading websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.6 kB) Requirement already satisfied: idna>=2.8 in /usr/local/lib/python3.10/dist-packages (from anyio<5.0,>=3.0->gradio) (3.7) Requirement already satisfied: sniffio>=1.1 in /usr/local/lib/python3.10/dist-packages (from anyio<5.0,>=3.0->gradio) (1.3.1) Requirement already satisfied: exceptiongroup in /usr/local/lib/python3.10/dist-packages (from anyio<5.0,>=3.0->gradio) (1.2.2) Requirement already satisfied: certifi in /usr/local/lib/python3.10/dist-packages (from httpx>=0.24.1->gradio) (2024.7.4) Collecting httpcore==1.* (from httpx>=0.24.1->gradio) Downloading httpcore-1.0.5-py3-none-any.whl.metadata (20 kB) Collecting h11<0.15,>=0.13 (from httpcore==1.*->httpx>=0.24.1->gradio) Downloading h11-0.14.0-py3-none-any.whl.metadata (8.2 kB) Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.19.3->gradio) (3.15.4) Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.19.3->gradio) (2.31.0) Requirement already satisfied: tqdm>=4.42.1 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.19.3->gradio) (4.66.4) Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (1.2.1) Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (0.12.1) Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (4.53.1) Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (1.4.5) Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (3.1.2) Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (2.8.2) Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas<3.0,>=1.0->gradio) (2024.1) Requirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.10/dist-packages (from pandas<3.0,>=1.0->gradio) (2024.1) Requirement already satisfied: annotated-types>=0.4.0 in /usr/local/lib/python3.10/dist-packages (from pydantic>=2.0->gradio) (0.7.0) Requirement already satisfied: pydantic-core==2.20.1 in /usr/local/lib/python3.10/dist-packages (from pydantic>=2.0->gradio) (2.20.1) Requirement already satisfied: click>=8.0.0 in /usr/local/lib/python3.10/dist-packages (from typer<1.0,>=0.12->gradio) (8.1.7) Requirement already satisfied: shellingham>=1.3.0 in /usr/local/lib/python3.10/dist-packages (from typer<1.0,>=0.12->gradio) (1.5.4) Requirement already satisfied: rich>=10.11.0 in /usr/local/lib/python3.10/dist-packages (from typer<1.0,>=0.12->gradio) (13.7.1) Collecting starlette<0.38.0,>=0.37.2 (from fastapi->gradio) Downloading starlette-0.37.2-py3-none-any.whl.metadata (5.9 kB) Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib~=3.0->gradio) (1.16.0) Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.10/dist-packages (from rich>=10.11.0->typer<1.0,>=0.12->gradio) (3.0.0) Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.10/dist-packages (from rich>=10.11.0->typer<1.0,>=0.12->gradio) (2.16.1) Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub>=0.19.3->gradio) (3.3.2) Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.10/dist-packages (from markdown-it-py>=2.2.0->rich>=10.11.0->typer<1.0,>=0.12->gradio) (0.1.2) Downloading gradio-4.40.0-py3-none-any.whl (12.5 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 12.5/12.5 MB 73.6 MB/s eta 0:00:00 Downloading gradio_client-1.2.0-py3-none-any.whl (318 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 318.6/318.6 kB 19.0 MB/s eta 0:00:00 Downloading tomlkit-0.12.0-py3-none-any.whl (37 kB) Downloading aiofiles-23.2.1-py3-none-any.whl (15 kB) Downloading httpx-0.27.0-py3-none-any.whl (75 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 75.6/75.6 kB 5.4 MB/s eta 0:00:00 Downloading httpcore-1.0.5-py3-none-any.whl (77 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 77.9/77.9 kB 5.7 MB/s eta 0:00:00 Downloading orjson-3.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (141 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 141.1/141.1 kB 10.8 MB/s eta 0:00:00 Downloading python_multipart-0.0.9-py3-none-any.whl (22 kB) Downloading ruff-0.5.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (10.2 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 10.2/10.2 MB 88.9 MB/s eta 0:00:00 Downloading semantic_version-2.10.0-py2.py3-none-any.whl (15 kB) Downloading uvicorn-0.30.5-py3-none-any.whl (62 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 62.8/62.8 kB 4.3 MB/s eta 0:00:00 Downloading fastapi-0.112.0-py3-none-any.whl (93 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 93.1/93.1 kB 6.8 MB/s eta 0:00:00 Downloading ffmpy-0.4.0-py3-none-any.whl (5.8 kB) Downloading pydub-0.25.1-py2.py3-none-any.whl (32 kB) Downloading h11-0.14.0-py3-none-any.whl (58 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 58.3/58.3 kB 4.4 MB/s eta 0:00:00 Downloading starlette-0.37.2-py3-none-any.whl (71 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 71.9/71.9 kB 5.5 MB/s eta 0:00:00 Downloading websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (130 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 130.2/130.2 kB 10.6 MB/s eta 0:00:00 Installing collected packages: pydub, websockets, tomlkit, semantic-version, ruff, python-multipart, orjson, h11, ffmpy, aiofiles, uvicorn, starlette, httpcore, httpx, fastapi, gradio-client, gradio Attempting uninstall: tomlkit Found existing installation: tomlkit 0.13.0 Uninstalling tomlkit-0.13.0: Successfully uninstalled tomlkit-0.13.0 Successfully installed aiofiles-23.2.1 fastapi-0.112.0 ffmpy-0.4.0 gradio-4.40.0 gradio-client-1.2.0 h11-0.14.0 httpcore-1.0.5 httpx-0.27.0 orjson-3.10.6 pydub-0.25.1 python-multipart-0.0.9 ruff-0.5.6 semantic-version-2.10.0 starlette-0.37.2 tomlkit-0.12.0 uvicorn-0.30.5 websockets-12.0 Collecting deep-translator Downloading deep_translator-1.11.4-py3-none-any.whl.metadata (30 kB) Requirement already satisfied: beautifulsoup4<5.0.0,>=4.9.1 in /usr/local/lib/python3.10/dist-packages (from deep-translator) (4.12.3) Requirement already satisfied: requests<3.0.0,>=2.23.0 in /usr/local/lib/python3.10/dist-packages (from deep-translator) (2.31.0) Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.10/dist-packages (from beautifulsoup4<5.0.0,>=4.9.1->deep-translator) (2.5) Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests<3.0.0,>=2.23.0->deep-translator) (3.3.2) Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests<3.0.0,>=2.23.0->deep-translator) (3.7) Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests<3.0.0,>=2.23.0->deep-translator) (2.0.7) Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests<3.0.0,>=2.23.0->deep-translator) (2024.7.4) Downloading deep_translator-1.11.4-py3-none-any.whl (42 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 42.3/42.3 kB 2.6 MB/s eta 0:00:00 Installing collected packages: deep-translator Successfully installed deep-translator-1.11.4
import gradio as gr
from deep_translator import GoogleTranslator
Gradio 和我們之前學的 ipywidgets
很像, 基本上就是有函式就可以互動!只是 gradio
更酷的是, 有函式就可以打造一個 web app!第一個範例其實沒有什麼功能特別的功能, 輸入你的名字, 機器人跟你打招呼。這只是讓你熟悉 gradio
。
def hi(name):
return f"你好, {name}!"
來看看這簡單函式的功能。
hi("炎龍")
'你好, 炎龍!'
hi(87)
'你好, 87!'
有一個函式, 要打造 web app, 最基本只要告訴 gradio
, 輸入是什麼格式, 輸出是什麼格式。Gradio
喜歡用 iface
叫它的界面, 事實上就是 Interface
。我們要把 hi
打造成一個 web app, 最基本的就是這樣:
iface = gr.Interface(
hi,
inputs = "textbox",
outputs = "textbox"
)
我們還可以加上 web app 的標題 (title
), 還有說明 (description
), 而 "textbox"
其實是快捷的用法, 正式用法像:
inputs = "textbox"
應該是
inputs = gr.Textbox()
app_title = "親切 AI 機器人"
app_description = "請輸入你的名字, 我會跟你打招呼!"
iface = gr.Interface(hi,
title = app_title,
description = app_description,
inputs = gr.Textbox(label="請輸入您的大名:"),
outputs = gr.Textbox(label="可愛 AI 機器人"))
iface.launch()
Setting queue=True in a Colab notebook requires sharing enabled. Setting `share=True` (you can turn this off by setting `share=False` in `launch()` explicitly). Colab notebook detected. To show errors in colab notebook, set debug=True in launch() Running on public URL: https://caf44627172c56f94c.gradio.live This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run `gradio deploy` from Terminal to deploy to Spaces (https://huggingface.co/spaces)
再來我們做一個「AI 咖啡推薦系統」: 你自拍一張, AI 根據你的相片, 分析出今天最適合的咖啡! 這當然是假的, 其實是隨機抽一支咖啡出來... 首先, 假設我們開了一家咖啡店, 以下是今天單品咖啡的豆單。
coffee = ["耶加雪菲日曬",
"瓜地馬拉水洗",
"阿里山日曬",
"哥斯大黎加蜜處理"]
np.random
中有個可以把串列隨機選一個出來的指令, 叫做 choice
。可以重覆執行下面這段, 每次會出現不同的結果。
np.random.choice(coffee)
'阿里山日曬'
更酷的是, 在用 choice
時, 還可以加入機率! 於是, 你可以偷偷把今天最想推的豆子, 機率設高一些。
def pick_coffee(img):
c = np.random.choice(coffee,
p = [0.2, 0.15, 0.6, 0.05])
return f"經過 AI 判斷, 您今天最適合的咖啡是{c}!"
這簡單的程式有很多用法。你可以騙, 不是, 跟人家說稍微介紹一下自己, AI 會幫忙選適合的豆子...
pick_coffee("我是射手座!")
'經過 AI 判斷, 您今天最適合的咖啡是耶加雪菲日曬!'
或是想一個吉祥 (?) 的數字, AI 會幫你選豆子...
pick_coffee(87)
'經過 AI 判斷, 您今天最適合的咖啡是阿里山日曬!'
最終版是自拍一張, 讓 AI 選豆子!
title = "AI 咖啡推薦機器人"
description = "請自拍一張照片, AI 會仔細分析之後, 推薦您最適合的咖啡!"
iface = gr.Interface(
pick_coffee,
title = title,
description = description,
inputs = gr.Image(sources="webcam", label="請自拍一張照片"),
outputs = gr.Textbox(label="AI 分析結果")
)
iface.launch()
Setting queue=True in a Colab notebook requires sharing enabled. Setting `share=True` (you can turn this off by setting `share=False` in `launch()` explicitly). Colab notebook detected. To show errors in colab notebook, set debug=True in launch() Running on public URL: https://2fe0624d16a39ad4e0.gradio.live This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run `gradio deploy` from Terminal to deploy to Spaces (https://huggingface.co/spaces)
我們終於要來個有用的 (?),會自動幫你翻譯的機器人! 在很多 AI 裡面, 都是打開一個模型, 比方說:
translator = GoogleTranslator(source="auto", target="zh-TW")
這就開了一台會翻譯的機器人。 (當然, 在物件導向語言 OOP 正式的術語是, 我們把一個類別 class, 打開一個範例 instance)。
使用這個翻譯機器人, 只要叫它翻譯就好:
translator.translate("This is a book.")
下面就直接開一台 AI 模型, 直接上工翻譯!
def translate(text):
translation = GoogleTranslator(source="auto",
target="zh-TW").translate(text)
return translation
試用一下。
translate("This is a book.")
'這是一本書。'
注意 source="auto"
, 意思是 AI 會「自動偵測語言」, 所以 gradio
成品可以試試不同的語言。
比方說, 老是有人私訊我 "좋아해요." 或是 "あなたが好きです。" 我不知道意思, 就可以請 AI 翻譯一下。
(老師被通報有強烈妄想中...)
title = "AI 翻譯機器人"
description = "請輸入一句外文, 我會幫忙翻成中文。"
iface = gr.Interface(
translate,
title = title,
description = description,
inputs = "textbox",
outputs = "textbox"
)
iface.launch()
Setting queue=True in a Colab notebook requires sharing enabled. Setting `share=True` (you can turn this off by setting `share=False` in `launch()` explicitly). Colab notebook detected. To show errors in colab notebook, set debug=True in launch() Running on public URL: https://ec4c4a8b1cf974c3b1.gradio.live This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run `gradio deploy` from Terminal to deploy to Spaces (https://huggingface.co/spaces)
最後我們讓那個只會回覆 "拍拍!" 的「拍拍機器人」上線!
history = []
def pipi(history, prompt):
history = history or []
if "bye" in prompt:
reply = "好的, 下次再聊, Bye!"
else:
reply = "拍拍!"
history.append([prompt, reply])
return history, history
title = "療癒系拍拍 AI 機器人"
description = "你的心事都可以跟我說。"
iface = gr.Interface(
pipi,
title = title,
description = description,
inputs = [gr.State(), "textbox"],
outputs = [gr.Chatbot(), gr.State()]
)
iface.launch()
Setting queue=True in a Colab notebook requires sharing enabled. Setting `share=True` (you can turn this off by setting `share=False` in `launch()` explicitly). Colab notebook detected. To show errors in colab notebook, set debug=True in launch() Running on public URL: https://b4606753864a2fe156.gradio.live This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run `gradio deploy` from Terminal to deploy to Spaces (https://huggingface.co/spaces)