Hỏi về thư viện xử lý âm thanh trong C++

Em đang có đề tài về nhận diện người nói sử dụng C++. Sau một hồi nghiên cứu thì em tìm ra giải pháp là sử dụng trích rút MFCC và sử dụng GMM để có thể xác nhận tỉ lệ phần trăm người nói là ai.
Nhưng em cũng không rõ là nên sử dụng thư viện nào cho một số công việc như:

  • Yêu cầu Mic và ghi âm.
  • Đọc file âm thanh.
  • Trích rút MFCC
  • GMM
  • Xử lý nhiễu âm thanh.

Rất mong các tiền bối có thể giúp em hoàn thành được đồ án này ạ.
Em xin cảm ơn.

2 Likes

Mình sẽ giới thiệu 2 thư viện cơ bản sau.

  • Yêu cầu Mic và ghi âm.
  • Đọc file âm thanh.

Bass Audio

  • FFT & convolution

Project nayuki

Sau đó lấy các tín hiệu thu được. (Thực chất là một mảng float) tiếp tục xử lý các bước còn lại.

Vì đây à đồ án, nên bạn hãy tự implement thuật toán GMM và trích rút MFCC theo cách hiểu của mình như vậy mới gọi là bỏ công sức ra làm.

Còn nếu thấy khó quá thì làm trên matlab thôi, chứ mất công làm gì.

7 Likes

Cảm ơn bạn rất rất nhiều.

  • Không biết thư viện bass audio kia có hỗ trợ một số thứ về xử lý âm thanh như khử nhiêu hay gì hơn không vậy? vì hôm qua mình có lên stackoverFlow thì hỏi được dùng SFML để ghi âm.
  • Mình cũng khá muốn xử lý âm thanh đầu vào, không biết ngoài việc khử nhiễu thì có gì không ạ? Trước có làm về hình ảnh nó có khá nhiều thứ để làm trong việc xử lý ảnh đầu vào nhưng âm thanh thì không rõ ạ. Mà cái này có thư viện thì khá tốt vì nó cũng không ảnh hưởng tới báo cáo cho lắm.
    Mình ban đầu cũng định tự làm đồ án nhưng mà chưa liên lạc được với thầy hướng dẫn nên định hoàn thành cơ bản và sau đó lúc nào liên lạc lại được với thầy thì quay lại để xây dựng lại MFCC.
  • Cũng định tích hợp thêm SpeechToText và TextToSpeech của GG nữa nhưng mình tìm thấy nó bắt mình phải chi phí. Dùng trên Android thì gọi được thẳng,… nhưng với C++ thì mình cũng không rõ. Không biết bro có thể gợi ý thêm được không ạ???

Bạn có thể sử dụng kết hợp nhiều thư viện mà. Một thư viện đa năng thế thì đã bán bản quyền rồi. Kể cả BassAudio mà mình giới thiệu.

MFCC thì trên github cũng có nhiều. hoặc tham khảo Aquila. Cái này không có doccument nên hơi khó sử dụng.
Xử lý nhiễu thì Gausse or median filter, hoặc có thể tham khảo bài báo này.

Còn nếu bạn chỉ muốn gọi một số thư viện có sẵn kiểu như openCV thay vì hiểu từng phần để kết hợp lại thì bạn nên làm bằng Matlab rồi gen ra code cpp.

5 Likes

Wowww, giờ em mới biết có tool gen ra code cpp của matlab :smiley: … Tại ban đầu em định định hình cái ứng dụng ra đã, sau đó thêm thắt, tinh chỉnh lại sau ^^, Nhưng nếu ý kiến của bác vậy thì chắc chắn em sẽ làm luôn. Cho em hỏi em dùng SFML nó trả về 1 chuỗi số nguyên nhưng độc DOC nó chỉ ghi là “raw data” mà không rõ là gì - kiểu dữ liệu trả về cũng là kiểu số nguyên có âm dương (sf::Int16). Vậy nếu xử lý nhiễu, trích rút đặc trưng MFCC (dft, idft, log…) thì nó có hoạt động được không ạ? Tin hiệu âm thanh em khá là kém, mong bác giúp đỡ em.

Thêm vào đó em cũng đang tìm hiểu text to speech và speech to text để tích hợp như ứng dụng Android của google, mà vướng phải API nó yêu cầu trả phí. Vậy có phương hướng nào giải quyết không ạ?

image
chắc bạn chưa bao giờ đọc document của Matlab

Vẫn hoạt động nhưng bạn phải cast sang kiểu double và có thể tạo thêm struct Complex cho số phức. Việc cast qua double bạn có thể chia giá trị cho 32767 (Cách này cty mình từng sử dụng)
Bản chất của việc phân tích âm thanh không phụ thuộc nhiều vào biên độ, mà là tần số.

text to speech và speech to text thì mình không rõ, bạn nên mở câu hỏi khác với tag Android để hỏi.

3 Likes

Cho em hỏi một số thứ:

  • Tại sao lại là chia cho 32767 (em sợ lúc báo cáo các thầy hỏi lại ngu ngơ), và nếu em để nguyên kiểu Int16 có ảnh hưởng gì không?
  • Vì là MFCC cần chuyển qua thang đo mel mà thang đo mel lại cần có tần số để chuyển sang, em có gg tìm chuyển về tần số thì chỉ thấy tính tần số cả đoạn luôn “freq = i_max * Fs / N” (với i_max giá trị lớn nhất trong bin của độ dài vector thực ảo - cái này em cũng ko biết gọi ntn - sqrt(RealReal + ImagImag). Vậy có phải nếu em muốn lấy từng vi trí thì em chỉ việc thay cái max bằng từng điểm một không a? Fs là tần số lấy mẫu - em để thông thường là 46100Hz theo chuẩn thông thường, N là số mẫu của mỗi frame.
  • Tới phần lấy log, theo tài liệu em đọc họ đưa ra công thức log(|S(x)|) = log(|E(x)|) + log(|H(x)|) với E(x) là tần số thấp và H(x) là thành phần có tần số cao? em không biết lấy 2 thành phần như thế nào ??
    rất mong được anh giải đáp.

Em cảm ơn những thứ anh đã giúp em.
Thầy hướng dẫn dưa em đề tài “Nhận diên người nói sử dụng C++ trên linux” xong thầy mất tích luôn. Em không thể liên lạc được với thầy kể cả thực tập cũng chưa được thầy nói gì với SV để báo cáo.
Em định là tìm hiểu cách làm sao để nhận diện ra người nói trước, sau đó mô phỏng ra tạo thành một ứng dụng hoàn chỉnh đã, sau đó em mới định bắt tay vào nghiên cứu thuật toán chứ em cũng chả biết hướng làm như thế nào nữa.
Em cũng biết là người ta chuyển sang tần số với FFT (DFT) để xử lý tín hiệu. Nhưng em chưa hiểu con số 32767 mà ta phải chia cho Raw data (Int16) mà ta thu được ở miền thời gian, tiếng anh của em cũng không đủ tốt để đọc hiểu rõ ràng nên khi đọc cũng khá là khó hiểu một số chỗ. :frowning: em gần như là con số 0 để bắt đầu, em cũng GG ngày đêm để nghiêm cứu thêm. Nên có gì mong các anh trong Forum hỗ trơ. Em rất cảm ơn những chia sẻ trên.

Hi Lam Nam.
Mình không hiểu, và mình không có nhu cầu tìm hiểu. Bạn làm đồ án hay mình làm đồ án ? Cho tài liệu về đọc rồi còn cần người dịch hỗ cho nữa. Theo mình thấy bạn cần thay đổi tư duy thay vì đọc chép thì cần chủ động hơn tự học tự bơi dù kết quả không cao nhưng ít nhất cũng học được gì đó.

P/S Thường mình sẽ không xóa bài nhưng lần này thì khác.

Ok cảm ơn anh. Cảm ơn anh đã chia sẻ, và nếu em có sai sót gì trong ứng xử mong anh bỏ qua. Em đồng ý với anh là nên mình tự tìm hiểu, nếu không hiểu được thì chấp nhận kết quả. Chỉ là tính em hay tò mò thắc mắc khi khó quá mà thôi. Chúc anh một ngày tốt lành!

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?