標籤: Qwen

  • 用 Whisper+Ollama 做一個本地語音助理

    用 Whisper+Ollama 做一個本地語音助理

    📌 本文重點

    • 用 Whisper+Ollama 做完全本地語音助理
    • 語音→文字→LLM→語音的完整閉環
    • 30 分鐘內跑起最小可行版本
    • 資料與聲音全留在自己機器上

    一句話就能叫得動電腦,而你的聲音和資料完全留在自己機器上,這就是用 Whisper+Ollama 做本地語音助理要解決的問題。

    參考原文:Build a Fully Local Voice Assistant With Whisper and Ollama(Towards AI)
    https://pub.towardsai.net/build-a-fully-local-voice-assistant-with-whisper-and-ollama-e5e6f713a220


    核心架構:一句話進,AI 一句話回

    這個本地語音助理由三塊組成:

    1. Whisper:把「語音 → 文字」(Speech-to-Text)
    2. Ollama + 本地 LLM:負責理解與生成文字回應
    3. 任一 TTS(Text-to-Speech):把「文字 → 語音」再念出來

    整體流程:

    1. 按快捷鍵開始錄音
    2. Whisper 辨識成文字指令
    3. 文字送到本地 LLM(透過 Ollama)推理
    4. 回傳文字答案,再由 TTS 念出

    💡 關鍵: Whisper+Ollama+TTS 組成「完全本地、無需雲端」的語音互動閉環。

    下文會先講三個核心功能,再看哪些人適合用,最後給一個可以在 30 分鐘內跑起來的最小範例。


    核心功能:你可以用聲音做什麼

    1. 聲控指令:一句話叫電腦做事

    你可以用自然語言下達指令,背後由 LLM 把「人話」轉成實際操作(shell 指令、API 呼叫或執行特定程式)。

    可做的事例如:

    • 「幫我開啟 VS Code 並打開 project 資料夾」
    • 「開始錄音會議,結束時幫我整理重點」
    • 「幫我查今天的天氣,再念給我聽」

    實作上,你可以:

    • 在 LLM 回應中約定一個格式,例如輸出 {"action": "open_app", "target": "VSCode"}
    • 程式解析 JSON,對應到不同的系統操作(Python 用 subprocess、Node 用 child_process

    2. 問答與解說:本地 ChatGPT,用嘴巴問

    Ollama 支援多種本地模型(如 LlamaQwen),你可以當成「只在本地跑的 ChatGPT」:

    • 「用白話講一次這段程式在做什麼」
    • 「幫我設計一個 3 天東京行程,預算一天 5000 台幣」
    • 「這篇英文信幫我改寫得更禮貌」

    如果你在意隱私(公司機密、未發表研究),這類內容只會停留在你的機器,不會上雲端。

    💡 關鍵: 對隱私敏感的程式碼、文件與會議內容,都可以在本地模型中處理而不外流。

    3. 筆記與總結:會議錄完直接變摘要

    結合 Whisper 長錄音能力,你可以:

    • 開會時一直錄音,會後自動產出:
    • 決議事項
    • 待辦清單
    • 各參與者的責任分工
    • 學習影片邊聽邊錄,最後生成「重點整理 + 閱讀筆記」

    做法:

    1. 持續錄音,分段送 Whisper 辨識
    2. 把完整文字餵給 LLM,提示詞(prompt)中要求輸出特定格式:例如「請用 5 點整理會議重點,並列出行動項目」

    適合誰用:具體場景示例

    1. 常開線上會議的知識工作者

    使用方式:

    • 開會前按快捷鍵啟動錄音
    • 會議中不必手寫紀錄
    • 開完會輸出「摘要+待辦」,貼回 Notion / Obsidian

    好處:

    • 不用依賴雲端錄音服務
    • 內部機密內容留在公司內網或個人電腦

    2. 開發者的語音 Coding 小助手

    使用方式:

    • 「幫我生成一個 Python 函數,讀取 CSV 並輸出 JSON」
    • 「這段錯誤訊息說什麼?幫我猜可能原因」
    • 「把這段程式重構成 class 寫法」

    你可以直接把 LLM 回應輸出到檔案,或搭配編輯器 API 完成簡單的自動插入。

    3. 家庭中控 / 桌面自動化

    使用方式:

    • 「關掉 Spotify,改播 YouTube 音樂」
    • 「打開家裡 NAS 的網頁介面」
    • 「查一下電價 API,現在是不是離峰」

    背後是:

    • LLM 產生要呼叫的 API 名稱 + 參數
    • 程式把它映射到實際的 REST API or Shell 指令

    工具比較:Whisper、Ollama、TTS

    名稱 核心功能 免費方案 適合誰
    Whisper 語音轉文字(STT) 開源、免費 要離線語音辨識的人
    Ollama 管理與執行本地 LLM 開源、免費 想在本地跑各種模型的人
    Coqui TTS 本地語音合成(TTS) 開源、免費 想客製化聲音的開發者
    pyttsx3 / edge-tts 簡單 TTS,快速上手 免費 只要能聽到回應即可的人

    Whisper GitHub:https://github.com/openai/whisper
    Ollama 官網:https://ollama.com


    怎麼開始:30 分鐘跑起一個最小版本

    下面以 Python+Whisper+Ollama+簡單 TTS 為例,目標是做到:

    按快捷鍵 → 說話 → AI 在本地回答並念出來

    💡 關鍵: 只要有 8GB RAM 和 Python 環境,大多數電腦在約 30 分鐘內就能完成這套本地語音助理的基本版。

    1. 最小硬體與環境需求

    • 作業系統:macOS / Linux / Windows(建議 10 以上)
    • RAM:至少 8 GB(12–16 GB 更順)
    • GPU:有當然更快,沒有也可跑小模型
    • Python 3.10+(或 Node 也可以,本文用 Python)

    2. 安裝 Ollama 與模型

    1. 到 https://ollama.com 下載並安裝
    2. 開啟終端機,拉一個小模型(例如 llama3.2qwen2.5):
    ollama pull llama3.2
    # 或
    ollama pull qwen2.5
    
    1. 測試一次:
    ollama run llama3.2
    

    能對話就表示後面 Python 可以直接透過 HTTP 使用它。

    3. 安裝 Whisper 與 TTS

    建立虛擬環境(可選,但建議):

    python -m venv venv
    source venv/bin/activate  # Windows: venv\Scripts\activate
    

    安裝必要套件:

    pip install openai-whisper sounddevice numpy requests pyttsx3
    

    說明:

    • openai-whisper:Whisper STT
    • sounddevice:錄音
    • pyttsx3:離線 TTS(Windows/macOS/Linux 都可用)
    • requests:呼叫 Ollama HTTP API

    4. 最小可行 main.py

    下面是一個簡化範例:按 Enter 開始錄音,Ctrl+C 結束程式。你可以之後再綁定系統快捷鍵(如 AutoHotkey、Karabiner)。

    import sounddevice as sd
    import numpy as np
    import whisper
    import requests
    import pyttsx3
    
    MODEL_NAME = "llama3.2"  # 或改成 "qwen2.5" 等你已拉下的模型
    OLLAMA_URL = "http://localhost:11434/api/generate"
    
    whisper_model = whisper.load_model("small")  # 可換 tiny / base / small / medium
    engine = pyttsx3.init()
    
    SAMPLE_RATE = 16000
    DURATION = 5  # 錄音秒數,可改成你想要的
    
    
    def record_audio(duration=DURATION):
        print("開始錄音,請說話...")
        audio = sd.rec(int(duration * SAMPLE_RATE), samplerate=SAMPLE_RATE, channels=1)
        sd.wait()
        print("錄音結束")
        return np.squeeze(audio)
    
    
    def speech_to_text(audio):
        print("正在轉文字...")
        result = whisper_model.transcribe(audio, fp16=False)
        text = result["text"].strip()
        print(f"你說:{text}")
        return text
    
    
    def call_ollama(prompt):
        print("正在思考...")
        resp = requests.post(
            OLLAMA_URL,
            json={"model": MODEL_NAME, "prompt": prompt},
            stream=False,
        )
        data = resp.json()
        answer = data.get("response", "")
        print(f"AI:{answer}")
        return answer
    
    
    def speak(text):
        engine.say(text)
        engine.runAndWait()
    
    
    if __name__ == "__main__":
        try:
            while True:
                input("按 Enter 開始錄音(Ctrl+C 結束):")
                audio = record_audio()
                text = speech_to_text(audio)
                if not text:
                    continue
                answer = call_ollama(text)
                speak(answer)
        except KeyboardInterrupt:
            print("\n結束程式")
    

    執行:

    python main.py
    

    流程:

    1. 按 Enter → 錄音 5 秒
    2. Whisper 轉文字 → 顯示你說的話
    3. 文字送到 Ollama → LLM 回答
    4. pyttsx3 把文字念出來

    你已經完成一個基本版「本地語音 ChatGPT」。接下來就可以:

    • 把錄音時間改成動態(按住鍵才錄)
    • call_ollama 的 prompt 中加入系統指令,例如:「你是一個會輸出 JSON 指令的系統助手」
    • answer 中解析 JSON,呼叫不同的系統功能

    換成本地 Qwen、Llama 模型與低配機調整建議

    換模型:Qwen、Llama 等

    Ollama 已經預設支援多個模型,換模型只要:

    1. 先拉模型:
    ollama pull qwen2.5
    ollama pull llama3.1
    
    1. MODEL_NAME 改成相對應名稱,例如:
    MODEL_NAME = "qwen2.5"
    # 或
    MODEL_NAME = "llama3.1"
    
    1. 重新執行 main.py 即可。

    低配機(8GB RAM / 無 GPU)調優建議

    • Whisper 模型:改用 tinybase
      python
      whisper_model = whisper.load_model("tiny")
    • LLM 模型:優先選擇 *-mini 或 3B 以內的小模型(例如 llama3.2 small 版)
    • TTS:選 pyttsx3 這種輕量離線 TTS,避免重型神經網路 TTS
    • 錄音長度:縮短單次錄音(例如 3–5 秒),減少 STT 負載
    • 批次模式:需要長會議紀錄時,可先用系統錄音軟體錄整段,之後分段丟給 Whisper 處理

    總結:把「叫電腦做事」變成一句話

    你現在已經有一套可以在本地跑的語音助理:

    • Whisper 負責聽懂你說什麼
    • Ollama+本地模型負責思考與生成回應
    • TTS 負責把答案念出來

    從這個最小版本開始,你可以一步步加上:「控制應用程式」、「呼叫 API」、「自動整理會議紀錄」,最後變成一個完全客製化的本地語音中控系統。

    🚀 你現在可以做的事

    • 安裝 Ollama 並拉下 llama3.2qwen2.5 模型,在終端測試對話
    • 建立 Python 虛擬環境,安裝 openai-whispersounddevicepyttsx3 等套件後跑起 main.py
    • 改寫 call_ollama 部分,讓回應輸出 JSON 指令,開始用語音控制你的桌面或 API
  • Fugu 式多模型協作實戰拆解

    Fugu 式多模型協作實戰拆解

    📌 本文重點

    • 單一 LLM 容易遇到成本與供應商風險問題
    • Fugu 用任務類型與路由實現多模型協作
    • 多模型需要良好編排、仲裁與可觀測性
    • 建議從抽象 Task 與 adapter 漸進導入

    單一 LLM 做所有事情的痛點很明確:成本不可控、供應商風險高、效能無法對應不同任務類型。Sakana 的 Fugu 路線給了一個很務實的答案:用一層編排(orchestration)把多個模型(雲端 + 本地 + 專用 code model)協作起來,把「選模型、聚合結果、錯誤控制」變成一套可維護的工程結構,而不是散落在業務程式碼裡的 if-else。


    重點說明

    1. Fugu 式類型系統:先定「任務類型」,再談選哪個模型

    Fugu 的關鍵不是多模型本身,而是任務類型(task types)+ 類型安全的輸入輸出

    • 每個任務明確定義:
    • input schema(如 QueryTask, CodeGenTask, LongFormTask
    • output schema(如 Answer, CodePatch, SearchPlan
    • 路由層只依賴任務類型與 metadata(長度、成本上限、延遲 SLA),不直接寫死「如果是寫程式就用 XXX」。

    範例(TypeScript 風格的 pseudo code):

    // 1. 任務類型定義
    interface BaseTaskMeta {
      maxLatencyMs: number;
      maxCostUSD: number;
      priority: 'low' | 'normal' | 'high';
    }
    
    interface QueryTask {
      type: 'query';
      input: { question: string; context?: string };
      meta: BaseTaskMeta & { allowWebSearch: boolean };
    }
    
    interface CodeGenTask {
      type: 'codegen';
      input: { spec: string; language: string };
      meta: BaseTaskMeta & { needTests: boolean };
    }
    
    interface LongFormTask {
      type: 'longform';
      input: { topic: string; minWords: number };
      meta: BaseTaskMeta & { allowStreaming: boolean };
    }
    
    type Task = QueryTask | CodeGenTask | LongFormTask;
    

    好處:

    • 模型路由只看 Task,不看業務細節,方便之後替換模型 / 供應商。
    • 不同模型可以有不同的 prompt / tool schema,但在編排層都被包成同一個 Task 抽象。

    💡 關鍵: 先用類型把任務抽象好,之後換模型或換供應商就變成「改路由」而不是「重寫業務程式碼」。


    2. 模型路由:任務類型 × 長度 × 成本

    一個實用的路由策略通常只靠幾個欄位就夠了:

    • 任務類型
    • codegen → 專用 code model(如 o3-miniDeepSeek-Coder、本地 Qwen code)
    • query → 一般對話模型(OpenAI / Anthropic / 本地)
    • longform → 長 context 模型(如 200k+ context),或拆段 + 聚合
    • 長度估計:預估輸入 token + 預計輸出 token,超過本地模型 context 就路由到雲端長上下文模型。
    • 成本與延遲
    • maxCostUSD 控制是否可以打貴模型
    • maxLatencyMs 決定是否啟用並行查詢 + 快速仲裁

    簡化版路由器:

    function routeModel(task: Task): 'openai:gpt-4.1-mini' | 'local:qwen' | 'openai:o3-mini' {
      const estTokens = estimateTokens(task.input);
    
      if (task.type === 'codegen') {
        // code 任務預設走專用 code model
        return task.meta.maxCostUSD < 0.05 ? 'local:qwen' : 'openai:o3-mini';
      }
    
      if (task.type === 'longform') {
        if (estTokens > 120_000) return 'openai:gpt-4.1-mini';
        return 'local:qwen';
      }
    
      // query 一般問答
      if (task.meta.maxLatencyMs < 3000) {
        // 低延遲預算 → 本地或較小雲端模型
        return 'local:qwen';
      }
    
      return 'openai:gpt-4.1-mini';
    }
    

    這類路由就是 Fugu 類型系統在工程上的落地:先把任務分型,路由邏輯就自然長出來

    💡 關鍵:maxLatencyMsmaxCostUSD 這類 metadata 控制路由,可以在同一套架構裡同時優化成本與延遲。


    3. 回覆聚合與仲裁:多模型輸出怎麼合成一個答案

    多模型協作的價值在於:

    • 一部分模型擅長查(search / recall),一部分擅長寫(rewrite / explain)
    • 或同一任務交給兩個模型,透過仲裁降低幻覺

    典型做法:

    1. 並行呼叫 2–3 個模型:如本地 Qwen + 雲端 GPT
    2. 用一個「仲裁模型」來閱讀所有候選答案,輸出最終回覆與信心分數

    仲裁 prompt 示意:

    const arbiterPrompt = `你是仲裁模型。你會看到多個模型的回答,請:
    1. 比較其一致性與是否自相矛盾。
    2. 檢查是否有推理錯誤或明顯幻覺。
    3. 選出最可信的一個,並在有疑慮時標記「不確定」。
    
    輸出 JSON:
    {
      "winner": "model_a" | "model_b",
      "confidence": 0-1,
      "final_answer": "...",
      "notes": "..."
    }`;
    

    好處:

    • 提高可靠性(特別是檢索或工具調用密集場景)
    • 可以把仲裁結果記錄下來,用於後續離線分析各模型表現

    成本上升是必然,常見做法是:

    • 只在 高價值任務 / 有風險的 domain(法律、醫療) 開啟仲裁
    • 其他場景靠單模型 + tool verification 解決

    4. 單一 LLM vs 多 LLM 編排:實際取捨

    單一 LLM

    • 優點:實作簡單、debug 容易、觀測鏈短
    • 缺點:
    • 價格彈性差:所有任務都用貴模型
    • 供應商風險:價格調整、限額、區域封鎖都直接影響產品
    • 難以對應極端需求(超長上下文、線下敏感數據)

    多 LLM 編排(Fugu 路線):

    • 優點:
    • 不同任務用最合適的模型 → 可靠性與成本可同時優化
    • 可以把敏感任務 route 到本地模型,降低隱私風險
    • 雲端服務掛了可以 fallback 到次佳方案
    • 缺點:
    • 觀測與 debug 變複雜(誰的錯?哪一層出問題?)
    • 延遲可能放大(串聯多步、多模型仲裁)
    • 各家 API、tool schema、系統提示格式不一致,需要一層 adapter

    對多數專案來說:

    • MVP 階段 → 單一 LLM + 清楚的 abstraction
    • 成本 / 隱私壓力出現後 → 漸進式導入多模型編排,而不是一次重寫

    💡 關鍵: 多模型不是為了「酷」,而是為了在成本、可靠性、隱私之間取得更穩定的折衷。


    實作範例:OpenAI + 本地 Qwen + 專用 code model

    以下給出一個可自建的最小多模型編排骨架(Node/TypeScript 風格,但概念可套任何語言)。

    1. API 介面設計

    對前端/上游只暴露一個 API:POST /v1/ai/execute,輸入統一的 Task 結構。

    // express / fastify handler
    app.post('/v1/ai/execute', async (req, res) => {
      const task: Task = req.body;
    
      const modelId = routeModel(task);
    
      const controller = new AbortController();
      const timeout = setTimeout(() => controller.abort(), task.meta.maxLatencyMs);
    
      try {
        const rawResponse = await callModel(modelId, task, { signal: controller.signal });
        const parsed = normalizeOutput(task, rawResponse);
    
        await logTask({ task, modelId, rawResponse: parsed });
    
        res.json(parsed);
      } catch (e) {
        const fallback = await tryFallback(task, modelId);
        res.json(fallback);
      } finally {
        clearTimeout(timeout);
      }
    });
    

    2. 模型 adapter:解決不同 API / token 格式

    常見坑是:

    • 系統訊令格式不同(OpenAI messages vs 本地單純 prompt
    • tool / function call schema 不同

    用 adapter 隔離差異:

    async function callModel(modelId: string, task: Task, opts: { signal: AbortSignal }) {
      switch (modelId) {
        case 'openai:gpt-4.1-mini':
          return callOpenAI(task, opts);
        case 'openai:o3-mini':
          return callOpenAICode(task, opts);
        case 'local:qwen':
          return callLocalQwen(task, opts);
        default:
          throw new Error(`Unknown model ${modelId}`);
      }
    }
    
    async function callOpenAI(task: Task, { signal }: { signal: AbortSignal }) {
      const messages = buildMessagesFromTask(task);
      const resp = await openai.chat.completions.create({
        model: 'gpt-4.1-mini',
        messages,
        temperature: 0.2,
        response_format: { type: 'json_object' },
        signal,
      });
      return resp.choices[0].message.content;
    }
    
    async function callLocalQwen(task: Task, { signal }: { signal: AbortSignal }) {
      const prompt = buildPromptFromTask(task); // 單一 string
      const resp = await fetch('http://localhost:8000/v1/completions', {
        method: 'POST',
        body: JSON.stringify({
          model: 'qwen-32b-instruct',
          prompt,
          max_tokens: 2048,
          temperature: 0.1,
        }),
        signal,
      }).then(r => r.json());
      return resp.choices[0].text;
    }
    

    只要嚴格把「怎麼跟模型講話」鎖在 adapter 裡,上層就可以只面對 Task


    3. 超時與 fallback 策略

    簡單可行的策略:

    1. 以延遲為主的 fallback

    2. 本地模型超時 → fallback 到雲端小模型

    3. 雲端模型錯誤/超時 → fallback 到本地(或退化版回答)
    async function tryFallback(task: Task, failedModelId: string) {
      const fallbackId = pickFallbackModel(task, failedModelId);
      if (!fallbackId) throw new Error('No fallback model');
    
      const raw = await callModel(fallbackId, task, { signal: AbortSignal.timeout(2000) });
      return normalizeOutput(task, raw, { degraded: true, usedFallback: true, fallbackId });
    }
    
    1. 回應標註退化狀態:在 normalizeOutput 中加入:
    {
      "answer": "...",
      "meta": {
        "modelId": "local:qwen",
        "usedFallback": true,
        "fallbackFrom": "openai:gpt-4.1-mini",
        "degraded": true
      }
    }
    

    讓前端可以決定是否顯示「此回答為備援模型生成」。


    4. 觀測與日誌結構:解決「昨晚 agent 到底做了什麼」

    多模型編排很容易變成黑箱。建議最少做到:

    • 每個 Task 一個 traceId
    • log 中至少包含:
    • traceId, task.type, task.meta
    • 選擇的 modelId、fallback 情況
    • 每步 latency、token 使用量
    • 仲裁結果(如果有)

    示意:

    interface TaskLog {
      traceId: string;
      taskType: Task['type'];
      modelId: string;
      fallbackFrom?: string;
      latencyMs: number;
      inputTokens: number;
      outputTokens: number;
      success: boolean;
      error?: string;
    }
    
    async function logTask(log: TaskLog) {
      // 可寫入 ClickHouse / BigQuery / Elastic
      console.log(JSON.stringify({ kind: 'taskLog', ...log }));
    }
    

    這類結構化 log 是後續做「loop engineering」(自動 self-correct / regression test)與成本優化的基石。


    建議與注意事項

    1. 延遲放大:多模型 ≠ 多倍延遲

    • 儘量並行呼叫可獨立的模型,再用仲裁合併。
    • 嚴格設定 per-model timeout,避免某個模型拖垮整個請求。
    • 對長任務(如自動寫測試、長時間 agent loop)要分段 log,避免只看到「跑了一小時,掛了」。

    2. 工具 / 系統 prompt 不一致

    • 不同家模型對 system / tools / function calling 的支援度不同。
    • 最好的做法:
    • 定義自己的 工具層 schema(如 JSON Tool 定義)
    • 在 adapter 把它映射成各模型需要的格式
    • 千萬避免在業務邏輯裡到處寫 if (model === 'gpt-4.1-mini') 這種分支。

    3. 責任歸屬與 debug 困難

    多模型編排容易出現:

    • prompt 沒設好 → 模型亂回答
    • 路由策略不合理 → 小模型被丟去做艱難任務
    • 仲裁錯誤 → 明明較好的答案被丟掉

    實務上建議:

    • 為每一層定義清楚的「契約」
    • 路由層:輸入 Task,輸出 modelId,不關心內容
    • adapter:保證把 Task 翻譯成該模型最佳格式
    • 仲裁層:對模型輸出負責,不對業務邏輯負責
    • 做回溯時先問:錯在路由、adapter、模型本身、還是仲裁?

    4. 不要一開始就 over-engineer

    • 若你現在是:一個雲端 LLM + 少數工具,建議只先做:
    • 抽出 Task 類型
    • 寫好 model adapter(即使目前只有一個模型)
    • 之後要引入本地 Qwen、專用 code model、Fugu 式仲裁機制,就只是替換實作,而不是重寫整個系統。

    核心結論: 多模型協作不是把更多模型硬塞進系統,而是用 清晰的任務類型 + 路由 + 仲裁 + 可觀測性,把「哪個模型做什麼」變成一個可以演進的工程決策。從這個角度看,你可以在自己的專案裡做一個「迷你 Fugu」,用極少的代碼換來更好的成本控制、可靠性與供應商彈性。


    🚀 你現在可以做的事

    • 在現有專案中抽出一層 Task 類型與 routeModel(),把模型選擇邏輯從業務程式碼移出來
    • 寫一個簡單的 model adapter(例如包一層 callModel()),即使目前只支援單一 gpt-4.1-mini
    • 為每次模型呼叫加上 traceId 與結構化 log,開始累積日後做成本與可靠性優化所需的資料
  • 自託管 Airi:把 AI 養在自己電腦裡

    自託管 Airi:把 AI 養在自己電腦裡

    📌 本文重點

    • Airi 可完全自託管,長駐你自己的機器
    • 支援即時語音與遊戲互動,像住在電腦裡的同伴
    • 可接本地 LLM 或雲端 API,自訂人格與長期記憶

    Airi 解決的是:想要一個「常駐在自己電腦裡」、能語音聊天、陪你打遊戲,又不把隱私丟給雲端的大型 AI 代理人

    Airi GitHub:https://github.com/moeru-ai/airi


    核心功能:把 Airi「養」在自己機器上

    1. 自託管架構:本地 / 伺服器都能養

    Airi 是完全自託管的專案,你可以:

    • 裝在自己電腦:當成桌面語音助理、遊戲副駕駛
    • 架在家裡 NAS / 伺服器:多台裝置共用同一個 Airi
    • 放到雲端 VPS:人不在家也能連回自己的 AI

    實際能做的事:

    • 重要對話、長期記憶都留在你控制的機器
    • 想換模型、換人格、換語音,都自己改,不受商業服務限制

    你可以現在先做:

    1. 開啟 GitHub 專案頁:https://github.com/moeru-ai/airi
    2. 在 README 看「Installation」區段,決定你要:
    3. docker-compose 一鍵跑,或
    4. 用腳本 / 原始碼自己起服務

    2. 即時語音通話:真的像「住在你電腦裡的人」

    Airi 內建語音通話功能,可以做到:

    • 按一個按鈕就跟 Airi 說話,低延遲雙向語音
    • 語音輸入 + 語音輸出,像在跟 Discord 語音室裡的人聊天
    • 長時間掛在背景,隨時叫一下就回應你

    這比一般聊天機器人多了兩件事:

    • 不用切視窗打字,邊寫程式邊講話就能查資料、記 To-do
    • 遊戲全螢幕時仍可用語音讓 Airi 幫你查攻略、算資源

    你可以先準備:

    • 一個麥克風(筆電內建也可)
    • 耳機(避免回授回音)

    安裝好後,在 Airi 的 Web 或桌面客戶端裡,找到 Voice / Call / Talk 類選項,試著說一句:

    「幫我記一下,10 點要去打王。」

    確認 Airi 能聽懂、重複你剛說的提醒,就代表語音通路打通了。

    💡 關鍵: 長時間低延遲語音掛機,讓 Airi 更像常駐同事,而不是臨時叫用的聊天機器人。


    3. 跟遊戲雙向互動:Minecraft、Factorio 副駕駛

    Airi 的另一個重點,是能直接連到遊戲伺服器,讀取資訊、發送指令,目前官方強調支援:

    • Minecraft
    • 讀取聊天、座標、玩家狀態
    • 讓 Airi 發聊天訊息、執行伺服器指令
    • 能當「伺服器管理員」、「新手顧問」或「劇情 NPC」
    • Factorio
    • 掃描工廠狀態、產線 bottleneck
    • 建議你要擴產哪條線、缺哪種物資

    實際玩法舉例:

    • Minecraft 裡打 /askairi 我怎麼做一個自動農場?
    • Airi 在遊戲聊天裡回你步驟,同時用語音對你講解

    你可以安排一個晚上做這件事:

    1. 準備一個 Minecraft 伺服器(本地或雲端都可)
    2. 依 Airi README 中的 Minecraft / Factorio 插件說明:
    3. 在伺服器裝上 Airi 提供的插件 / 模組
    4. 在 Airi 設定檔填入伺服器位址與 API 金鑰
    5. 重新啟動伺服器並進入遊戲,測試呼叫 Airi

    4. 多平台客戶端 + 多種 LLM 後端

    Airi 支援:

    • Web 介面:瀏覽器直接用,管理設定、對話、記憶
    • macOS / Windows 客戶端
    • 固定在桌面右下角、選單列
    • 快捷鍵喚出,直接講話或輸入文字

    LLM 後端則非常彈性:

    • 本地開源模型(透過 Ollama、LM Studio 等)
    • 雲端 API:OpenAI、Anthropic、Qwen、Gemini…(依 README 支援)

    對於想要「免費 / 低成本玩起來」的讀者,建議:

    • 若有 16GB RAM 以上 + 顯示卡:考慮用 Qwen 3.x 7B / 14B 這種偏擅長 Agent 任務的模型
    • 若硬體較弱:先用 雲端 API 的小模型(如 gpt-4o-mini 類),避開本地推論壓力

    💡 關鍵: 有 16GB RAM 加獨顯時,本地模型就能順跑,真正做到零額外流量費與隱私全在自己機器。

    你現在可以做:

    • 選擇你要的模型來源,準備好:
    • 本地:先安裝 Ollama,拉一個模型 ollama pull qwen2.5:latest
    • 雲端:到 OpenAI / Anthropic 後台申請 API Key
    • 在 Airi 設定檔裡填入:模型名稱、API Key、base URL

    適合誰用:幾個具體場景

    1. 桌面語音助理:在你電腦旁邊工作的「同事」

    可以這樣用:

    • 開會前對 Airi 說:「幫我整理這份 PDF 的重點。」
    • 寫程式時問:「這段 TypeScript 為什麼報錯?」
    • 長時間聊天:讓 Airi 記住你正在進行的專案、偏好工具

    搭配其他工具:

    • 結合 Claude Code / Cursor / codegraph 之類開發環境,把「寫程式」交給 IDE,把「討論設計、備忘錄」交給 Airi

    行動建議: 安裝好後先定義一個簡單工作流,例如:

    每天早上請 Airi 根據行事曆排三件最重要的事,晚上讓它跟你一起檢討完成度。


    2. 遊戲副駕駛:策略腦 + 資源小管家

    在 Minecraft / Factorio / 其他支援的遊戲裡:

    • 讓 Airi 記住你的長期目標(例:一週內完成終界龍擊殺 / 火車自動物流)
    • 每次登入時請它提醒:現在缺什麼資源、下一步該做什麼
    • 遊戲裡臨時問:「我現在要去哪裡刷 X 資源效率最高?」

    高級玩法:

    • 讓 Airi 按固定節奏掃描伺服器狀態,自己發現問題
    • 例如:箱子爆滿、產線堵塞,就自動在聊天頻道喊你

    行動建議: 設計一個明確角色給 Airi,例如:

    「你是我們伺服器的資源總管,只關心是否缺料,缺了就通知我並給出最短補貨路線。」

    把這段人格設定寫進 Airi 的系統提示 / persona 設定中。


    3. 長陪伴聊天夥伴 + 跨工具 Agent

    如果你想要一個可以長期記住你喜好、過去對話的 AI:

    • 利用 Airi 的記憶系統,讓它記:
    • 你常玩的遊戲
    • 你的工作類型、平常的困擾
    • 你的目標(練英文、學某個框架…)
    • 長期和它聊,讓它慢慢形成「認識你」的狀態

    再往上,可以接其他 Agent 平台:

    • 例如:
    • Airi 作為前端「主對話窗口」
    • 後面串 zero.xyz 去調用 ~8000 個工具、API
    • Phasr 類工作流引擎,讓它一次跑多個任務而不丟上下文

    行動建議: 想一個你真的會常用的主題,例如「學習 Rust」,把它寫成 Airi 的長期任務:

    「你的任務是陪我在三個月內學會 Rust,定期出作業、review、提醒我寫 code。」

    💡 關鍵: 把長期學習或遊戲目標寫成任務與記憶,Airi 才能持續主動「記得你」而不是每次重來。


    怎麼開始:一個晚上就能跑起自己的 Airi

    1. 推薦最低硬體配置

    • CPU:四核心以上
    • RAM:16GB 起跳(跑本地 LLM 比較穩;如果只用雲端 API,8GB 也可)
    • 儲存:至少預留 20GB(模型 + 日誌 + 記憶)
    • 顯示卡:有獨顯最好(跑本地模型會輕鬆很多),沒有也能用雲端 API

    2. 用 Docker 一鍵跑起來

    以常見流程簡化示意(實際請以官方 README 為準):

    # 1. 先裝好 Docker & Docker Compose
    # 2. 在你想放 Airi 的資料夾裡:
    
    git clone https://github.com/moeru-ai/airi.git
    cd airi
    
    # 3. 啟動服務
    docker compose up -d
    

    接著:

    1. 瀏覽器開 http://localhost:PORT(PORT 依 README 為準)
    2. 看到 Airi 的 Web 介面後,先建立一個帳號 / 角色
    3. 在設定頁:
    4. 選擇 LLM 後端(本地或雲端)
    5. 設好語音輸入輸出

    如果你不熟 Docker,專案通常也會提供一鍵腳本(如 run.sh / start.ps1 類),照 README 指示執行即可。


    3. 配一個免費 / 便宜的模型

    兩條路線擇一:

    路線 A:本地開源模型(零額外成本,壓力在硬體)

    1. 安裝 Ollama:https://ollama.com
    2. 下載一個中小型模型,例如:

    bash
    ollama pull qwen2.5

    1. 在 Airi 設定裡把 LLM URL 指向 http://localhost:11434,模型名稱填 qwen2.5

    路線 B:雲端 API(硬體負擔低,按量計費)

    1. 到你喜歡的 LLM 服務註冊帳號(如 OpenAI)
    2. 建立 API Key
    3. 在 Airi 介面填入:
    4. API Key
    5. 模型名稱(例如 gpt-4o-mini

    測試是否成功: 在 Airi 裡輸入一句:「幫我用條列整理一下 Airi 是什麼?」看能否正常回覆。


    4. 進階玩法:Minecraft 綁語音 + 自訂人格與長期記憶

    (1) Minecraft + 語音副駕駛

    大致步驟(細節以 Airi README 中的 Minecraft 節為準):

    1. 在你的 Minecraft 伺服器安裝 Airi 專用插件 / Mod
    2. 在 Airi 後台新增一個「Minecraft 連線」,填入:
    3. 伺服器位址
    4. 驗證金鑰
    5. 設定一個提示模板,例如:

    你是這個伺服器的導遊,會用中文在遊戲聊天和語音裡同時回應玩家問題。

    測試:在遊戲裡打 /airi 這附近有什麼資源?,看聊天與語音是否同步回應。

    (2) 自訂人格 + 長期記憶

    在 Airi 的 persona 或 system prompt 區裡,可以寫:

    • 身份:

      你是住在我電腦裡的 AI 室友,平常會關心我的工作進度和遊戲計畫。

    • 口吻:

      輕鬆、直接,避免太官方的說話方式。

    • 記憶策略:

      遇到我的偏好、長期目標、常見問題時,請寫入長期記憶,下次主動提起。

    接著在 Web 介面裡,偶爾去「記憶 / memories」頁面檢查:

    • 刪掉已過時的資訊
    • 補充重要但沒被好好記錄的背景

    這樣 Airi 就會越來越像一個真的「老朋友」,而不是每次都從零開始的聊天機器人。


    最後,建議你空出一個完整晚上,按這個節奏走:

    1. 用 Docker 跑起 Airi
    2. 選一個模型 + 打通語音
    3. 寫一段屬於你的 persona
    4. 如果有 Minecraft 伺服器,再綁一次遊戲互動

    做到這四步,你就真正「把一個 AI 養在自己的電腦裡」,之後只需要慢慢調人格、調記憶,讓它變成最懂你的那一個。

    🚀 你現在可以做的事

    • 打開 Airi GitHub 專案,按照 README 用 docker compose up -d 跑起第一個實例
    • 在 Airi 設定中接上一個模型(本地 qwen2.5 或雲端 gpt-4o-mini),並測試一句對話是否正常
    • 寫一段簡短 persona(例如「AI 同事」或「伺服器資源總管」),儲存後連續跟它聊幾天觀察效果