2015-07-05 16 views
5

Tôi đang woking trên một progarm phân tích các pitch của một tập tin âm thanh. Tôi đã xem qua một API rất tốt được gọi là "TarsosDSP" cung cấp phân tích cao độ khác nhau. Tuy nhiên tôi đang gặp rất nhiều rắc rối khi thiết lập nó. Ai đó có thể chỉ cho tôi một số gợi ý nhanh về cách sử dụng API này (đặc biệt là lớp PitchProcessor) không? Một số đoạn mã sẽ được đánh giá rất cao bởi vì tôi thực sự mới trong phân tích âm thanh.TarsosDSP Pitch phân tích cho Dummies

Cảm ơn

EDIT: Tôi tìm thấy một số tài liệu tại http://husk.eecs.berkeley.edu/courses/cs160-sp14/index.php/Sound_Programming nơi có một số mã ví dụ cho thấy làm thế nào để thiết lập các PitchProcessor, ...

int bufferReadResult = mRecorder.read(mBuffer, 0, mBufferSize); 
// (note: this is NOT android.media.AudioFormat) 
be.hogent.tarsos.dsp.AudioFormat mTarsosFormat = new be.hogent.tarsos.dsp.AudioFormat(SAMPLE_RATE, 16, 1, true, false); 
AudioEvent audioEvent = new AudioEvent(mTarsosFormat, bufferReadResult); 
audioEvent.setFloatBufferWithByteBuffer(mBuffer); 
pitchProcessor.process(audioEvent); 

... Tôi khá mất, những gì chính xác là mBuffer và mBufferSize? Làm cách nào để tìm các giá trị này? Và tôi nhập tệp âm thanh của mình ở đâu?

Trả lời

7

Luồng âm thanh cơ bản trong khung TarsosDSP như sau: luồng âm thanh đến có nguồn gốc từ tệp âm thanh hoặc micrô được đọc và cắt thành các khung hình, ví dụ: 1024 mẫu. Mỗi khung đi qua một đường ống có thể sửa đổi hoặc phân tích (ví dụ: phân tích sân).

Trong TarsosDSP, AudioDispatcher có trách nhiệm cắt âm thanh trong khung. Nó cũng bao bọc một khung âm thanh thành một đối tượng AudioEvent. Đối tượng AudioEvent này được gửi qua chuỗi AudioProcessors.

Vì vậy, trong mã bạn trích dẫn mBuffer là khung âm thanh, mBufferSize là kích thước của bộ đệm trong các mẫu. Bạn có thể tự chọn kích thước bộ đệm nhưng để phát hiện nốt 2048 mẫu là hợp lý.

Để phát hiện nốt nhạc mà bạn có thể làm một cái gì đó như thế này với các thư viện TarsosDSP:

PitchDetectionHandler handler = new PitchDetectionHandler() { 
     @Override 
     public void handlePitch(PitchDetectionResult pitchDetectionResult, 
       AudioEvent audioEvent) { 
      System.out.println(audioEvent.getTimeStamp() + " " pitchDetectionResult.getPitch()); 
     } 
    }; 
    AudioDispatcher adp = AudioDispatcherFactory.fromDefaultMicrophone(2048, 0); 
    adp.addAudioProcessor(new PitchProcessor(PitchEstimationAlgorithm.YIN, 44100, 2048, handler)); 
    adp.run(); 

Trong mã này đầu tiên một handler được tạo ra mà chỉ đơn giản in ra sân phát hiện. AudioDispatcher được gắn vào micrô mặc định và có bộ đệm 2048. Bộ xử lý âm thanh phát hiện quảng cáo chiêu hàng được thêm vào AudioDispatcher. Trình xử lý cũng được sử dụng ở đó.

Dòng cuối cùng bắt đầu quá trình.

+0

Cảm ơn bạn rất nhiều! – STELLARWIND

+0

Cảm ơn @ Joren Tôi thực sự đánh giá cao công việc bạn đã thực hiện trên Tarsos. Với tư cách là người đứng đầu những người khác, System.out.println() thiếu dấu "+" và tôi cần thêm một tỷ lệ mẫu làm đối số đầu tiên vào .fromDefaultMicrophone() – Sam