Làm thế nào để thay đổi tỷ lệ mẫu micrô thành 16000 trên Linux?
Tôi hiện đang làm việc trong một dự án mà tôi đang cố gắng sử dụng Deepspeech trên raspberry pi trong khi sử dụng âm thanh micrô, nhưng tôi vẫn gặp lỗi Tỷ lệ mẫu không hợp lệ. Sử dụng pyAudio, tôi tạo một luồng sử dụng tốc độ mẫu mà mô hình muốn, là 16000, nhưng micrô tôi đang sử dụng có tốc độ mẫu là 44100. Khi chạy tập lệnh python, không có chuyển đổi tỷ lệ nào được thực hiện và tỷ lệ mẫu micrô và tốc độ dự kiến tỷ lệ mẫu của mô hình tạo ra lỗi Tỷ lệ mẫu không hợp lệ.
Thông tin micrô được liệt kê như thế này bởi 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}
Điều đầu tiên tôi đã thử là đặt tỷ lệ mẫu luồng pyAudio thành 44100 và cung cấp cho mô hình đó. Nhưng sau khi thử nghiệm, tôi phát hiện ra rằng mô hình không hoạt động tốt khi nó có tỷ lệ khác với 16000 được yêu cầu.
Tôi đã cố gắng tìm cách để tỷ lệ thay đổi của micrô thành 16000, hoặc ít nhất là tỷ lệ của nó được chuyển đổi thành 16000 khi nó được sử dụng trong tập lệnh python, nhưng vô ích.
Điều mới nhất tôi đã thử là thay đổi tệp .asoundrc để tìm cách thay đổi tốc độ, nhưng tôi không biết liệu có thể thay đổi tốc độ của micrô thành 16000 trong tệp này hay không. Đây là cách tệp hiện tại trông như thế nào:
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
}
Mã python tôi đã tạo hoạt động trên windows, tôi đoán là do windows chuyển đổi tỷ lệ đầu vào thành tỷ lệ mẫu trong mã. Nhưng Linux dường như không làm được điều này.
tldr; tỷ lệ micrô là 44100, nhưng phải thay đổi thành 16000 để sử dụng được. Làm thế nào để bạn làm điều này trên Linux?
Chỉnh sửa 1:
Tôi tạo luồng pyAudio như thế này:
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())
Nó sử dụng tỷ lệ của mô hình và độ rộng chùm tia của mô hình cũng như số kênh của micrô và chỉ số của micrô.
Tôi nhận được khung âm thanh tiếp theo và để định dạng nó đúng cách để sử dụng với luồng tôi tạo cho mô hình, tôi thực hiện như sau:
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
đã được sử dụng để kiểm tra mô hình với tỷ lệ đầu vào là 44100, nếu không đặt giá trị này thành Sai, lỗi tương tự như tôi hiện đang xử lý sẽ xảy ra. model.beamWidth
là một biến giữ giá trị cho số lượng khối mà mô hình mong đợi. Sau đó, tôi đọc số lượng các phần đó và định dạng lại chúng trước khi đưa chúng vào luồng của mô hình. Điều này xảy ra như thế này:
modelStream.feedAudioContent(self.__get_next_audio_frame__())
Trả lời
Vì vậy, sau một số thử nghiệm nữa, tôi kết thúc chỉnh sửa tệp cấu hình cho xung. Trong tệp này, bạn có thể bỏ ghi chú các mục cho phép bạn chỉnh sửa tỷ lệ lấy mẫu mặc định và / hoặc thay thế. Việc chỉnh sửa tỷ lệ lấy mẫu thay thế từ 48000 thành 16000 là những gì có thể giải quyết vấn đề của tôi.
Các tập tin nằm ở đây: /etc/pulse/daemon.conf
. Chúng tôi có thể mở và chỉnh sửa tệp này trên Raspberian bằng cách sử dụng sudo vi daemon.conf
. Sau đó, chúng ta cần bỏ ghi chú dòng ; alternate-sample-rate = 48000
được thực hiện bằng cách xóa ;
và thay đổi giá trị của 48000
thành 16000
. Lưu tệp và thoát khỏi vim. Sau đó, khởi động lại Pulseaudio bằng cách sử dụng pulseaudio -k
để đảm bảo rằng nó chạy tệp đã thay đổi.
Nếu bạn chưa quen với vim và Linux, đây là hướng dẫn chi tiết hơn về quá trình thay đổi tỷ lệ mẫu.