จะเปลี่ยนอัตราตัวอย่างไมโครโฟนเป็น 16000 บน linux ได้อย่างไร?

Jan 06 2021

ฉันกำลังทำโปรเจ็กต์ที่ฉันพยายามใช้ Deepspeech กับราสเบอร์รี่ pi ในขณะที่ใช้เสียงไมโครโฟน แต่ฉันยังคงได้รับข้อผิดพลาดอัตราตัวอย่างไม่ถูกต้อง การใช้ pyAudio ฉันสร้างสตรีมซึ่งใช้อัตราตัวอย่างที่โมเดลต้องการซึ่งคือ 16000 แต่ไมโครโฟนที่ฉันใช้มีอัตราการสุ่มตัวอย่าง 44100 เมื่อเรียกใช้สคริปต์ python จะไม่มีการแปลงอัตราและอัตราตัวอย่างไมโครโฟนและค่าที่คาดไว้ อัตราตัวอย่างของแบบจำลองทำให้เกิดข้อผิดพลาดอัตราตัวอย่างไม่ถูกต้อง

ข้อมูลไมโครโฟนแสดงรายการเช่นนี้โดย 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}

สิ่งแรกที่ฉันลองคือตั้งค่าอัตราตัวอย่างสตรีม pyAudio เป็น 44100 และป้อนโมเดลนั้น แต่หลังจากการทดสอบฉันพบว่าโมเดลทำงานได้ไม่ดีเมื่อได้รับอัตราที่แตกต่างจาก 16000 ที่ร้องขอ

ฉันพยายามหาวิธีที่จะให้อัตราการเปลี่ยนไมโครโฟนเป็น 16000 หรืออย่างน้อยก็มีการแปลงอัตราเป็น 16000 เมื่อใช้ในสคริปต์ python แต่ก็ไม่มีประโยชน์

สิ่งล่าสุดที่ฉันได้ลองคือการเปลี่ยนไฟล์. asoundrc เพื่อค้นหาการเปลี่ยนอัตรา แต่ฉันไม่รู้ว่าจะสามารถเปลี่ยนอัตราของไมโครโฟนเป็น 16000 ภายในไฟล์นี้ได้หรือไม่ นี่คือลักษณะของไฟล์ในปัจจุบัน:

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 ดังนี้:

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

ใช้อัตราของรุ่นและแบนด์วิธของรุ่นและจำนวนช่องของไมโครโฟนและดัชนีของไมโครโฟน

ฉันได้รับกรอบเสียงถัดไปและจัดรูปแบบให้ถูกต้องเพื่อใช้กับสตรีมที่ฉันสร้างสำหรับโมเดลที่ฉันทำสิ่งนี้:

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เป็นตัวแปรที่เก็บค่าสำหรับจำนวนชิ้นที่โมเดลคาดไว้ จากนั้นฉันอ่านชิ้นส่วนจำนวนนั้นและจัดรูปแบบใหม่ก่อนที่จะป้อนเข้าสู่สตรีมของนางแบบ ซึ่งเกิดขึ้นเช่นนี้:

modelStream.feedAudioContent(self.__get_next_audio_frame__())

คำตอบ

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

ดังนั้นหลังจากการทดสอบเพิ่มเติมฉันจึงทำการแก้ไขไฟล์ config สำหรับพัลส์ ในไฟล์นี้คุณสามารถยกเลิกการแสดงความคิดเห็นซึ่งอนุญาตให้คุณแก้ไขค่าเริ่มต้นและ / หรืออัตราการสุ่มตัวอย่างอื่น การแก้ไขอัตราการสุ่มตัวอย่างทางเลือกจาก 48000 เป็น 16000 คือสิ่งที่สามารถแก้ปัญหาของฉันได้

ไฟล์อยู่ที่นี่: /etc/pulse/daemon.conf . เราสามารถเปิดและแก้ไขไฟล์นี้บน Raspberian โดยใช้ไฟล์sudo vi daemon.conf. จากนั้นเราต้อง uncomment บรรทัด; alternate-sample-rate = 48000ซึ่งจะกระทำโดยการถอด;และเปลี่ยนค่าของการ48000 16000บันทึกไฟล์และออกจากกลุ่ม จากนั้นรีสตาร์ท Pulseaudio โดยใช้pulseaudio -kเพื่อให้แน่ใจว่ารันไฟล์ที่เปลี่ยนแปลง

หากคุณไม่คุ้นเคยกับ vim และ Linux นี่คือคำแนะนำที่ละเอียดยิ่งขึ้นผ่านกระบวนการเปลี่ยนอัตราตัวอย่าง