從零開始理解百度語音識別API的Python實現

大家好!今天我要給大家詳細講解一個使用百度語音識別API的Python代碼。這個代碼可以將音頻文件轉換成文字,非常適合做語音轉文字的應用。我會從最基礎的概念開始講起,確保沒有任何編程基礎的朋友也能理解。

翻譯

一、代碼概覽

這段代碼主要實現了以下幾個功能:

  1. 連接百度語音識別API

  2. 檢查音頻文件是否符合要求

  3. 將音頻文件發送到百度服務器進行識別

  4. 返回識別結果

整個代碼大約150行,包含了一個主類BaiduASR和幾個輔助函數。下面我會逐部分詳細解釋。

二、準備工作:導入必要的庫

代碼開頭部分導入了多個Python庫:

import os
import time
import json
import wave
import base64
import requests
from config import BAIDU_APP_ID, BAIDU_API_KEY, BAIDU_SECRET_KEY, BAIDU_TOKEN_URL, BAIDU_ASR_URL

讓我們一個個來看這些庫的作用:

  1. os:用于操作系統相關的功能,比如處理文件路徑

  2. time:處理時間相關操作

  3. json:處理JSON格式的數據(JSON是一種常用的數據交換格式)

  4. wave:專門處理WAV格式的音頻文件

  5. base64:將二進制數據編碼為ASCII字符(因為網絡傳輸需要文本格式)

  6. requests:發送HTTP請求到百度服務器

  7. config:從自定義配置文件導入百度API的認證信息

三、BaiduASR類詳解

整個代碼的核心是BaiduASR類,它封裝了所有與百度語音識別相關的功能。

1. 初始化方法?init:

def __init__(self):self.app_id = BAIDU_APP_IDself.api_key = BAIDU_API_KEYself.secret_key = BAIDU_SECRET_KEYself.token_url = BAIDU_TOKEN_URLself.asr_url = BAIDU_ASR_URLself.access_token = Noneself.token_expires_time = 0

這里設置了百度API所需的各種參數:

  • app_id:應用ID

  • api_key:API密鑰

  • secret_key:密鑰

  • token_url:獲取訪問令牌的URL

  • asr_url:語音識別的API地址

  • access_token:訪問令牌(初始為None)

  • token_expires_time:令牌過期時間(初始為0)

這些參數中,前五個都是從config.py文件中導入的,這樣做的好處是可以保護敏感信息,避免直接寫在代碼中。

2. 獲取訪問令牌 get_access_token

def get_access_token(self):"""獲取百度API訪問令牌"""current_time = time.time()# 如果token未過期,直接返回if self.access_token and current_time < self.token_expires_time:return self.access_token# 獲取新的access_tokenparams = {'grant_type': 'client_credentials','client_id': self.api_key,'client_secret': self.secret_key}try:response = requests.post(self.token_url, params=params, timeout=10)result = response.json()if 'access_token' in result:self.access_token = result['access_token']# token有效期一般為30天,這里設置為29天后過期self.token_expires_time = current_time + result.get('expires_in', 2592000) - 86400return self.access_tokenelse:return Noneexcept Exception as e:return None

這部分代碼負責獲取訪問百度API所需的令牌(token)。百度API使用OAuth2.0認證,需要先獲取token才能使用其他服務。

這部分代碼負責獲取訪問百度API所需的令牌(token)。百度API使用OAuth2.0認證,需要先獲取token才能使用其他服務。

詳細解釋:

  1. 首先檢查當前是否有有效的token(未過期),如果有就直接返回

  2. 如果沒有有效token,就準備請求參數:

    • grant_type:固定為'client_credentials'

    • client_id:API Key

    • client_secret:Secret Key

  3. 使用requests庫發送POST請求到token_url

  4. 解析返回的JSON數據

  5. 如果獲取成功,保存token并設置過期時間(提前1天過期,避免臨界點問題)

  6. 返回token或None(失敗時)

3. 驗證音頻文件 validate_audio

def validate_audio(self, file_path):"""驗證音頻文件格式"""try:with wave.open(file_path, 'rb') as wf:nchannels = wf.getnchannels()sampwidth = wf.getsampwidth()framerate = wf.getframerate()nframes = wf.getnframes()valid = Trueif nchannels != 1:valid = Falseif sampwidth != 2:valid = False# 百度API只支持特定采樣率supported_rates = [8000, 16000]if framerate not in supported_rates:valid = Falseduration = nframes / float(framerate)if duration < 0.3:valid = Falseelif duration > 60:valid = Falseif valid:return True, framerate, durationreturn False, None, Noneexcept Exception as e:return False, None, None

這個方法檢查音頻文件是否符合百度API的要求:

  1. 使用wave模塊打開WAV文件

  2. 獲取音頻參數:

    • nchannels:聲道數(百度要求單聲道)

    • sampwidth:采樣寬度(百度要求16bit,即2字節)

    • framerate:采樣率(百度支持8000或16000Hz)

    • nframes:總幀數

  3. 檢查音頻時長是否在0.3-60秒之間

  4. 返回檢查結果、采樣率和時長

4. 語音識別主函數 recognize_audio

這是最核心的方法,負責實際的語音識別工作:

def recognize_audio(self, file_path):"""語音識別主函數"""# 驗證音頻格式is_valid, sample_rate, duration = self.validate_audio(file_path)if not is_valid:return "音頻格式不符合要求~"# 獲取access_tokenaccess_token = self.get_access_token()if not access_token:return "獲取訪問令牌失敗,請檢查API密鑰~"

首先驗證音頻文件并獲取token,這兩步是前置條件檢查。

接下來是處理音頻數據:

    # 讀取音頻文件并編碼try:with open(file_path, 'rb') as f:audio_data = f.read()# base64編碼audio_base64 = base64.b64encode(audio_data).decode('utf-8')# 確定音頻格式file_ext = os.path.splitext(file_path)[1].lower()if file_ext == '.wav':format_type = 'wav'elif file_ext == '.pcm':format_type = 'pcm'elif file_ext == '.amr':format_type = 'amr'elif file_ext == '.m4a':format_type = 'm4a'else:format_type = 'wav'  # 默認wav格式

這部分代碼:

  1. 讀取音頻文件的二進制數據

  2. 使用base64編碼(因為HTTP傳輸需要文本數據)

  3. 根據文件擴展名確定格式類型

然后是準備請求參數:

        # 修復:確保采樣率為整數,并根據百度API要求進行規范化if sample_rate == 16000:api_rate = 16000elif sample_rate == 8000:api_rate = 8000else:# 如果采樣率不是標準值,使用最接近的標準值api_rate = 16000 if sample_rate > 12000 else 8000# 構建請求數據 - 注意:百度ASR使用POST請求,參數放在body中data = {'format': format_type,'rate': api_rate,  # 確保使用標準采樣率'channel': 1,'speech': audio_base64,'len': len(audio_data),'cuid': 'python_client_v3',  # 修改cuid'token': access_token,'dev_pid':80001  # 改為普通話(純中文識別),如果還有問題可以嘗試15372}

這里構建了發送給百度API的請求數據,包括:

  • 音頻格式

  • 采樣率

  • 聲道數(固定為1)

  • base64編碼的音頻數據

  • 音頻數據長度

  • 客戶端ID

  • 訪問令牌

  • 語言模型ID(80001表示普通話純中文識別)

接下來發送請求并處理響應

        # 設置請求頭headers = {'Content-Type': 'application/json; charset=utf-8'}# 發送識別請求 - 注意:所有參數都在body中,不使用URL參數response = requests.post(self.asr_url,data=json.dumps(data),headers=headers,timeout=30)# 打印響應狀態碼和內容,用于調試result = response.json()# 處理識別結果if result.get('err_no') == 0:# 識別成功if 'result' in result and result['result']:recognized_text = ''.join(result['result'])print(f"{recognized_text}")return recognized_textelse:return "識別不到內容~"else:# 識別失敗error_msg = result.get('err_msg', '未知錯誤')# 提供更詳細的錯誤信息if result.get('err_no') == 3311:return f"采樣率參數錯誤~ 請確保音頻采樣率為8000Hz或16000Hz"elif result.get('err_no') == 3300:return f"輸入參數不正確~ 請檢查音頻格式"elif result.get('err_no') == 3301:return f"音頻質量問題~ 請檢查音頻文件是否損壞"else:return f"識別失敗~ 錯誤信息: {error_msg}"

這部分代碼:

  1. 設置HTTP請求頭,指定內容類型為JSON

  2. 發送POST請求到百度語音識別API

  3. 解析返回的JSON數據

  4. 根據返回的錯誤碼處理不同情況:

    • 成功時返回識別結果

    • 失敗時返回相應的錯誤信息

    • 異常處理

          except FileNotFoundError:return "找不到音頻文件喵~"except requests.exceptions.RequestException as e:return "網絡請求失敗喵~"except Exception as e:return "識別過程發生異常喵~"
      

      捕獲了三種可能的異常:

    • 文件不存在

    • 網絡請求失敗

    • 其他未知異常

四、單例模式實現

代碼后面部分實現了單例模式,確保整個應用中只有一個BaiduASR實例:

# 全局ASR實例
_asr_instance = Nonedef get_asr_instance():"""獲取ASR實例(單例模式)"""global _asr_instanceif _asr_instance is None:_asr_instance = BaiduASR()return _asr_instance

單例模式是一種設計模式,確保一個類只有一個實例,并提供一個全局訪問點。這樣做的好處是:

  1. 避免重復創建對象

  2. 節省系統資源

  3. 保持全局一致性

五、對外接口函數

為了方便使用,代碼提供了兩個簡單的對外函數:

def validate_audio(file_path):"""驗證音頻文件格式(保持原有函數名)"""asr = get_asr_instance()is_valid, _, _ = asr.validate_audio(file_path)return is_validdef recognize_audio(file_path):"""語音識別函數(保持原有函數名和功能)"""asr = get_asr_instance()return asr.recognize_audio(file_path)

這樣外部代碼只需要調用這兩個函數即可,不需要關心內部的復雜實現。

六、本地調試入口

最后是一個簡單的測試代碼:

# 本地調試入口
if __name__ == "__main__":file_path = "../input.wav"recognize_audio(file_path)

當直接運行這個Python文件時(而不是被導入為模塊),會嘗試識別"../input.wav"文件。

七、總結

這個百度語音識別的Python實現包含了以下幾個關鍵點:

  1. 認證機制:使用OAuth2.0獲取訪問令牌

  2. 音頻驗證:確保音頻格式符合API要求

  3. 數據編碼:使用base64編碼二進制音頻數據

  4. API請求:構建正確的HTTP請求并處理響應

  5. 錯誤處理:全面考慮各種可能的錯誤情況

  6. 設計模式:使用單例模式管理實例

通過這樣的封裝,外部代碼可以非常簡單地進行語音識別,而不用關心內部復雜的實現細節。

希望這篇詳細的解釋能幫助你理解這段代碼的工作原理!如果有任何不明白的地方,歡迎留言討論。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86296.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86296.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86296.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

中小企業適用的幾種會議簽到工具

對企業行政來說&#xff0c;會議簽到是件小事&#xff0c;但處理不好&#xff0c;會直接拖慢會議流程、影響管理效率、降低參會體驗。尤其是面對人數多、時間緊、場地臨時變動等情況&#xff0c;靠傳統紙筆或簡單Excel管理&#xff0c;往往應對乏力。 實際上&#xff0c;簽到看…

android 11.0 打開ALOGV ALOGI ALOGD日志輸出的方法

1.前言 在11.0的系統rom定制化開發中,在某些時候,需要打印ALOGV,ALOGI等TAG日志,在系統中,默認是關閉這些日志的, 防止日志打印過多,系統過于卡頓,但是有時候會為了調試,需要打開日志開關,所以就需要在系統源碼中查看哪里 需要打開日志的開關,來實現日志的打印解決…

語言大模型or時序大模型?原理、應用與未來發展

引言 隨著人工智能技術的飛速發展&#xff0c;大規模預訓練模型已成為當前研究的熱點。其中&#xff0c;語言模型和時序大模型作為兩類重要的模型架構&#xff0c;分別在自然語言處理和時間序列分析領域展現出卓越的性能。然而&#xff0c;這兩類模型在基本原理和應用場景上存…

【Excel數據分析】花垣縣事業單位出成績了,用Excel自帶的M語言做一個數據分析

這里寫自定義目錄標題 花垣縣事業單位出成績了&#xff0c;用Excel自帶的M語言做一個數據分析需求 花垣縣事業單位出成績了&#xff0c;用Excel自帶的M語言做一個數據分析 Power Query M 語言&#xff0c;簡稱 M 語言&#xff0c;全名叫 Power Query Formula Language。 需求…

微處理器原理與應用篇---音頻采集與串口傳輸功能的系統設計

這段內容是基于 STM32F407VGT6 單片機&#xff0c;實現音頻采集與串口傳輸功能的嵌入式系統設計方案&#xff0c;包含硬件架構、軟件邏輯和代碼實現&#xff0c;核心是通過 ADC 采集音頻、串口收發指令與數據 &#xff0c;以下分模塊拆解&#xff1a; 一、系統設計概述 硬件&…

【大模型學習 | 量化】pytorch量化基礎知識(1)

pytorch量化 [!note] 官方定義&#xff1a;performing computations and storing tensors at lower bitwidths than floating point precision.支持INT8量化&#xff0c;可以降低4倍的模型大小以及顯存需求&#xff0c;加速2-4倍的推理速度通俗理解&#xff1a;降低權重和激活值…

ES和 Kafka 集群搭建過程中的典型問題、配置規范及最佳實踐

Kafka 集群搭建與配置經驗庫文檔&#xff08;完整會話匯總&#xff09; 一、會話問題分類與解決方案 1. Elasticsearch 映射解析錯誤 問題現象&#xff1a; {"error":{"root_cause":[{"type":"mapper_parsing_exception","re…

Linux-信號量

目錄 POSIX信號量 信號量的原理 信號量的概念 申請信號量失敗被掛起等待 信號量函數 二元信號量模擬實現互斥功能 基于環形隊列的生產消費模型 下面環形隊列采用數組模擬&#xff0c;用模運算來模擬環狀特性&#xff0c;類似如此 空間資源和數據資源 生產者和消費者申請…

Unity2D 街機風太空射擊游戲 學習記錄 #14 環射和散射組合 循環屏幕道具

概述 這是一款基于Unity引擎開發的2D街機風太空射擊游戲&#xff0c;筆者并不是游戲開發人&#xff0c;作者是siki學院的涼鞋老師。 筆者只是學習項目&#xff0c;記錄學習&#xff0c;同時也想幫助他人更好的學習這個項目 作者會記錄學習這一期用到的知識&#xff0c;和一些…

vue3 定時刷新

在Vue 3中實現定時刷新&#xff0c;你可以使用多種方法。這里列舉幾種常見的方法&#xff1a; 方法1&#xff1a;使用setInterval 這是最直接的方法&#xff0c;你可以在組件的mounted鉤子中使用setInterval來定時執行某些操作&#xff0c;例如重新獲取數據。 <template&…

局域網環境下瀏覽器安全限制的實用方法

在現代 Web 開發和網絡應用中&#xff0c;我們常常會遇到瀏覽器出于安全考慮對某些功能進行限制的情況。例如麥克風、攝像頭、地理位置等敏感功能&#xff0c;通常只能在 HTTPS 協議或 localhost 下使用。然而在局域網開發、測試或特定應用場景中&#xff0c;我們可能需要突破這…

如果你在為理解RDA、PCA 和 PCoA而煩惱,不妨來看看丨TomatoSCI分析日記

當你學習了 RDA、PCA 和 PCoA 這三種常見排序方法后&#xff0c;腦子里是不是也冒出過類似的疑問&#xff1a; PCA、PCoA、RDA 不都能畫圖嗎&#xff1f;是不是可以互相替代&#xff1f; RDA 圖上也有樣本點&#xff0c;那我還需要 PCoA 干什么&#xff1f; ... 這些看似“…

MySQL (二):范式設計

在 MySQL 數據庫設計中&#xff0c;范式設計是構建高效、穩定數據庫的關鍵環節。合理的范式設計能夠減少數據冗余、消除操作異常&#xff0c;讓數據組織更加規范和諧。然而&#xff0c;過度追求范式也可能帶來多表聯合查詢效率降低的問題。本文將深入講解第一范式&#xff08;1…

什么是財務共享中心?一文講清財務共享建設方案

目錄 一、財務共享中心是什么 1.標準化流程 2.集中化處理 3.智能化系統 4.專業化分工 二、財務共享中心的四大模塊 1. 共享系統 2. 共享流程 3. 共享組織 4. 共享數據 三、為什么很多財務共享中心做不下去&#xff1f; 1.只搬人&#xff0c;不換流程 2.系統買了&a…

001 雙指針

雙指針 雙指針&#xff08;Two Pointers&#xff09; 雙指針&#xff08;Two Pointers&#xff09; 對撞指針&#xff08;Opposite Direction Two Pointers&#xff09;&#xff1a; 對撞指針從兩端向中間移動&#xff0c;一個指針從最左端開始&#xff0c;另一個最右端開始&a…

【unitrix】 4.7 庫數字取反(not.rs)

一、源碼 這段代碼是用Rust語言實現的一個庫&#xff0c;主要功能是對數字進行位取反操作&#xff08;按位NOT運算&#xff09;。 /*庫數字取反* 編制人: $ource* 修改版次:0版完成版* 本版次創建時間: 2025年6月25日* 最后修改時間: 無* 待完善問題&#xff1a;無*/ use cor…

在ASP.NET Core WebApi中使用日志系統(Serilog)

一.引言 日志是構建健壯 Web API 的重要組成部分&#xff0c;能夠幫助我們追蹤請求、診斷問題、記錄關鍵事件。在 .Net 中&#xff0c;日志系統由內置的 Microsoft.Extensions.Logging 抽象提供統一接口&#xff0c;并支持多種第三方日志框架&#xff08;如 Serilog、NLog 等&…

(鏈表:哈希表 + 雙向鏈表)146.LRU 緩存

題目 請你設計并實現一個滿足 LRU (最近最少使用) 緩存 約束的數據結構。 LRU是Least Recently Used的縮寫&#xff0c;即最近最少使用&#xff0c;是一種常用的頁面置換算法&#xff0c;選擇最近最久未使用的頁面予以淘汰。該算法賦予每個頁面一個訪問字段&#xff0c;用來記…

Go Web開發框架實踐:模板渲染與靜態資源服務

Gin 不僅適合構建 API 服務&#xff0c;也支持 HTML 模板渲染和靜態資源托管&#xff0c;使其可以勝任中小型網站開發任務。 一、模板渲染基礎 1. 加載模板文件 使用 LoadHTMLGlob 或 LoadHTMLFiles 方法加載模板&#xff1a; r : gin.Default() r.LoadHTMLGlob("templ…

緩存與加速技術實踐-Kafka消息隊列

目錄 #1.1消息隊列 1.1.1什么是消息隊列 1.1.2消息隊列的特征 1.1.3為什么需要消息隊列 #2.1ksfka基礎與入門 2.1.1kafka基本概念 2.1.2kafka相關術語 2.1.3kafka拓撲架構 #3.1zookeeper概述介紹 3.1.1zookeeper應用舉例 3.1.2zookeeper的工作原理是什么&#xff1f; 3.1.3z…