# 課程介紹與講師 * 課程主題:在 Python 中實作語音辨識,透過五個專案學習 * 講師:Patrick(軟體工程師)與 Lisa(資料科學家),皆為 AssemblyAI 開發者倡導者 * AssemblyAI:提供語音轉文字 API,課程使用其服務進行專案開發 # 課程五個專案 * 專案一:錄製音訊,從麥克風擷取聲音並儲存為 WAV 檔 * 專案二:使用 AssemblyAI API 對錄音檔執行語音辨識 * 專案三:分析 YouTube 上的 iPhone 評論情緒 * 專案四:摘要線上 Podcast 並建立網頁展示結果 * 專案五:結合語音辨識與 OpenAI API 製作問答應用 # 音訊格式基礎 ![image](https://hackmd.io/_uploads/rJnpErMlbe.png) ![image](https://hackmd.io/_uploads/BySbrBfgWe.png) * 常見格式:MP3(有損壓縮)、FLAC(無損壓縮)、WAV(未壓縮) * WAV 優點:音質最佳、結構簡單、Python 內建 wave 模組可直接操作 # 音訊訊號參數 ![image](https://hackmd.io/_uploads/Skn7BHGebe.png) * channels:聲道數(1 為 mono,2 為 stereo) * sample width:每個樣本的位元組數 * frame rate(sample rate):每秒取樣次數,CD 標準為 44.1 kHz * number of frames:整段音訊的總取樣數 * 每個 frame 的值為二進位格式,可轉為整數 # 讀取與寫入 WAV 檔 ![image](https://hackmd.io/_uploads/HJzFrBfeWg.png) * 使用 wave.open() 開啟檔案(讀取模式為 'rb') * 可取得參數:nchannels、sampwidth、framerate、nframes * 讀取音訊內容用 readframes(),結果為 bytes 物件 * 重新寫入檔案時設定相同參數,使用 writeframes() 寫入資料 # 視覺化音訊波形 ![image](https://hackmd.io/_uploads/BJY-PSzlbl.png) * 使用 matplotlib 與 numpy 繪圖 * 將 bytes 轉為 numpy array,dtype 設為 int16 * 使用 linspace 生成時間軸,橫軸為時間、縱軸為音訊取樣值 * 可清楚看到聲音波形隨時間變化 # 麥克風錄音實作 ![image](https://hackmd.io/_uploads/H1nkDSMxWe.png) ![image](https://hackmd.io/_uploads/SJN0PHfx-l.png) * 使用 PyAudio 錄音,支援多平台(Linux、Windows、macOS) * 重要參數:frames_per_buffer、format(int16)、channels、rate(如 16000 Hz) * 透過 stream.read() 擷取音訊資料,儲存在 frames list 中 * 錄音完成後停止、關閉 stream 並終止 PyAudio * 使用 wave 模組將 frames 寫入 WAV 檔 # 載入與操作 MP3 檔 ![image](https://hackmd.io/_uploads/HJ0ADHMxWx.png) * 使用 pydub 模組(需先安裝 ffmpeg) * AudioSegment 物件可讀取 MP3 或 WAV * 可調整音量(+6 dB)、重複片段、加入淡入淡出效果 * 匯出音檔時使用 export() 並指定格式 * 可再讀取匯出後的檔案驗證處理結果 # 第一部分內容總覽 * 認識音訊格式與關鍵參數 * 學會使用 wave 模組載入、儲存、複製音訊 * 能使用 matplotlib 繪製波形圖 * 實作麥克風錄音與輸出 WAV 檔 * 能使用 pydub 處理與輸出 MP3 音訊 * 為後續語音辨識與 API 專案建立基礎 --- # 專案目標與流程 ![image](https://hackmd.io/_uploads/By7vuSMebl.png) * 將本地音訊檔上傳至 AssemblyAI,取得轉寫文字 * 四步驟:上傳檔案 → 發起轉寫 → 輪詢狀態 → 寫入文字檔 * 範例音檔:「hi i'm patrick this is a test123」,轉寫結果一致 # 主要依賴 ![image](https://hackmd.io/_uploads/Hyk_dHMe-e.png) * AssemblyAI API(取得並使用 API Key) * Python `requests`(HTTP 通訊) * Python 標準庫:`sys`(讀取命令列參數)、`time`(輪詢間隔) # API 金鑰與設定 * 到 assemblyai.com 建立帳號並複製 API Key * 建立設定檔存放 API Key * 以 HTTP Header `Authorization: <API Key>` 驗證 # 端點與 HTTP 方法 * 上傳端點:`/v2/upload`,使用 `POST` * 轉寫端點:`/v2/transcript`,使用 `POST` * 輪詢端點:`/v2/transcript/{id}`,使用 `GET` * 上傳採分塊讀取,建議每塊 5MB # 命令列參數 * 以 `sys.argv[1]` 取得音訊檔名 * 由終端執行:`python main.py <檔名>` # 上傳流程 ![image](https://hackmd.io/_uploads/SyN-YrzxZg.png) ![image](https://hackmd.io/_uploads/Sy4MtHfebx.png) * 以讀檔產生器分塊讀取音訊 * `POST /upload` 附帶 Header 與檔案資料 * 取得回傳的 `upload_url` 作為後續轉寫的 `audio_url` # 發起轉寫 ![image](https://hackmd.io/_uploads/B1ErFrzeZe.png) ![messageImage_1762969929415](https://hackmd.io/_uploads/rJDuFrGlWx.jpg) * `POST /transcript` 請求 JSON 內含 `audio_url` * 立即回傳轉寫工作 `id`,非同步處理 # 輪詢結果 ![messageImage_1762970176598](https://hackmd.io/_uploads/S1XUcrGx-g.jpg) * 以 `GET /transcript/{id}` 查詢狀態 * 觀察 `status` 欄位:`processing`、`completed`、`error` * 使用 `while True` 迴圈輪詢,未完成時 `time.sleep(30)` 再查詢 # 儲存轉寫 ![image](https://hackmd.io/_uploads/Byf59rGgWe.png) * 轉寫完成後從回應 `text` 取出全文 * 以原檔名加上 `.txt` 存檔 * 失敗時輸出錯誤內容以便除錯 # 函式化與重構 * `upload(file_name) → audio_url` * `transcribe(audio_url) → job_id` * `poll(transcript_id) → response_json` * `get_transcription_result(audio_url) → (data, error)` * `save_transcript(file_name, audio_url)` 將結果寫檔 * 將 API 溝通函式移至 `api_communication.py`,主程式僅負責流程調用 # 錯誤處理與訊息 * 狀態為 `error` 時回傳錯誤資訊 * 執行過程打印必要提示(如等待 30 秒) # 補充資料 * 回應包含逐字詞的開始與結束時間(毫秒)與信心分數 * 可用於更進階功能(非本教學重點) # 實測與結果 * 短音檔成功轉寫為「hi i'm patrick this is a test123」 * 較長的一分鐘音檔可正常轉寫但需較久時間 * 最終會生成同名 `.txt` 檔,內容為完整轉寫文字 --- # 專案目標 ![image](https://hackmd.io/_uploads/ry3SBtMxZl.png) * 對 YouTube 影片做情緒分析,逐句產生文字與情緒標籤(positive、negative、neutral) * 不下載整部影片,直接取得可存取的音訊 URL 後送至轉寫與情緒分析 * 輸出轉寫結果與情緒結果為檔案,供後續統計與展示 # 主要套件與服務 ![image](https://hackmd.io/_uploads/B1XDSFfx-e.png) * youtube-dl:擷取 YouTube 影片資訊或媒體連結 * AssemblyAI:語音轉文字與情緒分析 API * json:輸出與讀取結果檔 * 既有專案結構:api 機制(密鑰與 helper)、youtube_extractor、main # YouTube 資訊與音訊 URL 取得 ![image](https://hackmd.io/_uploads/rJ2nStzebe.png) ![messageImage_1762985427419](https://hackmd.io/_uploads/HJLkLFMxZx.jpg) * 使用 YoutubeDL.extract_info(url, download=False) 取得影片或播放清單資訊 * 若為播放清單,選取 entries[0] 作為單一影片 * 從 result["formats"] 遍歷,篩選 ext == "m4a" 的純音訊格式並取其 url * 取得之音訊 URL 為第三方托管位址,非 youtube.com # 與 AssemblyAI 串接流程 ![image](https://hackmd.io/_uploads/rJUe8FMlbl.png) ![image](https://hackmd.io/_uploads/rkcZ8KMxWx.png) * 以音訊 URL 呼叫轉寫 API,並在 JSON 請求中加入 sentiment_analysis=True * 轉寫完成後,取得 transcript 與 sentiment 分析結果 * 儲存 transcript 檔與 sentiments 檔,檔名以影片標題整理(去空白、以底線取代空格),存入 data/ 目錄 # 檔案與命名約定 * 轉寫檔:以影片標題為名存於 data/,純文字或 JSON 皆可 * 情緒檔:同名加上 _sentiments.json,縮排便於閱讀 * 影片標題經 strip 與空白替換,避免檔名不合法 # Sentiment 結果資料結構(重點欄位) * text:句子內容 * start、end:時間戳(秒或毫秒) * sentiment:positive、neutral、negative * confidence:分類信心度 # 基礎統計與評估 * 讀取 sentiments JSON,依 sentiment 分類收集句子 * 計算 positive、negative、neutral 各自數量 * 計算正向比率 = positives / (positives + negatives) * 用於快速評估評論傾向與整體情緒概況 # 關鍵實作細節 * youtube-dl 僅抽取資訊不下載媒體(download=False)以節省時間與流量 * 轉寫與情緒分析為非同步雲端工作,須輪詢或封裝等待邏輯(由既有 api helper 處理) * build 管線中建議將 API 金鑰與環境參數以 Secrets 管理(此專案已在 api helper 中使用) # 產出與應用場景 * 產出逐句情緒與文字對應,適合評論摘要、品牌聲量監控、內容品質評估 * 可延伸至前端 Web App 視覺化呈現,支援搜尋、篩選、統計圖表 --- # 專案目標與成品 ![image](https://hackmd.io/_uploads/BJGVIYGgZl.png) * 建立「Podcast 章節摘要」應用與網頁介面,來源音訊由 Listen Notes 取得,使用 AssemblyAI 產生自動章節與摘要,介面顯示封面、Podcast 與集數標題、章節清單與摘要 # 架構與依賴 ![image](https://hackmd.io/_uploads/BkaS8Yfl-l.png) * `api_communication.py` 負責 API 呼叫與工具函式 * `main.py` 負責流程控制與 Streamlit 介面 * 使用 `requests`、`json`、`streamlit`、`time` * 需要 AssemblyAI API Key 與 Listen Notes API Key # API 與端點 * AssemblyAI 轉寫:`/v2/transcript` * AssemblyAI 查詢:`/v2/transcript/{id}` * Listen Notes 集數:`/v2/episodes/{episode_id}` * 認證 Header:AssemblyAI 使用 `Authorization`,Listen Notes 使用 `X-ListenAPI-Key` # 取消上傳與資料取得改動 * 不使用 `/upload` 與分塊上傳,直接以遠端 `audio_url` * 透過 `episode_id` 從 Listen Notes 取得 `audio`、`image`、`podcast.title`、`title` # 後端流程 * 以 `episode_id` 取得 `audio_url` 與顯示資訊 * 呼叫 AssemblyAI 建立轉寫任務並設定 `auto_chapters: true` * 每 60 秒輪詢 `transcript_id` 直到完成或錯誤 * 完成後寫入 `episode_id_chapters.json` # 主要函式職責 * `get_episode_audio_url(episode_id)` 回傳 `audio_url`、`episode_thumbnail`、`podcast_title`、`episode_title` * `transcribe(audio_url, auto_chapters=True)` 回傳 `job_id` * `poll(transcript_id)` 回傳結果 JSON * `get_transcription_result(audio_url, auto_chapters=True)` 回傳 `(data, error)` * `save_transcript(episode_id)` 串接前述流程並存檔 # 儲存格式 * JSON 欄位含 `chapters`(每章節含 `start`、`end`、`gist`、`headline`、`summary`)、`episode_thumbnail`、`episode_title`、`podcast_title` # Streamlit 介面 * `st.title("Podcast Summaries")` 顯示標題 * 側欄 `st.sidebar.text_input` 輸入 `episode_id` * 側欄 `st.sidebar.button("Get Podcast Summary", on_click=save_transcript, args=(episode_id,))` * 讀取 `episode_id_chapters.json` 後以 `st.header` 顯示 `{podcast_title} - {episode_title}` 並用 `st.image` 顯示縮圖 * 迭代 `chapters` 以 `st.expander` 顯示每章節的 `gist` 與 `summary` # 時間格式處理 * 將毫秒 `start` 轉為 `HH:MM:SS` 或 `MM:SS`,有小時則顯示 `H:M:S`,無小時顯示 `M:S` # 行為與等待設定 * 輪詢間隔 60 秒以適應較長音訊 * 僅在按鈕被點擊後觸發下載與顯示流程 # 錯誤與狀態 * 狀態為 `error` 時回傳錯誤訊息供介面顯示 * 執行過程僅輸出必要提示訊息 --- # 專案目標 ![image](https://hackmd.io/_uploads/HkqxPKMl-e.png) ![image](https://hackmd.io/_uploads/B1JMDYMgWe.png) ![image](https://hackmd.io/_uploads/ryMmPKMlZx.png) ![image](https://hackmd.io/_uploads/Sk_X_Ffl-l.png) * 在 Python 實作即時語音辨識 * 串接 OpenAI API 建立語音對話助理 * 使用 WebSockets 與 asyncio 實作雙向即時通訊 # 使用技術 * PyAudio:麥克風錄音 * websockets:WebSocket 客戶端 * asyncio:非同步事件迴圈 * AssemblyAI 實時 ASR(需升級帳號) * OpenAI API:文字問答 * base64、json:音訊編碼與資料序列化 # 專案結構 * `api_secrets`:存放 AssemblyAI 與 OpenAI 金鑰 * `main.py`:錄音、WebSocket 傳輸、接收轉寫、呼叫聊天回覆 * `openai_helper.py`:封裝發問與回覆取得 # 即時語音辨識流程 * 以 PyAudio 開啟麥克風串流(如 16kHz、int16、mono) * 連線 AssemblyAI WebSocket(URL 需帶 sample_rate 參數) * 非同步同時執行「送音訊」與「收轉寫」 # WebSocket 連線重點 * 連線時附加授權標頭(Authorization) * 設定 `ping_timeout` 與 `ping_interval` * 連線後短暫 `asyncio.sleep(0.1)` 等待就緒 # 發送音訊邏輯 * 循環讀取 `frames_per_buffer` 的音訊塊 * 設 `exception_on_overflow=False` 避免溢位中斷 * 將音訊以 base64 編碼,包成 `{"audio_data": ...}` 的 JSON 傳送 * 傳送迴圈間以 `asyncio.sleep(...)` 節流 # 接收轉寫邏輯 * 持續接收 JSON,解析 `text` 與 `message_type` * 僅在 `message_type == "final_transcript"` 時使用完整句子 * 於終端顯示「使用者:轉寫文字」 # 與 OpenAI 串接 * 在 helper 中設定 API key,實作發問函式 * 將最終轉寫文字作為 `prompt` 傳給 OpenAI * 取得回覆文字並於終端顯示「機器人:回答」 # 執行流程 * `asyncio.run(send_receive())` 啟動 * `asyncio.gather(send(), receive())` 併行處理 * 使用者開口說話→ ASR 回傳文字→ 傳給 OpenAI→ 回覆顯示 # 錯誤處理重點 * 捕捉 `websockets.exceptions.ConnectionClosedError` 並終止迴圈 * 修正常見錯誤:`await asyncio.gather(...)` 不可遺漏 * base64、JSON 轉換失敗時應中斷當次資料並繼續循環 # 參數設定重點 ![messageImage_1762986089897](https://hackmd.io/_uploads/Sk5uOKzxbl.jpg) * `rate=16000`、`format=int16`、`channels=1` 與 WebSocket `sample_rate` 一致 * `frames_per_buffer` 影響延遲與穩定度 * OpenAI `max_tokens` 控制回覆長度 # 成品行為 * 啟動程式後可直接對麥克風發問 * 於終端即時顯示辨識文字與聊天機器人回覆 * 支援連續對話與多輪問答 --- # Terminology * 語音辨識(Speech Recognition):將人類語音轉換成文字的技術。 * 組合式人工智慧(Assembly AI):提供語音轉文字 API 的深度學習公司。 * 應用程式介面(API, Application Programming Interface):讓應用程式之間可互相溝通的介面。 * 音訊資料(Audio Data):以數位方式儲存的聲音訊號。 * 麥克風輸入(Microphone Input):從麥克風擷取的即時聲音資料。 * 波形音訊格式(WAV, Waveform Audio File Format):未壓縮的音訊檔案格式。 * MP3 格式(MP3, MPEG Audio Layer III):常見的有損壓縮音訊格式。 * FLAC 格式(FLAC, Free Lossless Audio Codec):無損壓縮音訊格式。 * 音訊取樣率(Sample Rate):每秒取樣的次數,單位為赫茲(Hz)。 * 取樣寬度(Sample Width):每個取樣點的位元組數,決定音質精度。 * 聲道數(Channels):音訊的獨立輸出通道數,如單聲道或立體聲。 * 音訊框架(Frame):音訊中包含取樣資料的最小單位。 * 位元深度(Bit Depth):描述每個取樣的位元數,影響音訊解析度。 * 音訊時長(Audio Duration):整個音訊檔案的時間長度。 * 二進位資料(Binary Data):以位元組形式儲存的音訊原始資料。 * Numpy 陣列(Numpy Array):Python 中用於處理數值與矩陣運算的結構。 * Matplotlib 圖表(Matplotlib Plot):Python 的繪圖套件,用於視覺化音訊訊號。 * 波形圖(Waveform Plot):顯示音訊隨時間變化的振幅曲線圖。 * PortAudio 函式庫(PortAudio Library):跨平台的音訊 I/O 函式庫。 * PyAudio 模組(PyAudio Module):Python 對 PortAudio 的封裝,用於錄音與播放。 * 緩衝框架(Frames per Buffer):每次錄音或播放處理的音訊資料塊大小。 * 資料流(Stream):連續傳送或接收音訊資料的通道。 * 輸入裝置(Input Device):如麥克風,用於擷取音訊訊號的硬體。 * 錄音物件(Recording Object):用來建立與管理錄音設定的 Python 物件。 * 結束錄音(Stop Stream):停止正在進行的錄音或播放流程。 * 終止 PortAudio(Terminate PortAudio):釋放音訊資源並關閉連線。 * 聲波取樣(Sound Sampling):將聲音連續波形轉換為離散數值的過程。 * 音訊轉換(Audio Conversion):不同格式間的轉換,例如 wav 轉 mp3。 * FFmpeg 工具(FFmpeg Tool):跨平台的多媒體轉換與處理工具。 * Pydub 函式庫(Pydub Library):簡化音訊讀取、編輯與輸出的 Python 套件。 * 音訊段(Audio Segment):Pydub 中表示音訊的基本物件。 * 音量調整(Volume Adjustment):對音訊音量進行分貝增減的操作。 * 淡入(Fade In):音訊在播放開始時逐漸增強音量的效果。 * 淡出(Fade Out):音訊結尾時逐漸減弱音量的效果。 * 重複播放(Audio Looping):將音訊片段重複多次以延長長度。 * 音訊匯出(Audio Export):將處理後的音訊儲存為新檔案。 * 音訊合併(Audio Merging):將多個音訊片段組合為單一音訊。 * 聲音波形(Sound Waveform):表示聲音振幅隨時間變化的圖像。 * 聲音取樣頻率(Sampling Frequency):單位時間內取樣的次數。 * 音訊振幅(Amplitude):音訊波形的強度或音量大小。 * 聲音時間軸(Time Axis):在波形圖上代表時間的橫軸。 * 聲音資料緩衝區(Audio Buffer):暫存音訊資料的記憶體區塊。 * 位元組串流(Byte Stream):以位元組形式連續傳送的音訊資料。 * 錄音秒數(Recording Duration):設定錄音要進行的時間長度。 * 音訊封包(Audio Packet):音訊傳輸中包含聲音資料的資料單位。 * 語音資料集(Speech Dataset):用於訓練或測試語音模型的音訊資料集合。 * 聲音可視化(Audio Visualization):將音訊訊號以圖形方式呈現。 * 語音文字轉換(Speech-to-Text, STT):將語音內容轉為文字的技術。 * 自然語言處理(Natural Language Processing, NLP):讓電腦理解與分析文字的技術。 * 情感分析(Sentiment Analysis):分析語音或文字情緒傾向的演算法。 * 播客摘要(Podcast Summarization):將長篇音訊內容自動生成簡短摘要。 * 問答應用(Q&A Application):能根據語音輸入回覆使用者問題的應用程式。 * 語音辨識(Speech Recognition):將人類語音內容轉為可處理的資料或文字 * 自動語音辨識(Automatic Speech Recognition):以演算法自動將語音轉成文字的技術 * 語音轉文字(Speech-to-Text):把音訊訊號解碼成可讀文字的過程 * 音訊取樣率(Sample Rate):每秒擷取的樣本數決定可表達的頻率上限 * 位元深度(Bit Depth):每個樣本的解析度影響動態範圍與雜訊底 * 單聲道(Mono):單一聲道音訊更利於語音模型處理 * 立體聲(Stereo):雙聲道音訊需先混成單聲道以簡化辨識 * 音訊編碼(Audio Codec):壓縮或封裝音訊資料的演算法與格式 * 容器格式(Container Format):封裝音訊與中繼資料的檔案外層格式 * WAV 格式(WAV):無壓縮脈衝編碼音訊適合高品質轉錄 * MP3 格式(MP3):有損壓縮格式體積小但可能影響辨識細節 * 上傳端點(Upload Endpoint):接收本地檔案上傳至服務的 API 路徑 * 轉錄端點(Transcription Endpoint):建立語音轉文字作業的 API 路徑 * API 權杖(API Token):用於服務端驗證請求者身份的機密字串 * REST 介面(REST API):以 HTTP 動詞與資源導向設計的網路服務 * HTTP 標頭(HTTP Headers):在請求與回應中傳遞授權與格式等中繼資訊 * JSON 載荷(JSON Payload):以 JSON 結構承載參數與結果的訊息內容 * POST 請求(POST Request):向伺服器提交資料或建立資源的操作 * GET 請求(GET Request):向伺服器讀取資源或查詢狀態的操作 * 分塊上傳(Chunked Upload):將大檔案切成固定大小片段逐步上傳 * 讀取串流(Stream Reading):邊讀邊傳避免一次載入整個檔案至記憶體 * 輪詢(Polling):定期查詢作業狀態直至完成或失敗 * 非同步任務(Asynchronous Job):在背景執行需一段時間才完成的處理 * 回應狀態碼(HTTP Status Code):以數字表示請求結果與錯誤類型 * 作業識別碼(Job ID):用於查詢特定轉錄作業狀態的唯一代號 * Webhook 回呼(Webhook Callback):作業完成時主動通知客戶端的回傳 URL * 速率限制(Rate Limiting):限制單位時間內可發出的 API 請求數 * 指數退避(Exponential Backoff):重試時逐步拉長等待以降低壅塞 * 超時設定(Timeout):請求在逾時前等待回應的最長時間 * 重試機制(Retry Logic):在暫時性錯誤發生時自動重新嘗試請求 * 例外處理(Exception Handling):攔截並處理執行期間的錯誤狀況 * 語者分離(Speaker Diarization):將轉錄文字依不同說話者標註區分 * 語言偵測(Language Detection):自動判斷音訊所使用的語言 * 時間戳(Timestamps):標註每個字或詞在音訊中的起訖時間 * 逐字稿(Transcript):完成轉錄後的文字內容總表 * 信心分數(Confidence Score):模型對輸出文字正確性的機率估計 * 關鍵詞加權(Keyword Boosting):對特定詞彙提高辨識優先度 * 標點還原(Punctuation Restoration):自動為轉錄文字加入標點符號 * 大小寫正規化(Truecasing):為轉錄結果恢復正確大小寫 * 語音活動偵測(Voice Activity Detection, VAD):偵測語音片段以過濾靜音 * 噪音抑制(Noise Suppression):降低背景雜訊以提升辨識品質 * 自訂詞彙(Custom Vocabulary):加入專有名詞以改善辨識率 * 延遲(Latency):從送出請求到收到結果所花的時間 * 音訊分段(Audio Chunk):上傳或處理時分割的固定大小音訊片段 * 檔案輸入輸出(File I/O):讀寫本地檔案系統的操作 * 命令列參數(Command-line Arguments, CLI):從終端機傳入的程式參數 * 環境變數(Environment Variables):以系統變數存放密鑰與設定 * 設定檔(Configuration File):集中保存 API 金鑰與參數的檔案 * 絕對路徑(Absolute Path):自根目錄起的完整檔案位置標示 * 文字檔輸出(Text File Output):將轉錄結果寫入 .txt 檔以供後續使用 * 情感分析(Sentiment Analysis):分析文字或語音內容情緒傾向(正面、負面或中性)的技術。 * YouTube DL 套件(YouTube-DL Package):可用於下載 YouTube 影片或提取影音資訊的 Python 工具。 * 音訊網址(Audio URL):影片中音訊檔的直接連結,用於後續語音辨識或情感分析。 * JSON 格式(JSON Format):以鍵值對形式儲存結構化資料的輕量化資料格式。 * 字典(Dictionary):Python 中以鍵值組織資料的結構,用於儲存 YouTube DL 回傳結果。 * 播放清單(Playlist):包含多個影片項目的 YouTube 集合型內容。 * M4A 格式(M4A Format):一種常用的 MPEG-4 音訊格式,支援高音質壓縮。 * Assembly AI 語音轉文字(Assembly AI Speech-to-Text):將語音內容轉換成文字的雲端 API。 * Assembly AI 情感分析(Assembly AI Sentiment Analysis):針對轉錄文字判斷句子情緒的功能。 * 轉錄(Transcription):將語音資料轉換為文字紀錄的過程。 * 音訊智慧(Audio Intelligence):Assembly AI 提供的進階音訊分析功能集合。 * 自動摘要(Auto Summarization):從長篇內容自動提取重點的技術。 * 主題偵測(Topic Detection):分析語音內容以辨識主題類別的功能。 * 自動章節(Auto Chapters):自動分割語音或影片內容為主題段落的功能。 * API 端點(API Endpoint):API 伺服器上用於接收請求的特定路徑。 * JSON 請求體(JSON Payload):在 HTTP POST 請求中傳送的 JSON 格式資料。 * 情感分類結果(Sentiment Classification Results):每句轉錄文字的情緒判定輸出。 * 信心分數(Confidence Score):模型對情感預測準確性的信心水準。 * 正面情緒(Positive Sentiment):顯示積極或滿意情感的語句。 * 負面情緒(Negative Sentiment):顯示批評或不滿情感的語句。 * 中性情緒(Neutral Sentiment):不表現明顯情感傾向的語句。 * YouTube 影片資訊(YouTube Video Info):由 YouTube DL 取得的影片資料,如標題、格式與 URL。 * 格式清單(Formats List):影片不同解析度或音訊格式的描述集合。 * 上下文管理器(Context Manager):Python 語法結構,用於安全開啟與關閉資源。 * API 憑證(API Credentials):授權應用程式使用 API 的金鑰或認證。 * 標題正規化(Title Normalization):去除空白與特殊符號以建立安全檔名的過程。 * 檔案輸出(File Output):將分析結果寫入本機或資料夾的動作。 * JSON 輸出檔(JSON Output File):包含每句文字與情感標籤的分析結果檔案。 * 檔案縮排(JSON Indent):在 JSON 輸出中設定排版層級以便閱讀。 * Sentiment Analysis Key:Assembly AI 回傳 JSON 結果中的「sentiment_analysis_results」欄位。 * URL 參數(URL Parameter):在 API 呼叫中用於指定目標或行為的參數。 * 音訊轉錄端點(Transcribe Endpoint):Assembly AI 用於提交音訊檔進行文字轉換的 API 路徑。 * HTTP 請求(HTTP Request):與 API 溝通以傳遞或接收資料的標準通訊格式。 * 資料處理流程(Data Pipeline):從下載、轉錄到分析的自動化資料處理步驟。 * 正負面比率(Positive Ratio):正面句子數量與總情感句子數量的比值。 * 自動化分析(Automated Analysis):不需人工干預的情感與內容分析流程。 * Python 模組化(Python Modularization):將功能拆分為多個檔案(如 API.py、main.py)的結構化方法。 * 檔案目錄(Data Folder):用於儲存結果輸出與中間資料的專案資料夾。 * 主程式檢查(Main Check):`if __name__ == "__main__":` 判斷程式進入點的標準寫法。 * 例外處理(Error Handling):防止下載、轉錄或分析過程中斷的錯誤控制。 * YouTube 影片標題(YouTube Video Title):自動作為輸出檔名與分析識別用的標籤。 * 影片評論分析(Video Review Analysis):針對產品或主題評論影片的情緒總結。 * API 功能標誌(Feature Flag):用布林值開關決定是否啟用特定 API 功能。 * JSON Dump:Python 將資料結構輸出為 JSON 格式文字的函式。 * 自動語音情感分析(Automated Speech Sentiment Analysis):將語音內容自動化轉錄與情感分類的流程。 * 播客摘要(Podcast Summarization):將整段節目濃縮為重點與結論 * 章節化(Auto Chapters):自動切分音訊為主題段落並產出標題 * 節目集 ID(Episode ID):標識單一播客集數的唯一代碼 * 收聽筆記 API(Listen Notes API):查詢播客節目與音訊連結的服務介面 * 音訊網址(Audio URL):可直接串流或下載之節目音訊位置 * 轉錄(Transcription):將音訊內容轉成文字的處理流程 * 摘要生成(Text Summarization):將長文壓縮為較短且保留關鍵資訊的文本 * 關鍵句抽取(Extractive Summarization):挑選原文句子組成摘要的方法 * 精煉生成(Abstractive Summarization):以新句子概括原文語意的方法 * 主題偵測(Topic Detection):辨識段落主題以輔助章節切分 * 章節摘要(Chapter Summary):對每個章節的簡要說明 * 章節標題(Chapter Headline):概括章節主旨的短語 * 起訖時間戳(Start/End Timestamps):章節在音訊中開始與結束的毫秒位置 * 語音辨識 API(Speech Recognition API):提供語音轉文字雲端服務的介面 * AssemblyAI:提供轉錄、章節化與摘要等語音 AI 功能的雲端平台 * 請求標頭(Request Headers):HTTP 請求中攜帶授權與格式的中繼資訊 * API 金鑰(API Key):授權第三方服務存取的機密字串 * 速率限制(Rate Limit):單位時間可發送請求數的上限 * 分頁參數(Pagination):分批取得大型查詢結果的協定 * JSON 結構(JSON Schema):定義資料欄位與型別的結構描述 * POST 方法(HTTP POST):用於建立資源或傳送資料的請求動詞 * GET 方法(HTTP GET):用於讀取資源或查詢狀態的請求動詞 * 回應狀態碼(HTTP Status Code):以數字表示請求結果的標準 * 重試機制(Retry Logic):失敗時依策略再次呼叫 API 的流程 * 指數退避(Exponential Backoff):逐次增加重試等待時間的策略 * 超時控制(Timeout):請求等待回應的最長時限設定 * 端點(Endpoint):服務對外提供的特定功能 URL * 音訊串流(Audio Streaming):連線即時傳送音訊資料的方式 * 語音活動偵測(VAD):偵測語音區段以忽略靜音或噪音 * 噪音抑制(Noise Suppression):降低背景噪音提升轉錄品質 * 語言偵測(Language Detection):自動判斷音訊語言類別 * 自訂詞彙(Custom Vocabulary):加入專有名詞提升辨識準確率 * 置信度分數(Confidence Score):模型對輸出正確性的機率評估 * 內容過濾(Content Filtering):偵測並標示露骨或敏感內容 * 斷詞與標點(Tokenization & Punctuation):復原標點與正確分詞 * 文字正規化(Text Normalization):統一大小寫、數字與符號格式 * 關鍵詞加權(Keyword Boosting):對重要詞彙提高辨識與摘要權重 * 章節粒度(Chapter Granularity):章節切分的細緻程度設定 * 主旨萃取(Key Point Extraction):擷取章節或節目的核心要點 * 摘要長度控制(Summary Length Control):限制輸出字數或句數 * 前端框架(Frontend Framework):建構使用者介面的程式庫或工具 * Streamlit:以 Python 快速建立互動式網頁介面的框架 * 側邊欄(Sidebar):放置表單輸入與操作按鈕的側邊 UI 區域 * 展開面板(Expander):可收合內容區塊以節省版面 * 圖片元件(Image Widget):在頁面上顯示節目縮圖的 UI 元件 * 命令列參數(CLI Arguments):從終端機傳入腳本的參數值 * 設定檔管理(Config Management):集中保存金鑰與環境設定 * 環境變數(Environment Variables):以系統層級保存機密與參數 * 序列化與反序列化(Serialization/Deserialization):物件與 JSON 之間的轉換 * 日誌記錄(Logging):於執行期間記錄事件與錯誤以便除錯 * 例外處理(Exception Handling):攔截與處理執行錯誤確保程式穩定 * 即時語音辨識(Real-Time Speech Recognition):在使用者說話時即時轉換語音為文字的技術。 * 組合式人工智慧即時 API(Assembly AI Real-Time API):透過 WebSocket 提供即時語音辨識服務的 API。 * WebSocket:用於在客戶端與伺服器之間建立雙向持續連線的通訊協定。 * AsyncIO:Python 的非同步 I/O 標準庫,用於同時執行多個協程以提高效能。 * 協程(Coroutine):可暫停與恢復執行的輕量級非同步函數。 * PiAudio:用於錄製與播放音訊的 Python 函式庫,封裝 PortAudio。 * PortAudio:跨平台音訊輸入輸出的底層函式庫。 * Base64 編碼(Base64 Encoding):將二進位音訊資料轉換為文字格式以便於傳輸。 * JSON 格式(JSON Format):以鍵值結構傳輸資料的標準格式。 * WebSocket URL:指定即時 API 的連線端點與參數(如取樣率)。 * 音訊取樣率(Sample Rate):每秒擷取的音訊樣本數,影響音質與延遲。 * 非同步上下文管理器(Async Context Manager):在非同步程式中安全開啟與關閉連線的控制結構。 * Ping Interval:WebSocket 保持連線的心跳時間間隔。 * Ping Timeout:當伺服器未回應時自動中斷的等待時間。 * 授權標頭(Authorization Header):傳送 API 金鑰以驗證請求的 HTTP 標頭。 * 聲音串流(Audio Stream):從麥克風連續讀取音訊資料的資料流。 * Overflow(緩衝區溢出):當音訊處理速度低於輸入速度時導致的資料丟失情況。 * Base64 編碼後傳輸(Base64 Transmission):API 要求以文字形式傳送音訊資料時使用的編碼方式。 * 音訊 JSON 封包(Audio JSON Packet):包含音訊資料的 JSON 格式訊息,鍵名通常為 "audio_data"。 * 結束碼(Exit Code):表示連線中止原因或錯誤狀態的代碼。 * 結果接收函式(Receive Function):負責接收並解析 API 回傳轉錄結果的非同步函式。 * 最終轉錄(Final Transcript):API 確認完整句子的最終辨識結果。 * 臨時轉錄(Partial Transcript):在說話過程中即時更新的暫時辨識文字。 * 提示文字(Prompt):用於傳遞給語言模型的輸入句子。 * 虛擬助理(Virtual Assistant):能即時聽懂語音並生成回答的互動系統。 * OpenAI API:提供 GPT-3 等模型的自然語言生成與理解能力的雲端介面。 * GPT-3 模型(Generative Pre-trained Transformer 3):OpenAI 的自然語言生成模型。 * 問答引擎(Q&A Engine):根據使用者輸入回覆文字答案的模型模式。 * API 金鑰(API Key):授權應用程式呼叫雲端 API 的密鑰。 * OpenAI Python 套件(OpenAI Python Package):操作 OpenAI API 的官方 Python 函式庫。 * 完成端點(Completion Endpoint):OpenAI API 用於生成文字的主要端點。 * Max Tokens:控制模型回覆長度的參數,限制生成文字的字數。 * 響應字典(Response Dictionary):API 回傳的 JSON 資料結構,在 Python 中為字典。 * Choices 鍵(Choices Key):包含一個或多個模型回覆選項的 JSON 鍵。 * Text 鍵(Text Key):模型生成文字內容的實際欄位。 * 啟動主程式(Main Execution Block):`if __name__ == "__main__":` 判斷 Python 執行起點的語句。 * 問答助手函式(Ask Computer Function):封裝向 GPT-3 傳送提示並回傳答案的自定義函式。 * 結合模組(Module Integration):將語音辨識、WebSocket、與 GPT-3 功能整合的過程。 * 聲控聊天機器人(Voice-Activated Chatbot):能即時聽取語音、辨識文字並生成回覆的應用。 * 事件循環(Event Loop):AsyncIO 負責排程與執行協程的核心機制。 * 例外捕捉(Exception Handling):防止連線錯誤或中斷導致程式崩潰的機制。 * 音訊封包頻率(Audio Packet Rate):決定每秒傳送幾次音訊資料的速率。 * 即時互動(Real-Time Interaction):系統與使用者在毫秒級內回應的操作模式。 * 語音驅動介面(Voice Interface):使用語音作為主要互動方式的應用介面。 * 非同步執行(Asynchronous Execution):允許多個任務同時進行而不阻塞主程式的設計。 * 虛擬助理回覆(Assistant Response):由語言模型生成並回傳給使用者的回答內容。 * 程式模組化(Program Modularization):將錄音、傳輸與對話邏輯分離以提高可維護性。