Google Colab运行调用麦克风生成语谱图代码报无效输入设备错误求助
问题根因
- 你遇到的报错本质是运行环境不匹配:Google Colab为云端虚拟运行环境,与你本地Windows笔记本的硬件完全隔离,你用pyaudio调用的是Colab远程服务器的音频设备,而云端服务器未配备麦克风输入硬件,自然返回
[Errno -9996] Invalid input device错误 - 你的本地麦克风仅对本地运行的程序、当前浏览器网页开放权限,无法被Colab远端的Python进程直接访问,原有调用pyaudio的逻辑在Colab环境下完全不可用
- 你原有代码的业务逻辑本身没有问题,仅在非Colab的本地环境可正常运行
解决方案
方案1:适配Colab环境,通过浏览器API采集本地麦克风
Colab支持调用浏览器的录音接口申请麦克风权限,采集本地音频后转成numpy数组即可继续生成语谱图,替换原有代码为以下内容即可:
- 首先运行代码创建存储目录:
import os os.makedirs('data', exist_ok=True)
- 运行录音+生成语谱图的完整代码:
from IPython.display import Javascript from google.colab import output from base64 import b64decode import numpy as np from scipy import signal import matplotlib.pyplot as plt from matplotlib.colors import LogNorm from scipy.io.wavfile import write THRESHOLD = 0 # dB RATE = 44100 INPUT_BLOCK_TIME = 1 # 单次采集时长1秒 RECORD_SECONDS = INPUT_BLOCK_TIME plot_counter = 0 # Colab浏览器录音JS逻辑 RECORD_JS = """ const sleep = time => new Promise(resolve => setTimeout(resolve, time)) const b2text = blob => new Promise(resolve => { const reader = new FileReader() reader.onloadend = e => resolve(e.srcElement.result) reader.readAsDataURL(blob) }) var record = time => new Promise(async resolve => { stream = await navigator.mediaDevices.getUserMedia({ audio: true }) recorder = new MediaRecorder(stream) chunks = [] recorder.ondataavailable = e => chunks.push(e.data) recorder.start() await sleep(time) recorder.onstop = async ()=>{ blob = new Blob(chunks) text = await b2text(blob) resolve(text) } recorder.stop() }) """ def record(seconds): display(Javascript(RECORD_JS)) s = output.eval_js('record(%d)' % (seconds*1000)) b = b64decode(s.split(',')[1]) # 音频转numpy数组 import io import soundfile as sf audio, sr = sf.read(io.BytesIO(b)) # 统一为单声道 if len(audio.shape) > 1: audio = audio.mean(axis=1) # 统一采样率为44100 if sr != RATE: from scipy.signal import resample audio = resample(audio, int(len(audio)*RATE/sr)) return (audio * 32767).astype(np.int16) def processBlock(snd_block): global plot_counter f, t, Sxx = signal.spectrogram(snd_block, RATE) zmin = Sxx.min() + 1e-10 # 避免log计算出现0值报错 zmax = Sxx.max() plt.pcolormesh(t, f, Sxx, cmap='RdBu', norm=LogNorm(vmin=zmin, vmax=zmax)) plt.ylabel('Frequency [Hz]') plt.xlabel('Time [sec]') plt.axis([t.min(), t.max(), f.min(), f.max()]) plt.colorbar() plt.savefig(f'data/spec{plot_counter}.png', bbox_inches='tight') plt.close() write(f'data/audio{plot_counter}.wav', RATE, snd_block) plot_counter += 1 # 循环采集5次,每次1秒 for i in range(5): print(f"第{i+1}次录音启动,请在浏览器弹出的授权请求中允许访问麦克风") snd_block = record(RECORD_SECONDS) processBlock(snd_block) print(f"第{i+1}次录音处理完成,语谱图和音频已保存")
运行时会触发浏览器麦克风授权,允许后即可正常采集音频,生成的语谱图和wav文件存储在Colab左侧文件栏的data目录下,可直接下载。
方案2:本地运行原有代码
不需要修改原有代码逻辑,直接在你的Windows本地Python环境运行即可,操作步骤:
- 安装依赖:执行命令
pip install pyaudio numpy scipy matplotlib - 若pip安装pyaudio失败,可搜索对应你Python版本的pyaudio预编译包安装
- 在代码同级目录创建
data文件夹 - 直接运行原代码即可调用本地麦克风采集音频生成语谱图
内容的提问来源于stack exchange,提问作者Batoot
相关产品推荐
相关产品推荐

