----点击键盘左上角的·键触发
----借助电脑麦克风或者虚拟麦克风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()

被折叠的 条评论
为什么被折叠?



