试验过程记录
做linux环境下的开发时暂时用Windows子系统替代了一下,希望实现ubuntu18.04子系统使用电脑声卡进行录音功能。但是尝试多次无果。
尝试过程:
1. 以为是驱动问题,但是不是。
2. 使用以下命令查看声卡,没有反应或者返回no soundcard。
$ arecord -l
$ aplay -l
$ spci | grep Audio
并且
$ sudo modprobe snd_aloop
执行后出现
modprobe: FATAL: Module snd_aloop not found in directory /lib/modules/5.10.16.3-microsoft-standard-WSL2
根据 Ubuntu 18.04 解决no soundcards found情况下没有声音的问题_xhyglh的博客-CSDN博客 的启发,觉得可能是内核有东西缺失,便参照其过程安装linux-modules-extra的generic
3. 下载指定版本generic后无果,直接输入
$ sudo apt install linux-image-generic
妄想下载一个默认版本来得到正确的linux-modules-extra(
但是召唤出所有内核版本后发现,这个wsl默认的同之前闷头乱撞下载的generic和按照上面链接指引下载的结果不同。版本号的格式都不同。所以应该不是上面的方法可以解决的问题。
~$ dpkg --list | grep linux-image
ii linux-image-4.15.0-191-generic 4.15.0-191.202 amd64 Signed kernel image generic
ii linux-image-4.15.0-39-generic 4.15.0-39.42 amd64 Signed kernel image generic
ii linux-image-5.0.0-16-generic 5.0.0-16.17~18.04.1 amd64 Signed kernel image generic
ii linux-image-generic 4.15.0.191.176 amd64 Generic Linux kernel image
4. 直到大海捞针捞到这篇帖子
Add the ability for WSL to have a soundcard driver
然后才发现WSL目前还没有升级到可以支持声音设备,可以用pulseaudio服务连回windows使用电脑自带的声卡来录音、公放。所以需要下载Pulseaudio来完成这一步
PulseAudio version 1.1 是很老的一个版本,但是可以用于windows10上,可以暂且原谅它的老旧,下载连接:https://www.freedesktop.org/wiki/Software/PulseAudio/Ports/Windows/Support/
下载后解压,这一步我没成功,因为我解压出来的文件和这个指引下的文件不一致:Enabling sound in WSL / Ubuntu - Let It Sing! - X410.dev,于是没用这个方法,初步设想是在PulseAudio的版本中找到一个符合其描述的来下载。但我还没尝试。
完成后可以用以下代码测试。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Time-stamp: "2022-05-05 02:21:23 (ywatanabe)"
import soundcard as sc
import numpy as np
# get a list of all speakers:
speakers = sc.all_speakers()
# get the current default speaker on your system:
default_speaker = sc.default_speaker()
# get a list of all microphones:
mics = sc.all_microphones()
# get the current default microphone on your system:
default_mic = sc.default_microphone()
print(default_speaker)
print(default_mic)
# record and play back one second of audio:
fs = 48000
rec_sec = 5
data = default_mic.record(samplerate=fs, numframes=fs*rec_sec)
default_speaker.play(data/np.max(data), samplerate=fs)
# alternatively, get a `Recorder` and `Player` object
# and play or record continuously:
with default_mic.recorder(samplerate=fs) as mic, \
default_speaker.player(samplerate=fs) as sp:
for _ in range(100):
data = mic.record(numframes=1024)
sp.play(data)
## EOF
5. 另一种下载PulseAudio version 5.0的方法
Streaming audio from Linux to Windows
待我研究一下
credit to @xhyglh, @tomjepp, X41O