該代碼實現了一個企業級的語音識別解決方案,通過調用百度語音識別API,實現實時錄音識別和對已有音頻語音識別功能。
百度智能云:請自行訪問百度智能云,開通免費的語音識別功能,獲取API_KEY和SECRET_KEY。操作按照百度流程即可,可免費申請。
首先,配置下百度API和描述下錯誤代碼信息。以下是音頻相關具體參數:
采樣率 | 16000 Hz | 符合語音識別最佳實踐 |
緩沖區大小 | 1024樣本/塊 | 平衡延遲與穩定性 |
最大錄音時長 | 60秒 | API限制 |
文件大小限制 | 10MB | 內存安全閾值 |
線程超時 | 1000ms | 防止僵尸線程 |
狀態刷新頻率 | 500ms | 用戶體驗優化 |
# 百度API配置(替換為您自己的API信息)
API_KEY = "你的API_KEY"
SECRET_KEY = "你的SECRET_KEY"
AUTH_URL = "https://aip.baidubce.com/oauth/2.0/token"
ASR_URL = "https://vop.baidubce.com/pro_api"# 錯誤代碼映射
ERROR_CODES = {3300: '輸入參數不正確',3301: '音頻質量過差',3302: '音頻鑒權失敗',3303: '服務端請求失敗',3304: '音頻過長(超過60秒)',3305: '音頻數據錯誤',3307: '識別結果解密失敗',3308: '語音服務器系統錯誤',3309: '上傳的音頻沒有有效數據',3310: '輸入的音頻文件過大',3311: '采樣率參數錯誤',3312: '音頻格式參數錯誤',3313: '語音服務器忙',
}
下面,進行?窗口配置?,設置窗口標題為 "百度語音識別工具",定義窗口初始大小為 800x500 像素
?狀態初始化?:is_recording: 錄音狀態標志(False 表示未在錄音);access_token: 存儲百度API的訪問令牌(初始為None);audio: PyAudio實例,用于音頻輸入輸出控制;recording_thread: 錄音線程(用于后臺錄音);temp_files: 臨時錄音文件存儲列表。
?音頻參數?:”FORMAT- 音頻格式為16位PCM(pyaudio.paInt16);CHANNELS- 單聲道錄音(1聲道);RATE- 采樣率16000Hz(符合百度API要求);CHUNK: 每次讀取的音頻塊大小(1024樣本) 。
def __init__(self, root):self.root = rootroot.title("百度語音識別工具")root.geometry("800x500")# 初始化狀態self.is_recording = Falseself.access_token = Noneself.audio = pyaudio.PyAudio()self.recording_thread = Noneself.temp_files = []# 音頻參數self.FORMAT = pyaudio.paInt16self.CHANNELS = 1self.RATE = 16000self.CHUNK = 1024# 創建界面self.setup_ui()# 獲取訪問令牌self.get_access_token()
下面進行界面布局,使用 ttk.Frame 作為容器,標題為 "文件操作",文本輸入框 (ttk.Entry): 顯示選擇的文件路徑,"瀏覽..." 按鈕: 調用 select_file 方法打開文件對話框,"開始識別" 按鈕: 調用 process_selected_file 處理文件。?錄音控制區?:單個按鈕 (record_btn),初始文本為 "? 開始錄音"
點擊觸發 toggle_recording 方法切換錄音狀態;?結果展示區?:tk.Text 組件支持文本換行 ,附加垂直滾動條 (ttk.Scrollbar),與文本框聯動。使用 StringVar 動態更新狀態文本。
def setup_ui(self):"""設置界面布局"""main_frame = ttk.Frame(self.root, padding=10)main_frame.pack(fill=tk.BOTH, expand=True)# 文件選擇區域file_frame = ttk.LabelFrame(main_frame, text="文件操作", padding=10)file_frame.pack(fill=tk.X, pady=5)self.file_entry = ttk.Entry(file_frame, width=50)self.file_entry.pack(side=tk.LEFT, padx=5)ttk.Button(file_frame, text="瀏覽...", command=self.select_file).pack(side=tk.LEFT, padx=5)ttk.Button(file_frame, text="開始識別", command=self.process_selected_file).pack(side=tk.LEFT, padx=5)# 錄音控制區域record_frame = ttk.LabelFrame(main_frame, text="實時錄音", padding=10)record_frame.pack(fill=tk.X, pady=5)self.record_btn = ttk.Button(record_frame, text="? 開始錄音",command=self.toggle_recording)self.record_btn.pack(pady=5)# 結果顯示區域result_frame = ttk.LabelFrame(main_frame, text="識別結果", padding=10)result_frame.pack(fill=tk.BOTH, expand=True)self.result_text = tk.Text(result_frame, wrap=tk.WORD)scrollbar = ttk.Scrollbar(result_frame, command=self.result_text.yview)self.result_text.configure(yscrollcommand=scrollbar.set)self.result_text.pack(side=tk.LEFT, fill=tk