标签: libalsa

ALSA配置如何在asound.conf中组合MMAP仿真和Ladspa插件

我使用rpi dac在Raspberry Pi计算模块(Linux)上有一个工作的PCM输出和良好的声音.'aplay -l'命令输出显示以下内容:

>> aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: sndrpirpidac [snd_rpi_rpi_dac], device 0: RPi-DAC HiFi pcm1794a-hifi-0 []
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
Subdevices: 8/8
Subdevice #0: subdevice #0
Subdevice #1: subdevice #1
Subdevice #2: subdevice #2
Subdevice #3: subdevice #3
Subdevice #4: subdevice #4
Subdevice #5: subdevice #5
Subdevice #6: subdevice #6
Subdevice #7: subdevice #7
card 1: ALSA [bcm2835 ALSA], …
Run Code Online (Sandbox Code Playgroud)

linux alsa tinyalsa libasound libalsa

19
推荐指数
1
解决办法
1116
查看次数

ALSA应用程序在Raspberry Pi上读取和播放WAV文件

尝试学习ALSA音频层,最终为Raspberry Pi平台编写ALSA设备驱动程序.从简单开始,我将来自ALSA项目站点和其他在线资源的各种样本粘在一起做最简单的事情:读取WAV文件并在默认声音设备上播放.我不能让这个简单的C样本工作.

我正在使用libsndfile来做所有的WAV文件读取/头部解码.我验证了我读入缓冲区的样本是正确的(验证了程序读取的第一个400K样本,对应于将样本值转储到文本文件的sndfile-to-text应用程序).所以我知道我的缓冲区包含正确的数据,问题必须是我将其传递给ALSA API的方式.

在运行时,它只在正确的通道中产生声音,并且扭曲/泥泞 - 几乎无法识别.顺便说一句,"aplay"应用程序完美地播放相同的WAV文件并报告该文件是16位带符号LE,44100Hz,立体声,它与我的应用程序报告的内容相匹配.在Raspberry Pi上运行它.

我在这里将C程序剥离到最小值以节省空间,但我验证了所有API调用的正确返回码.为什么这个简单的ALSA应用程序没有产生正确的声音?

#include <alsa/asoundlib.h>
#include <stdio.h>
#include <sndfile.h>

#define PCM_DEVICE "default"

int main(int argc, char **argv) {

    snd_pcm_t *pcm_handle;
    snd_pcm_hw_params_t *params;
    snd_pcm_uframes_t frames;
    int dir, pcmrc;

    char *infilename = "/home/pi/shortsample.wav";
    int* buf = NULL;
    int readcount;

    SF_INFO sfinfo;
    SNDFILE *infile = NULL;

    infile = sf_open(infilename, SFM_READ, &sfinfo);
    fprintf(stderr,"Channels: %d\n", sfinfo.channels);
    fprintf(stderr,"Sample rate: %d\n", sfinfo.samplerate);
    fprintf(stderr,"Sections: %d\n", sfinfo.sections);
    fprintf(stderr,"Format: %d\n", sfinfo.format);

    /* Open the PCM device in playback mode */
    snd_pcm_open(&pcm_handle, PCM_DEVICE, SND_PCM_STREAM_PLAYBACK, 0); …
Run Code Online (Sandbox Code Playgroud)

audio alsa raspberry-pi libalsa

7
推荐指数
1
解决办法
5644
查看次数

ALSA lib pcm_hw.c:1667:(_snd_pcm_hw_open) 卡 arecord 的值无效:main:722:音频打开错误:没有那个文件或目录

我正在研究语音识别。为此,我正在使用“alsa-utils”,但是当我尝试使用此脚本时

    #!/bin/bash

echo “Recording… Press Ctrl+C to Stop.”
arecord -D plughw:1,0 -q -f cd -t wav | ffmpeg -loglevel panic -y -i – -ar 16000 -acodec flac file.flac > /dev/null 2>&1

echo “Processing…”
wget -q -U “Mozilla/5.0” –post-file file.flac –header “Content-Type: audio/x-flac; rate=16000” -O – “http://www.google.com/speech-api/v1/recognize?lang=en-us&client=chromium” | cut -d” -f12 >stt.txt

echo -n “You Said: ”
cat stt.txt

rm file.flac > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

    “Recording… Press Ctrl+C to Stop.”
ALSA lib pcm_hw.c:1667:(_snd_pcm_hw_open) Invalid value for card
arecord: main:722: audio open …
Run Code Online (Sandbox Code Playgroud)

ubuntu speech-recognition alsa voice-recognition libalsa

6
推荐指数
1
解决办法
2万
查看次数

在 Linux 上共享麦克风音频流

重要的是我的场景是开发一个可访问性应用程序而不是任何类型的恶意窃听,而在这个场景中还有各种研究和开发隐含场景,所有这些都应该从能够通过多个读取麦克风音频流中受益匪浅同时运行不相关的进程,例如记录工具和/或我自己的代码的不同版本。

问题陈述

我正在使用高级 python API 读取麦克风输入流,如下所示:

import sounddevice

audio_stream = sounddevice.InputStream(
  device=self.microphone_device,
  channels=max(self.channels),
  samplerate=self.audio_props['sample_rate'],
  blocksize=int(self.audio_props['frame_elements_size']),
  callback=self.audio_callback)
Run Code Online (Sandbox Code Playgroud)

我想了解是否可以(在 linux 上)将麦克风音频流同时读取到另一个程序,例如 Google Meet / Zoom 读取它。即有效地共享音频流。

与前面提到的 python 包装器一样,当视频通话正在进行时启动上述代码时,它只会无法打开流,这不足为奇:

Expression 'paInvalidSampleRate' failed in 
'src/hostapi/alsa/pa_linux_alsa.c', line: 2043 
Expression 'PaAlsaStreamComponent_InitialConfigure( &self->playback, outParams, self->primeBuffers, hwParamsPlayback, &realSr )' 
failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2716 
Expression 'PaAlsaStream_Configure( stream, inputParameters, outputParameters, sampleRate, framesPerBuffer, &inputLatency, &outputLatency, &hostBufferSizeMode )' 
failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2837
Run Code Online (Sandbox Code Playgroud)

诚然,我还不是很精通 ALSA 术语和一般的 linux 上的声音堆栈。

我的问题是,这可以直接使用 ALSA 库 API 来完成,还是通过其他声音堆栈或声音系统配置来完成?或者,如果所有其他方法都不起作用,通过代理程序/驱动程序能够向多个消费者公开音频缓冲区,而不会导致音频流延迟明显下降?

audio alsa pulseaudio jack libalsa

3
推荐指数
1
解决办法
1825
查看次数

aplay 使用文件而不是 stdin 和 stdout 管道到 arecord

下面的命令将记录来自默认设备的数据并将其输出到 stdout,aplay 将播放来自 stdin 的数据。

arecord -D hw:0  | aplay -D hw:1 -
Run Code Online (Sandbox Code Playgroud)

为什么我们更喜欢 stdin 和 stdout 而不是写入文件并读取文件,如下所示?

arecord -D hw:0 test.wav | aplay -D hw:1 test.wav
Run Code Online (Sandbox Code Playgroud)

alsa libalsa

2
推荐指数
1
解决办法
3741
查看次数