首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在linux上将麦克风采样率改为16000?

如何在linux上将麦克风采样率改为16000?
EN

Stack Overflow用户
提问于 2021-01-06 23:53:55
回答 1查看 756关注 0票数 3

我目前正在做一个项目,我试图在覆盆子pi上使用Deepspeech,同时使用麦克风音频,但我一直收到无效的采样率错误。我使用pyAudio创建了一个流,它使用模型所需的采样率,即16000,但我使用的麦克风的采样率为44100。运行python脚本时,不会进行速率转换,麦克风采样率和模型的预期采样率会产生无效的采样率错误。

通过pyaudio,麦克风信息如下所示:

代码语言:javascript
运行
复制
{'index': 1, 'structVersion': 2, 'name': 'Logitech USB Microphone: Audio (hw:1,0)', 'hostApi': 0, 'maxInputChannels': 1, 'maxOutputChannels': 0, 'defaultLowInputLatency': 0.008684807256235827, 'defaultLowOutputLatency': -1.0, 'defaultHighInputLatency': 0.034829931972789115, 'defaultHighOutputLatency': -1.0, 'defaultSampleRate': 44100.0}

我尝试的第一件事是将pyAudio流采样率设置为44100,并将其提供给模型。但经过测试后,我发现该模型在获得与其要求的16000不同的速率时不能很好地工作。

我一直在尝试将麦克风的更改率设置为16000,或者至少在python脚本中使用时将其更改率转换为16000,但无济于事。

我尝试过的最新方法是更改.asoundrc文件,以便找到更改速率的方法,但我不知道是否可以在此文件中将麦克风的速率更改为16000。文件的当前外观如下所示:

代码语言:javascript
运行
复制
pcm.!default {
        type asymd
        playback.pcm
        {
                type plug
                slave.pcm "dmix"
        }
        capture.pcm
        {
                type plug
                slave.pcm "usb"
        }
}

ctl.!default {
        type hw
        card 0
}

pcm.usb {
        type hw
        card 1
        device 0
        rate 16000
} 

我编写的python代码可以在windows上运行,我猜这是因为windows确实将输入速率转换为代码中的采样率。但是Linux似乎不能做到这一点。

tldr;麦克风率为44100,但必须更改为16000才可用。在Linux上如何做到这一点?

编辑1:

我像这样创建pyAudio流:

代码语言:javascript
运行
复制
self.paStream = self.pa.open(rate = self.model.sampleRate(), channels = 1, format= pyaudio.paInt16, input=True, input_device_index = 1, frames_per_buffer= self.model.beamWidth())

它使用模型的速率和模型的波束宽度,以及麦克风的通道数和麦克风的索引。

我得到下一个音频帧,并对其进行适当的格式化,以便与我为模型创建的流一起使用,我这样做:

代码语言:javascript
运行
复制
def __get_next_audio_frame__(self):
    audio_frame = self.paStream.read(self.model.beamWidth(), exception_on_overflow= False)  
    audio_frame = struct.unpack_from("h" * self.model.beamWidth(), audio_frame)     
    return audio_frame

exception_on_overflow = False用于测试输入率为44100的模型,如果不将其设置为False,则会出现与我目前处理的相同的错误。model.beamWidth是一个变量,用于保存模型期望的区块数量的值。然后,我读取该数量的块,并在将它们提供给模型的流之前对它们进行重新格式化。它是这样发生的:

代码语言:javascript
运行
复制
modelStream.feedAudioContent(self.__get_next_audio_frame__())
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-10 00:47:25

因此,在进一步测试之后,我结束了对pulse的配置文件的编辑。在此文件中,您可以取消注释允许您编辑默认和/或备用采样率的条目。将可选采样率从48000编辑到16000就解决了我的问题。

文件位于以下位置:/etc/pulse/daemon.conf。我们可以使用sudo vi daemon.conf在Raspberian上打开和编辑此文件。然后,我们需要取消对; alternate-sample-rate = 48000行的注释,方法是删除;并将48000的值更改为16000。保存文件并退出vim。然后使用pulseaudio -k重新启动Pulseaudio,以确保它运行更改后的文件。

如果您不熟悉vim和Linux,那么在更改采样率的过程中,here是一个更详细的指南。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65599012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档