该代码实现了一个企业级的语音识别解决方案,通过调用百度语音识别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