จะเปลี่ยนอัตราตัวอย่างไมโครโฟนเป็น 16000 บน linux ได้อย่างไร?
ฉันกำลังทำโปรเจ็กต์ที่ฉันพยายามใช้ 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__())
คำตอบ
ดังนั้นหลังจากการทดสอบเพิ่มเติมฉันจึงทำการแก้ไขไฟล์ config สำหรับพัลส์ ในไฟล์นี้คุณสามารถยกเลิกการแสดงความคิดเห็นซึ่งอนุญาตให้คุณแก้ไขค่าเริ่มต้นและ / หรืออัตราการสุ่มตัวอย่างอื่น การแก้ไขอัตราการสุ่มตัวอย่างทางเลือกจาก 48000 เป็น 16000 คือสิ่งที่สามารถแก้ปัญหาของฉันได้
ไฟล์อยู่ที่นี่: /etc/pulse/daemon.conf
. เราสามารถเปิดและแก้ไขไฟล์นี้บน Raspberian โดยใช้ไฟล์sudo vi daemon.conf
. จากนั้นเราต้อง uncomment บรรทัด; alternate-sample-rate = 48000
ซึ่งจะกระทำโดยการถอด;
และเปลี่ยนค่าของการ48000
16000
บันทึกไฟล์และออกจากกลุ่ม จากนั้นรีสตาร์ท Pulseaudio โดยใช้pulseaudio -k
เพื่อให้แน่ใจว่ารันไฟล์ที่เปลี่ยนแปลง
หากคุณไม่คุ้นเคยกับ vim และ Linux นี่คือคำแนะนำที่ละเอียดยิ่งขึ้นผ่านกระบวนการเปลี่ยนอัตราตัวอย่าง