Bagaimana cara mengubah sample rate mikrofon menjadi 16000 di linux?

Jan 06 2021

Saat ini saya mengerjakan proyek yang saya coba gunakan Deepspeech pada raspberry pi saat menggunakan audio mikrofon, tetapi saya terus mendapatkan kesalahan laju Sampel Tidak Valid. Dengan menggunakan pyAudio, saya membuat aliran yang menggunakan laju sampel yang diinginkan model, yaitu 16000, tetapi mikrofon yang saya gunakan memiliki laju sampel 44100. Saat menjalankan skrip python, tidak ada konversi laju yang dilakukan dan laju sampel mikrofon serta yang diharapkan laju sampel model menghasilkan kesalahan Rasio Sampel Tidak Valid.

Info mikrofon terdaftar seperti ini oleh pyaudio:

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

Hal pertama yang saya coba adalah mengatur laju sampel aliran pyAudio ke 44100 dan memberi makan model itu. Tetapi setelah pengujian saya menemukan bahwa model tersebut tidak berfungsi dengan baik ketika mendapat tingkat yang berbeda dari 16000 yang diminta.

Saya telah mencoba menemukan cara agar tingkat perubahan mikrofon menjadi 16000, atau setidaknya tingkatnya diubah menjadi 16000 ketika digunakan dalam skrip python, tetapi tidak berhasil.

Hal terbaru yang saya coba adalah mengubah file .asoundrc untuk menemukan cara mengubah kecepatan, tetapi saya tidak tahu apakah mungkin untuk mengubah kecepatan mikrofon menjadi 16000 dalam file ini. Seperti inilah tampilan file saat ini:

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
} 

Kode python yang saya buat berfungsi di windows, yang saya kira karena windows memang mengubah laju input ke laju sampel dalam kode. Tetapi Linux tampaknya tidak melakukan ini.

tldr; tingkat mikrofon adalah 44100, tetapi harus diubah ke 16000 agar dapat digunakan. Bagaimana Anda melakukan ini di Linux?

Edit 1:

Saya membuat aliran pyAudio seperti ini:

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

Ini menggunakan kecepatan model dan beamwidth model, dan jumlah saluran mikrofon dan indeks mikrofon.

Saya mendapatkan bingkai audio berikutnya dan memformatnya dengan benar untuk digunakan dengan aliran yang saya buat untuk model yang saya lakukan ini:

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 = Falsedigunakan untuk menguji model dengan input rate 44100, tanpa set ini ke False kesalahan yang sama seperti yang saat ini saya tangani akan terjadi. model.beamWidthadalah variabel yang memiliki nilai untuk jumlah potongan yang diharapkan model. Saya kemudian membaca sejumlah potongan itu dan memformatnya kembali sebelum memasukkannya ke aliran model. Yang terjadi seperti ini:

modelStream.feedAudioContent(self.__get_next_audio_frame__())

Jawaban

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

Jadi setelah beberapa pengujian saya akhirnya mengedit file konfigurasi untuk pulse. Dalam file ini Anda dapat menghapus komentar entri yang memungkinkan Anda mengedit default dan / atau tingkat pengambilan sampel alternatif. Pengeditan tingkat pengambilan sampel alternatif dari 48000 menjadi 16000 adalah yang dapat menyelesaikan masalah saya.

File ini terletak di sini: /etc/pulse/daemon.conf . Kami dapat membuka dan mengedit file ini di Raspberian menggunakan sudo vi daemon.conf. Kemudian kita perlu menghapus komentar pada baris ; alternate-sample-rate = 48000yang dilakukan dengan menghapus ;dan mengubah nilai 48000menjadi 16000. Simpan file dan keluar dari vim. Kemudian restart Pulseaudio menggunakan pulseaudio -kuntuk memastikan itu menjalankan file yang diubah.

Jika Anda tidak terbiasa dengan vim dan Linux, berikut adalah panduan yang lebih terperinci melalui proses mengubah laju sampel.