---
title: "利用AI強化語言學習：打造即時語音翻譯互動小工具"
description: "結合 Azure 語音識別與 Azure OpenAI ChatGPT，打造可即時翻譯並生成例句回應的語言學習輔助工具，以 Python 實作。"
canonical_url: "https://blog.markkulab.net/post/ai-english-learning-assistant"
author: "Mark Ku"
author_url: "https://blog.markkulab.net/author/mark-ku"
site: "Mark Ku's Blog"
date_published: "2024-05-21 01:01:35 +0800"
category: "AI"
tags: ["ai", "azure", "speech-recognition", "openai", "python", "language-learning"]
language: "zh-TW"
license: "CC BY 4.0"
license_url: "https://creativecommons.org/licenses/by/4.0/"
attribution: "轉載或引用請註明作者並附上原文連結"
---

# 利用AI強化語言學習：打造即時語音翻譯互動小工具

## 前言
在多語言溝通日益重要的今天，掌握一門外語已經成為許多人的目標。不過，語言學習不僅需要時間和耐心，還需要有效的實踐機會。本文將介紹如何使用最新的人工智能技術，結合微軟的Azure語音識別和OpenAI的ChatGPT，來創建一個可以即時翻譯和回應的工具，幫助使用者更好地學習和應用新語言。

## 預先準備
在開始之前，你需要準備以下幾樣東西：
* Python 環境：用於執行我們的腳本。
* Microsoft Azure 訂閱：用於訪問語音識別服務。
* Azure OpenAI API 密鑰：用於生成基於ChatGPT的回答。

## 運作原理
這個系統的核心是結合了Azure的語音識別技術和OpenAI的語言理解能力。整個流程可以分為以下幾個步驟：  

1. 語音輸入：系統通過麥克風捕捉用戶的語音。  
2. 語音識別：Azure的語音服務將捕捉到的語音轉換成文字。  
3. 生成回答：將識別出的文字傳送給ChatGPT，生成三個簡單的例句回答。  
4. 顯示結果：將ChatGPT提供的回答即時顯示給用戶。  

程式碼實現
下面是一個簡單的Python腳本示例，展示了如何整合Azure語音服務和OpenAI的ChatGPT模型：

```
import os
import azure.cognitiveservices.speech as speechsdk
from langchain.prompts import ChatPromptTemplate
from langchain_openai import AzureChatOpenAI

# 設定OpenAI環境變數
os.environ["AZURE_OPENAI_ENDPOINT"] = "https://xxx.openai.azure.com/"
os.environ["AZURE_OPENAI_API_VERSION"] = "2024-02-15-preview"
os.environ["AZURE_OPENAI_CHAT_DEPLOYMENT_NAME"] = "gpt3-turbo"

# 初始化OpenAI模型
model = AzureChatOpenAI(
    openai_api_version=os.environ["AZURE_OPENAI_API_VERSION"],
    azure_deployment=os.environ["AZURE_OPENAI_CHAT_DEPLOYMENT_NAME"],
)

# 為OpenAI設定聊天模板
chat_template = ChatPromptTemplate.from_messages(
    [
        ("system", "你是一個國中英文老師.善於用簡單的單詞溝通."),
        ("human", "關於英文問題{question}, 給我怎麼回覆的三個句子，並給中文翻譯. 比較音節困難的單字額外給音標，音標放在單字後面"),
    ]
)

def get_responses(question):
    message = chat_template.format_messages(question=question)
    response = model.invoke(message)
    return response.content

def translate_speech_to_text_continuous():
    # 用於語音翻譯的Azure訂閱金鑰和服務區域
    speech_key = "<Your-Azure-Speech-Key>"
    service_region = "eastus"
    from_language = "en-US"
    to_language = "zh-Hant"

    # 創建語音翻譯配置和識別器
    translation_config = speechsdk.translation.SpeechTranslationConfig(
        subscription=speech_key, region=service_region,
        speech_recognition_language=from_language)
    translation_config.add_target_language(to_language)

    recognizer = speechsdk.translation.TranslationRecognizer(translation_config=translation_config)

    with open("translation_log.txt", "w", encoding="utf-8") as log_file:
        def recognized_handler(evt):
            result = evt.result
            if result.reason == speechsdk.ResultReason.TranslatedSpeech:
                recognized_text = f"Recognized: {result.text}\n"
                translated_text = f"Translated into Traditional Chinese: {result.translations['zh-Hant']}\n"
                print(recognized_text)
                print(translated_text)
                log_file.write(recognized_text)
                log_file.write(translated_text)

                # 如果識別的文字是問題，獲得簡單的例句回答
                responses = get_responses(result.text)
                print("例句:\n")
                print(responses)
                log_file.write(f"Responses: {responses}\n")

            elif result.reason == speechsdk.ResultReason.NoMatch:
                no_match_text = "No speech could be recognized\n"
                print(no_match_text)
                # log_file.write(no_match_text)
            elif result.reason == speechsdk.ResultReason.Canceled:
                cancellation_details = result.cancellation_details
                canceled_text = f"Speech Recognition canceled: {cancellation_details.reason}\n"
                # print(canceled_text)
                # log_file.write(canceled_text)
                if cancellation_details.reason == speechsdk.CancellationReason.Error:
                    error_text = f"Error details: {cancellation_details.error_details}\n"
                    print(error_text)
                    log_file.write(error_text)

        recognizer.recognized.connect(recognized_handler)

        # 開始連續識別
        recognizer.start_continuous_recognition()
        print("Listening...")

        try:
            # 保持程序運行直到按Enter鍵停止
            input("Press Enter to stop...\n")
        finally:
            recognizer.stop_continuous_recognition()

if __name__ == "__main__":
    translate_speech_to_text_continuous()
```
## 運行結果
1. 當您運行這個Python腳本時，執行畫面的交互將會按照以下步驟展開：  
2. 啟動提示：當您啟動腳本後，系統會首先顯示"請說些什麼..."，提示用戶開始說話。  
3. 語音輸入：此時您可以向麥克風說話。您說的話將被系統捕捉。  
4. 顯示識別結果：一旦語音輸入結束，Azure的語音識別服務會處理這段語音並將其轉換為文字。這個轉換過程通常非常快速。系統將在屏幕上顯示識別的文字，例如："識別的文字: 你好，我想了解更多關於AI的資訊。"  
5. 回答生成：識別的文字會被發送到ChatGPT，ChatGPT會基於這些文字生成回答。這個過程大約需要幾秒鐘。  
![final-screen](https://blog.markkulab.net/content/markku/posts/ai-english-learning-assistant/images/final-screen.jpg)

---

## 關於本文與作者

本文出自 [Mark Ku's Blog](https://blog.markkulab.net/post/ai-english-learning-assistant)

授權條款： [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) — 轉載或引用請註明作者並附上原文連結

### 關於作者

**[Mark Ku](https://blog.markkulab.net/author/mark-ku)** — Software Solution Provider

- 10+ 年資深軟體工程師，現為 AI 應用 Builder
- 專注大型平台架構設計，從北美電商到AI SaaS訂閱收費系統
- 結合 AI Agent 與自動化，打造高效可演進的產品技術基礎

### 作者開發的免費工具

以下工具皆可免費使用：

- [免費 PDF 簽名工具](https://blog.markkulab.net/tools/pdf-sign): 線上 PDF 簽名工具，瀏覽器內完成手繪、打字、上傳簽名，可拖曳放置、縮放、下載。所有處理都在你的裝置完成，檔案不會上傳。
- [VS Code Refactory](https://blog.markkulab.net/tools/refactory): Refactory 是一款 VS Code 重構擴充套件：34 個重構動作、37 條 code smell 檢查、Code Health 儀表板、18 種語言、534 支測試。懂你的專案慣例：介面放哪、DI 註冊寫在哪、'use client' 該不該加；還會用 git 修改頻率 × 複雜度排出「該先修哪個檔案」，並一鍵把壞味道交給你自己電腦上的 Claude Code 修。免費使用，原始碼不離開你的機器。
- [DB-Kit 資料庫管理工具](https://blog.markkulab.net/tools/db-kit): DB-Kit 是一個用 Tauri + Rust + React 打造的輕量跨平台資料庫管理工具，用單一一致的介面同時管理 MySQL、MariaDB、PostgreSQL、SQL Server、Oracle、SQLite、MongoDB、Redis、Kafka、Elasticsearch 與 RabbitMQ 十一種資料來源：連線密碼以 OS keychain 加密、SSH Tunnel、完整 CRUD、視覺化查詢建構器、多結果集同時顯示、跨連線資料傳輸與比對同步、Excel / CSV 匯入匯出、執行計畫視覺化、ER 圖、排程備份、SQL 壓力測試（p50～p99 延遲百分位）、15 條規則的 SQL 審查、Kafka 訊息瀏覽與監控告警；繁中 / 英文雙語介面，內建 AI 助手（自然語言生成 SQL、AI 審查與調校建議）與命令列工具 dbk。免費開源（MIT），提供 Windows / macOS / Linux 安裝檔。
- [VS Code Super Mermaid](https://blog.markkulab.net/tools/super-mermaid): Super Mermaid 是一款 VS Code 擴充套件：開箱即用的漂亮 Mermaid 圖表，自動上色、即時預覽、滑鼠平移縮放、PNG / SVG 高解析匯出，內建 21 種範本與多種主題。免費開源（MIT）。
- [React Super Mermaid](https://blog.markkulab.net/tools/react-super-mermaid): react-super-mermaid 是一個開源 React 元件庫：一行 <MermaidViewer> 即可渲染漂亮的 Mermaid 圖表，內建 colorful / sketch 主題、平移縮放、圖內搜尋、SVG / PNG 高解析匯出。輕量、SSR 安全、完整 TypeScript 型別。免費開源（MIT）。
- [Jira / Confluence Super Mermaid](https://blog.markkulab.net/tools/jira-super-mermaid): Atlassian Forge app：在 Jira issue 與 Confluence 內文直接寫 Mermaid 語法，畫流程圖、時序圖、狀態機與甘特圖。11 種圖表、SVG / PNG 匯出、明暗主題、完整中日韓文字支援。取得 Runs on Atlassian 資格：圖表存在你自己的站台，app 不呼叫任何第三方服務。免費，即將上架 Atlassian Marketplace。
- [Mermaid 線上預覽](https://blog.markkulab.net/tools/mermaid-preview): 在瀏覽器裡寫 Mermaid、即時看圖，整張圖表壓進網址就能分享。免註冊、不上傳伺服器，相容 mermaid.live 的分享連結。
- [React Intl Phone Number](https://blog.markkulab.net/tools/react-intl-phone-number): react-intl-phone-number 是一個開源 React 元件：framework-agnostic、不依賴 antd，提供 E.164 進出、可搜尋國旗 / 國碼下拉、可配置驗證等級（strict / mobile-strict / loose）、可主題化 CSS 與 i18n，電話邏輯由 google-libphonenumber 驅動。輕量、完整 TypeScript 型別。免費開源（MIT）。
- [Uptime Kuma Cluster](https://blog.markkulab.net/tools/uptime-kuma-cluster): 把單機版 Uptime Kuma 改造成高可用叢集：OpenResty + Lua 智慧負載平衡、MariaDB 共享狀態、健康檢查與自動 Failover，附叢集管理 REST API，一行 Docker Compose 啟動。免費開源（MIT）。
- [特教專案](https://blog.markkulab.net/education): 為特殊教育學生製作的學習教材

### 每日 Podcast

- [科技新鮮事](https://blog.markkulab.net/category/tech-news): 每日精選 AI 與科技趨勢，透過語音摘要快速掌握最新技術動態，涵蓋 AI 應用、軟體架構、DevOps 與工程實戰。 — RSS: https://blog.markkulab.net/feed.xml
- [AI股市蝦聊](https://blog.markkulab.net/category/ai-stock-chat): 每個交易日用 AI 分析台股盤勢，以雙人對話聊當天的盤中觀察與隔日預測。 — RSS: https://blog.markkulab.net/ai-stock-chat/feed.xml

### 電子報

[訂閱電子報](https://blog.markkulab.net/subscribe) — 第一時間收到新文章通知，無垃圾信、隨時可取消訂閱。
