Chuyển đổi phổ mel thành chương trình phổ


8

Tôi có một tập hợp các bài hát mà tôi đã trích xuất STFT (Biến đổi Fourier thời gian ngắn) và sử dụng phổ cường độđể tính toán phổ mel bằng cách sử dụng ma trận mel lọcbank , do đó . Tôi muốn biết có phương pháp nào để đảo ngược quá trình này, tức là chuyển đổi từ phổ mel trở lại phổ. Tôi đã thực hiện một số giảm kích thước trên phổ mel và lập lại cấu trúc phổ mel từ các chiều thấp hơn. Bây giờ tôi muốn tạo lại tín hiệu âm thanh từ phổ melon được tái tạo, vì vậy tôi đoán đầu tiên tái cấu trúc lại phổ và sau đó là tín hiệu âm thanh.|S|MX=log(M×|S|)

Vấn đề là ma trận ngân hàng bộ lọc mel không phải là ma trận vuông, vì chúng tôi giảm không có thùng tần số, vì vậy nghịch đảo của không thể được sử dụng như thế này: . Vì vậy, có cách nào để tạo ánh xạ nghịch đảo, như một số hàm truyền ngược có thể chuyển đổi từ sangMS^= =M-1điểm kinh nghiệm(X)XS?


Điều này chỉ đơn giản là không thể trừ khi bạn có một mô hình trước rất mạnh về những gì nguồn của bạn nghe giống như vậy. Không có bất kỳ thông tin trước nào về nguồn của bạn, thực sự có nhiều quang phổ khác nhau có thể được "thu gọn" thành cùng một tập hợp các hệ số tần số mel.
pichenettes

@pichenettes: Sau đó, làm thế nào để xây dựng lại bài hát gốc, tôi hy vọng bạn đã hiểu vấn đề. Tôi có một mel-Spectrogram, và một phiên bản được xây dựng lại từ các kích thước thấp hơn. Thay vì báo cáo rằng "lỗi là" về mặt số liệu, nếu có cách nào đó tôi có thể "nghe" được phổ melon được tái tạo, thì tôi có thể nói rằng sau khi giảm kích thước, bằng cách giữ lại ít thành phần hơn và tái tạo lại mel -spectrogram, đây là cách âm thanh.
user76170

2
Nó chỉ đơn giản là không thể trong trường hợp chung. Nó giống như có 5 số và hỏi làm thế nào để "tái cấu trúc" các số tạo thành tổng của chúng.
pichenettes

Chúng tôi muốn tạo hệ thống điều khiển giọng nói trên matlab nhưng chúng tôi không biết làm thế nào chúng tôi có thể làm điều này. Chúng tôi có dữ liệu giọng nói nhưng làm thế nào chúng tôi có thể đưa dữ liệu này vào Matlab. ví dụ: tệp Eight1.mel .... Eight.mel). Chúng tôi muốn nhận dạng số tiếng Anh âm thanh này trong matlab. 1-Tôi có phải chuyển đổi tập tin ".mel-waw" không? 2-Tôi có thể sử dụng mã nào? Nếu bạn giúp chúng tôi, chúng tôi sẽ đánh giá cao Cảm ơn Trân trọng

Câu trả lời:


5

Cả việc lấy một quang phổ cường độ và ngân hàng bộ lọc Mel đều là các quá trình tổn thất. Thông tin quan trọng cần thiết để xây dựng lại bản gốc sẽ bị mất. Do đó, bạn cần quay lại và sử dụng các mẫu âm thanh gốc để thực hiện việc xây dựng lại bằng cách xác định bộ lọc miền thời gian hoặc tần số tương đương với việc giảm kích thước của bạn.

Bạn có thể đưa ra các giả định về thông tin bị mất, nhưng bản thân các giả định đó thường nghe không chính xác, giả tạo và / hoặc robot. Hoặc bạn chỉ có thể sử dụng đầu vào được tổng hợp đặc biệt, trong đó các giả định sẽ chính xác theo thiết kế của đầu vào đó.


Có một chuyển đổi ngược tương đương cho ngân hàng Mel fiter? Tôi hiểu rằng đó là một quá trình mất mát. và chúng ta không thể tìm thấyM-1vì M không vuông. Tuy nhiên, có thể bỏ qua bước đó và trực tiếp thực hiện PCA trên phổ độ lớn | M | ? Cũng lưu trữ thông tin pha. Sau đó xây dựng lại | M |, kết hợp thông tin pha và lấy lại âm thanh gốc?
user76170

1

Như đã đề cập, nói chung không thể thực hiện chính xác. Giống như nếu bạn có 2d đại diện cho cảnh 3d, bên cạnh một chiếc ô tô, về nguyên tắc, bạn không thể nói nếu đó là phim hoạt hình rất mỏng giống như một chiếc xe hơi hoặc đó là hình ảnh của một chiếc xe thật nhưng nếu bạn cho rằng không ai cố gắng đánh lừa bạn, bạn có thể đưa ra một số giả định về dữ liệu thực, đây thực sự là cách các mô hình thế hệ máy học hoạt động.

Về chuyển đổi nghịch đảo, vì hầu hết các bộ lọc là trực giao (sản phẩm bên trong của chúng bằng 0), bạn có thể sử dụng chuyển vị của ngân hàng bộ lọc như một phép tính gần đúng của chuyển đổi nghịch đảo, tuy nhiên việc chia tỷ lệ dữ liệu sẽ sai khi bạn dễ dàng xác minh. Bạn có thể sử dụng một số thống kê về STFT gốc được trích xuất từ ​​một số tập dữ liệu lớn trên mỗi kênh (tần suất) và chuẩn hóaMTMxđể có thang đo 'đúng'. Khi nói đến việc tạo ra phổ đầy đủ chỉ từ tín hiệu cường độ, bạn có thể sử dụng thuật toán Griffin-Lin để thực hiện một số phép tính gần đúng. Bạn có thể sử dụng một cái gì đó như WaveNet hoặc Parallel Wavenet để làm điều đó mạnh mẽ hơn, vì nó đã được xác minh để hoạt động khá tốt với tín hiệu giọng nói và các tín hiệu âm thanh khác.


1

Ngày nay, điều dễ nhất sẽ là sử dụng librosacho nhiệm vụ này. Nó có chức năng mel_to_stft thực hiện chính xác những gì bạn muốn.

Như những người khác đã đề cập, việc tái thiết này là mất mát và chỉ có thể tìm thấy giải pháp gần đúng. Trong librosa, nó được thực hiện bằng thuật toán Cho thuê không âm .

Một điều cần lưu ý: nếu bạn đã trích xuất năng lượng mel bằng thuật toán của riêng mình, bạn phải đảm bảo rằng tần số cong vênh tương tự, nếu không, bạn sẽ kết thúc bằng âm thanh nghe có vẻ không phù hợp (giả sử rằng sau này bạn muốn tổng hợp dạng sóng từ STFT). Trong librosa có hai chức năng cong vênh, bạn có thể sử dụng chức năng thứ hai bằng cách chỉ định htk=True.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.