Python做一个超实用音频识别后复制到粘贴板插件代码--有手就行

----点击键盘左上角的·键触发

----借助电脑麦克风或者虚拟麦克风womic拿手机当麦克进行音频录入

----识别后到指定位置esc键进行识别结束与粘贴

流程没有任何繁复,切换窗口也可以触达

------对于appid\apikey自己更换下  搭的百度语音识别api

import pyaudio
import websocket
import json
import threading
import time
import uuid
import pyperclip
from pynput import keyboard
from pynput.keyboard import Controller as KeyController, Key

class BaiduRealtimeASR:
    def __init__(self, appid, apikey, rate=16000, chunk=3200):
        self.appid = appid
        self.apikey = apikey
        self.rate = rate
        self.chunk = chunk
        self.format = pyaudio.paInt16
        self.channels = 1

        self.is_recording = False
        self.recognized_sentences = []
        self.ws = None

    def generate_random_sn(self):
        return str(uuid.uuid4())[:32]

    def on_message(self, ws, message):
        try:
            result = json.loads(message)
            if result.get("type") == "FIN_TEXT":
                final_text = result.get("result", "")
                if final_text:
                    print("【完整句子】", final_text)
                    self.recognized_sentences.append(final_text)
        except Exception as e:
            print("消息解析失败:", e)

    def on_error(self, ws, error):
        print("WebSocket 错误:", error)

    def on_close(self, ws, close_status_code, close_msg):
        print("🔌 WebSocket 连接已关闭")

    def on_open(self, ws):
        print("✅ WebSocket 连接成功")
        init_params = {
            "type": "START",
            "data": {
                "appid": self.appid,
                "appkey": self.apikey,
                "dev_pid": 15372,
                "cuid": "my-test-device-001",
                "format": "pcm",
                "sample": self.rate
            }
        }
        ws.send(json.dumps(init_params))
        threading.Thread(target=self.record_audio, args=(ws,), daemon=True).start()

    def record_audio(self, ws):
        p = pyaudio.PyAudio()
        stream = p.open(
            format=self.format,
            channels=self.channels,
            rate=self.rate,
            input=True,
            frames_per_buffer=self.chunk
        )

        print("🎤 开始录音,请说话...")
        self.is_recording = True

        while self.is_recording:
            try:
                data = stream.read(self.chunk, exception_on_overflow=False)
                ws.send(data, opcode=websocket.ABNF.OPCODE_BINARY)
                time.sleep(0.16)
            except Exception as e:
                print("录音异常:", e)
                break

        print("🛑 停止录音")
        stream.stop_stream()
        stream.close()
        p.terminate()
        try:
            ws.send(json.dumps({"type": "FINISH"}))
        except:
            pass
        try:
            ws.close()
        except:
            pass

    def start(self):
        self.recognized_sentences = []
        sn = self.generate_random_sn()
        ws_url = f"wss://vop.baidu.com/realtime_asr?sn={sn}"
        print("🔌 正在连接语音识别服务...")
        self.ws = websocket.WebSocketApp(
            ws_url,
            on_message=self.on_message,
            on_error=self.on_error,
            on_close=self.on_close
        )
        self.ws.on_open = self.on_open
        threading.Thread(target=self.ws.run_forever, daemon=True).start()

    def stop(self):
        self.is_recording = False

    def get_result(self):
        return " ".join(self.recognized_sentences).strip()


# ===== 粘贴功能 =====
def paste_text(text):
    if not text:
        print("❌ 没有可粘贴的文本")
        return
    pyperclip.copy(text)
    print(f"📋 已复制到剪贴板: {text}")
    time.sleep(0.1)
    kb = KeyController()
    kb.press(Key.ctrl_l)
    kb.press('v')
    kb.release('v')
    kb.release(Key.ctrl_l)
    print("✅ 已模拟粘贴 (Ctrl+V)")


# ===== 主程序 =====
asr = BaiduRealtimeASR(
    appid=1195107??,
    apikey="xE88K8FaS3KJz5r0WoKmBv???"
)

def on_press(key):
    try:
        if key.char == '`':  # 反引号键启动
            print("\n🟡 检测到 '`' 键,启动语音识别...")
            asr.start()
    except AttributeError:
        if key == Key.esc:  # ESC 键停止
            print("\n🛑 检测到 ESC 键,停止语音识别...")
            asr.stop()
            time.sleep(1)  # 等待录音线程结束
            result = asr.get_result()
            paste_text(result)

if __name__ == "__main__":
    print("🎧 语音识别助手已启动")
    print("👉 按 '`' 键开始语音输入,按 ESC 键结束并粘贴")
    listener = keyboard.Listener(on_press=on_press)
    listener.start()
    listener.join()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值