Python让键盘发声
代码1:1复刻于:如何给键盘绑定指定音效?(哔哩哔哩)
我只做了j、n、t、m四个键对应的鸡你太美音频😇
如果你是二刺螈的话,你就可以获得这样一把键盘:向妈妈炫耀自己的新键盘(哔哩哔哩)
文件结构
需要
须安装相应的库
使用Match-Case 语法需要Python 3.10及以上版本
代码
sound.py
import threading
import keyboard
from playsound import playsound
def play(keysound):
playsound('./sound/' + keysound)
def Press(x):
if x.event_type == 'down':
match x.name:
case 'j':
threading.Thread(target=play,args=('j.mp3',)).start()
case 'n':
threading.Thread(target=play,args=('n.mp3',)).start()
case 't':
threading.Thread(target=play,args=('t.mp3',)).start()
case 'm':
threading.Thread(target=play,args=('m.mp3',)).start()
if __name__ == '__main__':
keyboard.hook(Press)
keyboard.wait()
sound文件夹内放入音频文件:jntm.zip
报错
Windows使用playsound库可能会报错:指定的设备未打开,或不被 MCI 所识别。
需要修改这个模块其中的一个函数。
先找到playsound.py的路径
运行下面的代码
import playsound
print(playsound.__file__)
输出D:\python\venv\Lib\site-packages\playsound.py
,每个人应该都不一样。
根据本机输出路径找到这个文件打开,
需要修改的函数应该在第52行
def winCommand(*command):
bufLen = 600
buf = c_buffer(bufLen)
# command = ' '.join(command).encode('utf-16') 把这行注释掉,改成下面的一行
command = ' '.join(command)
errorCode = int(windll.winmm.mciSendStringW(command, buf, bufLen - 1, 0)) # use widestring version of the function
if errorCode:
errorBuffer = c_buffer(bufLen)
windll.winmm.mciGetErrorStringW(errorCode, errorBuffer, bufLen - 1) # use widestring version of the function
exceptionMessage = ('\n Error ' + str(errorCode) + ' for command:'
#'\n ' + command.decode('utf-16') + 把这行注释掉,改成下面的一行
'\n ' + command +
'\n ' + errorBuffer.raw.decode('utf-16').rstrip('\0'))
logger.error(exceptionMessage)
raise PlaysoundException(exceptionMessage)
return buf.value
一般这样就可以正常运行了。