Linux'ta mikrofon örnekleme hızı 16000 olarak nasıl değiştirilir?

Jan 06 2021

Şu anda mikrofon sesini kullanırken bir ahududu pi üzerinde Deepspeech kullanmaya çalıştığım bir proje üzerinde çalışıyorum, ancak bir Geçersiz Örnek oranı hatası almaya devam ediyorum. PyAudio kullanarak, modelin istediği örnekleme oranını kullanan bir akış oluşturuyorum, bu 16000'dir, ancak kullandığım mikrofonun örnekleme hızı 44100'dür. Python komut dosyasını çalıştırırken hız dönüşümü yapılmaz ve mikrofon örnekleme hızı ve beklenen modelin örnekleme oranı Geçersiz Örnek Hızı hatası verir.

Mikrofon bilgileri pyaudio tarafından şu şekilde listelenmiştir:

{'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}

İlk denediğim şey, pyAudio akışı örnek oranını 44100'e ayarlamak ve bunu modeli beslemekti. Ancak test ettikten sonra, modelin talep edilen 16000'den farklı bir oran aldığında iyi çalışmadığını öğrendim.

Mikrofon değişim oranını 16000'e çıkarmanın veya en azından python komut dosyasında kullanıldığında oranını 16000'e dönüştürmenin bir yolunu bulmaya çalışıyordum, ancak boşuna.

Denediğim en son şey, hızı değiştirmek için .asoundrc dosyasını değiştirmektir, ancak bu dosya içinde mikrofonun oranını 16000 olarak değiştirmenin mümkün olup olmadığını bilmiyorum. Dosya şu anda şöyle görünüyor:

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
} 

Yaptığım python kodu pencerelerde çalışıyor, sanırım windows giriş oranını koddaki örnekleme oranına dönüştürüyor. Ancak Linux bunu yapmıyor gibi görünüyor.

tldr; mikrofon hızı 44100'dür, ancak kullanılabilmesi için 16000'e değiştirilmesi gerekir. Bunu Linux'ta nasıl yaparsınız?

Düzenleme 1:

PyAudio akışını şu şekilde oluşturuyorum:

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())

Modelin oranını ve modelin huzme genişliğini ve mikrofonun kanal sayısını ve mikrofonun indeksini kullanır.

Bir sonraki ses çerçevesini alıyorum ve bunu model için oluşturduğum akışla kullanmak için doğru şekilde biçimlendirmek için şunu yapıyorum:

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 = Falsemodeli 44100 giriş hızıyla test etmek için kullanıldı, bu False'a ayarlanmadan şu anda uğraştığımla aynı hata oluşacaktı. model.beamWidthmodelin beklediği parça miktarının değerini tutan bir değişkendir. Daha sonra bu miktarda parçayı okudum ve modelin akışına beslemeden önce yeniden biçimlendirdim. Bu şöyle olur:

modelStream.feedAudioContent(self.__get_next_audio_frame__())

Yanıtlar

N.T.AvH Jan 09 2021 at 23:47

Bu yüzden, biraz daha testten sonra, yapılandırma dosyasını pulse için düzenledim. Bu dosyada, varsayılan ve / veya alternatif örnekleme oranını düzenlemenize izin veren girişleri geri alabilirsiniz. 48000'den 16000'e alternatif örnekleme oranının düzenlenmesi benim problemimi çözmeyi başardı.

Dosyası burada bulunmaktadır: /etc/pulse/daemon.conf . Bu dosyayı kullanarak Raspberian'da açabilir ve düzenleyebiliriz sudo vi daemon.conf. Sonra yapılan satırın açıklamasını ; alternate-sample-rate = 48000kaldırıp ;değerini olarak değiştirmemiz 48000gerekir 16000. Dosyayı kaydedin ve vim'den çıkın. Ardından pulseaudio -k, değiştirilen dosyayı çalıştırdığından emin olmak için ile Pulseaudio'yu yeniden başlatın .

Eğer vim ve Linux'a aşina değilseniz, burada örnek oranını değiştirme sürecinde daha ayrıntılı bir kılavuz bulabilirsiniz.