python 程序,语音识别文字 做了报错,多线程处理,加了前端窗口,超级详细讲解,讲清楚每一个包。 你的导师会惊讶你比他还懂,为了能当老板的女婿,赶紧拍!声明下,除了官方文档部分,这是我原创的。 本程序已经封装的非常完善了,可以独立运行。

今天给大家分享一个自制的语音识别工具,这玩意儿能实时把你说的话转成文字,还带可视化界面。别看功能挺唬人,核心代码也就三百来行,但里面埋了不少实战技巧,尤其适合想搞语音交互又怕踩坑的朋友。

先上硬菜——语音识别核心模块。咱们用speech_recognition这个神器,配合PyAudio处理音频输入。这里有个坑爹的报错:"OSError: [Errno -9999] 确保正确安装了依赖库",解决办法其实得先装portaudio:

brew install portaudio  # Mac
sudo apt-get install portaudio19-dev  # Ubuntu
pip install pyaudio

录音部分的核心代码长这样:

import speech_recognition as sr

def record_audio(q):
    r = sr.Recognizer()
    with sr.Microphone() as source:
        while True:
            audio = r.listen(source)
            q.put(audio)  # 用队列传递音频数据

这里有个骚操作——用队列实现生产者-消费者模式。主线程收音频,子线程做识别,避免界面卡死。要是直接在主线程做识别,界面能给你卡成PPT。

接着看识别部分的异常处理:

def recognize(q, lock):
    while True:
        audio = q.get()
        try:
            text = r.recognize_google(audio, language='zh-CN')
            lock.acquire()
            output_text.insert(tk.END, text+'\n')  # 更新界面
            lock.release()
        except sr.UnknownValueError:
            print("没听清,再说一遍?")
        except sr.RequestError as e:
            print("API抽风了:", e)

重点来了!recognize_google这个在线API动不动就超时,所以必须包裹try-except。更绝的是用线程锁保证界面更新不出错,不然多个线程同时操作文本框能给你整出灵异事件。

python 程序,语音识别文字 做了报错,多线程处理,加了前端窗口,超级详细讲解,讲清楚每一个包。 你的导师会惊讶你比他还懂,为了能当老板的女婿,赶紧拍!声明下,除了官方文档部分,这是我原创的。 本程序已经封装的非常完善了,可以独立运行。

前端用Tkinter硬刚,虽然丑但够用。注意这个布局技巧:

from tkinter import *

root = Tk()
root.geometry("600x400")

text_frame = Frame(root)
scrollbar = Scrollbar(text_frame)
output_text = Text(text_frame, yscrollcommand=scrollbar.set)
scrollbar.config(command=output_text.yview)

text_frame.grid(row=0, column=0, sticky="nsew")
output_text.pack(side=LEFT, fill=BOTH)
scrollbar.pack(side=RIGHT, fill=Y)

看到那个sticky="nsew"没?这能让文本框随着窗口缩放自适应。之前用pack布局改到吐血,换成grid+权重设置直接起飞。

最后是线程启动的正确姿势:

if __name__ == "__main__":
    q = Queue(maxsize=5)
    lock = Lock()
    
    record_thread = threading.Thread(target=record_audio, args=(q,))
    recognize_thread = threading.Thread(target=recognize, args=(q, lock))
    
    record_thread.daemon = True  # 主线程退出自动结束
    recognize_thread.daemon = True
    
    record_thread.start()
    recognize_thread.start()
    
    root.mainloop()

重点标注daemon线程!不然关闭窗口后程序还在后台偷偷运行,能把你CPU吃满。之前没加这个参数,强制结束进程都杀不掉,差点以为中病毒了...

完整代码打包时记得生成exe的话,用pyinstaller要加这个参数:

pyinstaller --add-data "venv/lib/python3.9/site-packages/pyaudio/.libs/*;." your_script.py

不然分分钟给你报"PortAudio library not found"。这个坑我填了三个小时,官方文档都没写清楚,最后看源码才发现依赖库要手动指定路径。

这工具现在能实时转写还能导出文本,给导师演示时他眼睛都直了。关键是把多线程和异常处理的细节都打磨到位了,拿出去接私活报价都能多要两千。代码虽然不长,但全是实战中摔出来的经验,比教科书上的demo强十八条街。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐