【多媒體 AI 工具實戰】#01 用 Qwen3-ASR 把語音變成文字:Vibe Coder 必知

測驗:用 Qwen3-ASR 把語音變成文字

共 5 題,點選答案後會立即顯示結果

1. Qwen3-ASR 這類 ASR 模型的主要功能是什麼?

  • A. 把文字轉成語音朗讀
  • B. 把語音音檔轉成文字(逐字稿)
  • C. 把音樂分離成不同樂器
  • D. 把影片翻譯成不同語言的配音

2. 根據文章,如果你「不想管 GPU、只想快速轉幾個檔」,比較適合哪種用法?

  • A. 呼叫雲端 DashScope API
  • B. 用本地 transformers 下載模型跑
  • C. 自己訓練一個新模型
  • D. 手動聽打逐字稿

3. 大多數 ASR 模型(含 Qwen3-ASR)對音訊的取樣率要求通常是多少?

  • A. 44.1kHz
  • B. 8kHz
  • C. 16kHz
  • D. 沒有任何要求

4. 這行程式的目的是什麼?

dashscope.api_key = os.environ[“DASHSCOPE_API_KEY”]
  • A. 產生一組新的 API 金鑰
  • B. 從環境變數讀取金鑰,避免寫死在程式裡
  • C. 把金鑰儲存到資料庫
  • D. 驗證金鑰是否過期

5. 文章建議處理一小時的 podcast 長音檔時,正確的做法是?

  • A. 整個檔案一次塞進模型,越大越好
  • B. 只辨識前 5 分鐘就好
  • C. 先切成一段一段(如 30 秒)分批辨識,再把結果拼回去
  • D. 提高取樣率到 44.1kHz 就能一次處理完

【多媒體 AI 工具實戰】系列 #01(共 3 篇)|難度:L2-進階

你請 AI 幫你寫了一段「把錄音檔轉成逐字稿」的程式,它丟給你二十行 Python,跑起來好像有輸出。 問題是:這段到底在幹嘛?輸出對不對?哪裡可能悄悄壞掉但你不知道?

這篇的目標不是教你從零寫語音辨識,而是教你看懂 AI 交出來的 Qwen3-ASR 程式、實際跑一次、抓出常見的坑


一句話說明

Qwen3-ASR 是阿里通義 Qwen 系列的語音辨識模型:丟一段音檔進去,吐出一段文字。

ASR = Automatic Speech Recognition(自動語音辨識),也就是俗稱的「語音轉文字」「逐字稿」。 Qwen3-ASR 的特點是多語言(中英日韓等)、對中文和中英混講的辨識品質好, 而且有兩種用法:呼叫雲端 API(DashScope),或把模型下載到本地用 transformers 跑。

你可能聽過的 它是什麼
Whisper(OpenAI) 最有名的開源 ASR,Qwen3-ASR 是同類競品
DashScope 阿里雲的模型 API 平台,Qwen3-ASR 走這個叫雲端
transformers Hugging Face 的套件,把模型下載到自己機器跑

怎麼選:只是想快速轉幾個檔、不想管 GPU → 用 DashScope API。 資料不能外流、要大量處理 → 本地 transformers(但需要 GPU)。


最小範例(雲端 API 版)

這是 AI 最常交給你的樣子——呼叫 DashScope 雲端 API,不需要自己的 GPU:

# 安裝 SDK
uv add dashscope
Code language: PHP (php)
import os
import dashscope

# 從環境變數讀金鑰(不要寫死在程式裡!)
dashscope.api_key = os.environ["DASHSCOPE_API_KEY"]

response = dashscope.MultiModalConversation.call(
    model="qwen3-asr-flash",
    messages=[{
        "role": "user",
        "content": [{"audio": "meeting.wav"}],
    }],
)

# 印出辨識出來的文字
print(response.output.choices[0].message.content)
Code language: PHP (php)

跑完你應該看到 meeting.wav 裡講的話,變成一段文字印在畫面上。


逐行翻譯

import os
import dashscope                                    # 阿里雲的官方 SDK

dashscope.api_key = os.environ["DASHSCOPE_API_KEY"]  # 從環境變數拿金鑰(值放 .env,不進 git)

response = dashscope.MultiModalConversation.call(    # 送出一次辨識請求,等雲端回覆
    model="qwen3-asr-flash",                         # 指定用哪個模型(flash = 快速版)
    messages=[{                                       # 對話格式:告訴模型「這是使用者給的內容」
        "role": "user",
        "content": [{"audio": "meeting.wav"}],       # 內容是一個音檔
    }],
)

print(response.output.choices[0].message.content)   # 從回傳結構裡把文字挖出來印
Code language: PHP (php)

看到 response.output.choices[0].message.content 這一長串不用怕, 它就是照著回傳的資料結構一層一層往裡挖,最後那層 content 才是你要的逐字稿文字。

看不懂 choices[0] 為什麼是 [0]?把整個 response 貼給 AI 問:
「這個回傳物件的結構長怎樣?幫我畫出來,並標出逐字稿文字在哪一層」


常見變化

AI 可能會用不同寫法,認得出來就好:

變化 1:本地 transformers 版(不呼叫雲端)

from transformers import pipeline

asr = pipeline("automatic-speech-recognition", model="Qwen/Qwen3-ASR-Flash")
result = asr("meeting.wav")
print(result["text"])   # 文字在 result["text"]
Code language: PHP (php)

翻譯:把模型下載到自己機器上跑。pipeline(...) 是「幫我把載入模型、前處理、辨識全包好」的懶人入口。 好處是資料不出門,代價是要下載幾 GB 模型、通常要 GPU 才跑得動。

變化 2:指定語言 / 開時間戳

result = asr(
    "meeting.wav",
    generate_kwargs={"language": "zh"},   # 明講是中文,避免它猜錯語言
    return_timestamps=True,                # 順便回傳每段話的時間戳
)
Code language: PHP (php)

翻譯language="zh" 是「告訴它這段是中文」;return_timestamps=True 讓輸出帶上「第幾秒到第幾秒講了什麼」,做字幕時很有用。

變化 3:長音檔先切段再逐段辨識

chunks = split_audio("podcast.mp3", chunk_seconds=30)  # 先切成一段一段
texts = [asr(c)["text"] for c in chunks]               # 每段各自辨識
full_text = " ".join(texts)                            # 再拼回完整逐字稿
Code language: PHP (php)

翻譯:一小時的 podcast 不能整個塞進去(會爆記憶體或超時),所以先切成 30 秒一段分批處理,最後拼起來。


實務要點:AI 沒說但你要知道的

這些是 Qwen3-ASR(以及所有 ASR)最容易踩的四個坑:

要點 白話 為什麼重要
取樣率 16kHz 模型吃的是 16000Hz 的音訊 你的檔如果是 44.1kHz(一般音樂),格式對不上時結果會怪或報錯,通常要先轉成 16kHz
音檔格式 常見支援 wav / mp3 手機錄的 .m4a.amr 可能要先轉檔(用 ffmpeg)
長音檔切段 超過幾分鐘就要切 不切會超時、爆記憶體,或只辨識到前面一小段
標點與時間戳 原始輸出可能沒標點 要不要句號、逗號、時間戳,取決於參數與後處理,別預設它自動有

轉檔的標準做法(AI 通常會用 ffmpeg):

# 把任意音檔轉成 16kHz 單聲道 wav
ffmpeg -i input.m4a -ar 16000 -ac 1 output.wav
Code language: CSS (css)

-ar 16000 = 取樣率設 16kHz;-ac 1 = 轉成單聲道。這兩個是 ASR 最常要求的規格。


🚩 紅旗:看到這些要警覺

1. 金鑰寫死在程式裡

dashscope.api_key = "sk-abc123..."   # 🚩 金鑰直接寫在程式裡
Code language: PHP (php)

為什麼危險:這段一進 git 或貼給別人,金鑰就永久外洩了,別人可以拿去消耗你的額度。

跟 AI 這樣說:「把 API 金鑰改成從環境變數讀,並建立 .env.example 列出需要哪些變數」

2. 沒管取樣率就直接送

result = asr("recording_44khz.mp3")   # 🚩 沒確認取樣率就送進去
Code language: PHP (php)

為什麼危險:取樣率不符時,辨識結果可能整段錯亂、缺字,但程式不會報錯——你會拿到一份看起來完整、其實錯很多的逐字稿。

跟 AI 這樣說:「在辨識前先確認音檔是 16kHz 單聲道,不是的話用 ffmpeg 先轉檔」

3. 長音檔沒切段

text = asr("two_hour_meeting.mp3")["text"]   # 🚩 兩小時檔案整個塞進去
Code language: PHP (php)

為什麼危險:可能超時、記憶體爆掉,或只辨識到前面幾分鐘就默默停了,你以為轉完了其實只有開頭。

跟 AI 這樣說:「這是長音檔,請先切成 30 秒左右一段分批辨識,再把結果拼回去」

4. 網路請求沒有 timeout / 錯誤被吞掉

try:
    response = dashscope.MultiModalConversation.call(...)
except Exception:
    pass   # 🚩 API 失敗了也悄悄跳過,你不會知道
Code language: PHP (php)

為什麼危險:雲端 API 可能因為網路、額度、檔案太大而失敗。錯誤被吞掉的話,你會拿到空白或不完整的結果卻以為成功。

跟 AI 這樣說:「不要吞例外,失敗時要記 log 或把錯誤拋出來,讓我知道哪個檔失敗了」


Vibe Coder 驗收檢查點

拿到 AI 的程式後,實際跑一次比讀十遍都有用:

  • [ ] 準備一段測試音檔:找一段你知道內容的短音檔(10-30 秒),最好中英文都有,方便比對
  • [ ] 確認金鑰不在程式裡:搜尋程式碼有沒有 api_key = "sk-...,有就退回改成讀環境變數
  • [ ] 設好環境變數再跑export DASHSCOPE_API_KEY=你的金鑰,然後跑程式
  • [ ] 比對輸出:印出來的文字跟你知道的內容對不對?有沒有缺字、亂碼、語言錯(中文變拼音)
  • [ ] 確認編碼正常:中文有沒有變成 中文 或問號亂碼(正常應該直接顯示中文字)
  • [ ] 試一個長檔:拿一個 5 分鐘以上的檔跑,看它是完整轉完還是只轉了前面一小段
  • [ ] 問 AI 有沒有漏處理:把程式貼給 AI 問「這段有沒有沒處理的錯誤情況?長音檔和取樣率有考慮嗎?」

看不懂就這樣問 AI

「用白話一段一段解釋這段 Qwen3-ASR 的程式在幹嘛,我是初學者,特別說明音檔是怎麼送進去、文字是從哪裡拿出來的」

「這段程式有沒有處理:取樣率不符、長音檔、API 失敗這三種情況?如果沒有,幫我補上」

「幫我加一段:辨識前先用 ffmpeg 把音檔轉成 16kHz 單聲道 wav,並在轉檔失敗時給清楚的錯誤訊息」


小結

  • Qwen3-ASR = 語音轉文字,可走雲端 DashScope API(快、免 GPU)或本地 transformers(資料不外流、要 GPU)
  • 看懂最小範例的關鍵:音檔怎麼送進去文字從回傳的哪一層挖出來
  • 四大實務坑:取樣率 16kHz格式轉檔長音檔切段標點/時間戳後處理
  • 最重要的驗收動作:準備一段你知道內容的音檔,實際跑一次、逐字比對

下一篇我們會接著看怎麼把辨識出來的逐字稿再加工利用。

進階測驗:用 Qwen3-ASR 把語音變成文字

測驗目標:驗證你是否能在實際情境中應用所學。
共 5 題,包含情境題與錯誤診斷題。

1. 手機錄的訪談檔轉逐字稿 情境題

你有一個手機錄的 interview.m4a,取樣率 44.1kHz。 你想用 Qwen3-ASR 轉逐字稿,最穩妥的第一步是什麼?
  • A. 直接把 .m4a 丟進模型,交給它自己處理
  • B. 先用 ffmpeg 轉成 16kHz 單聲道 wav 再送辨識
  • C. 把取樣率提高到 96kHz 讓品質更好
  • D. 先把檔案改副檔名成 .wav 就好

2. 中英混講會議的參數設定 情境題

你要辨識一段中英夾雜的會議錄音,並且之後要拿來做字幕 (需要知道每句話出現在第幾秒)。下列哪個做法最合適?
  • A. 什麼參數都不設,預設就會回時間戳
  • B. 設 language=”en”,因為有英文
  • C. 開啟 return_timestamps=True 取得時間戳,並注意標點/時間戳是否需要後處理
  • D. 先把英文段落刪掉只留中文再辨識

3. 逐字稿只有開頭一段 情境題

你把一個兩小時的 podcast.mp3 丟給 AI 寫的辨識程式, 跑完沒報錯,但輸出的逐字稿只有節目開頭幾分鐘的內容。 最可能的原因與對策是?
  • A. 長音檔未切段,應先切成小段分批辨識再拼回
  • B. 金鑰過期,換一組金鑰即可
  • C. 模型不支援中文,換成英文模型
  • D. 取樣率太高,降到 8kHz 就會轉完整

4. 這段程式的問題在哪? 錯誤診斷

import dashscope dashscope.api_key = “sk-abc123def456…” response = dashscope.MultiModalConversation.call( model=”qwen3-asr-flash”, messages=[{“role”: “user”, “content”: [{“audio”: “a.wav”}]}], )
  • A. model 名稱一定拼錯了
  • B. messages 格式不對,audio 不能放在 content 裡
  • C. 金鑰寫死在程式裡,一進 git 就會外洩,應改成從環境變數讀
  • D. 沒有問題,可以直接上線

5. 這段錯誤處理有什麼隱患? 錯誤診斷

try: response = dashscope.MultiModalConversation.call(…) text = response.output.choices[0].message.content except Exception: pass # 之後把 text 存進逐字稿檔
  • A. 沒問題,try/except 是好習慣
  • B. 例外被 pass 吞掉,API 失敗時你不會知道,逐字稿可能空白或不完整卻以為成功
  • C. 應該用 finally 而不是 except
  • D. 問題是 choices[0] 索引一定會越界

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *