Thường là bước cơ bản nhất trong xử lý tín hiệu của tệp âm thanh, người ta muốn trực quan hóa tệp mẫu âm thanh dưới dạng dữ liệu chuỗi thời gian
Âm thanh âm thanh có thể được coi là một vectơ một chiều lưu trữ các giá trị số tương ứng với từng mẫu. Biểu đồ chuỗi thời gian là biểu đồ hai chiều của các giá trị mẫu đó dưới dạng hàm của thời gian
Thư viện SciPy của Python đi kèm với một tập hợp các mô-đun để đọc và ghi dữ liệu sang nhiều định dạng tệp khác nhau. Ví dụ, scipy. io. mô-đun wavfile có thể được sử dụng để đọc và ghi vào một. tập tin định dạng wav
Đối với phần trình diễn sau đây, các tệp âm thanh mẫu được cung cấp trong URL này được sử dụng cho tác vụ trực quan hóa
Chức năng đọc trong scipy. io. mô-đun wavefile có thể được sử dụng để mở tệp wav đã chọn. Nó trả về tỷ lệ mẫu và các mẫu dữ liệu
Vẽ sơ đồ và trực quan hóa tệp âm thanh là một trong những quy trình quan trọng nhất trong phân tích âm thanh. Phân tích âm thanh là quá trình biến đổi, khám phá và diễn giải các tín hiệu âm thanh được ghi bởi các thiết bị kỹ thuật số để trích xuất thông tin chi tiết từ dữ liệu âm thanh
Trong bài viết này, chúng ta sẽ vẽ biểu đồ dạng sóng của tệp âm thanh bằng matplotlib
điều kiện tiên quyết
- Python đã cài đặt
- Numpy cài đặt
- Đã cài đặt Matplotlib
- Nền tảng trong phân tích dữ liệu
Nhập mô-đun và thư viện
Bước đầu tiên, hãy nhập các mô-đun và thư viện mà chúng ta sẽ cần
import wave
import matplotlib.pyplot as plt
import numpy as np
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Chúng tôi sẽ sử dụng mô-đun wave và numpy để xử lý trước âm thanh. Chúng tôi sẽ sử dụng matplotlib để vẽ âm thanh
Đang tải tệp Âm thanh
Tệp âm thanh mà chúng tôi sẽ sử dụng là tệp sóng.
Hãy tải tệp sóng mà chúng ta muốn vẽ
obj = wave.open['audio_file.wav', 'rb']
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Nhận thông số âm thanh
Hãy in ra các thông số âm thanh như số kênh, độ rộng mẫu, v.v.
Chúng tôi sẽ sử dụng phương pháp
obj = wave.open['audio_file.wav', 'rb']
0 của mô-đun sóngprint['Parameters:', obj.getparams[]]
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
đầu ra. Thông số. _wave_params[nchannels=1, sampwidth=2, framerate=22050, nframes=81585, comptype='NONE', compname='không nén']
Bây giờ, hãy lấy các tham số mà chúng ta sẽ cần để vẽ âm thanh
- Tần số mẫu, đây là số lượng mẫu mỗi giây
sample_freq = obj.getframerate[]
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
- Số lượng mẫu, đây là tổng số mẫu hoặc khung hình trong tệp âm thanh
n_samples = obj.getnframes[]
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
- Sóng tín hiệu, đây là biên độ sóng là cường độ âm thanh
signal_wave = obj.readframes[-1]
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
- Độ dài âm thanh, đây là thời lượng của âm thanh
duration = n_samples/sample_freq
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Tạo đối tượng numpy
Hãy tạo một đối tượng gọn gàng từ signal_wave. Điều này sẽ được vẽ trên trục y
________số 8
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Hãy tạo một đối tượng gọn gàng từ thời lượng. Điều này sẽ được vẽ trên trục x
time = np.linspace[0, duration, num=n_samples]
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Tạo một cốt truyện âm thanh
obj = wave.open['audio_file.wav', 'rb']
0Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
đầu ra
Sự kết luận
Trong bài viết này, chúng ta đã học cách vẽ biểu đồ dạng sóng của tệp âm thanh. Ngoài việc vẽ biểu đồ dạng sóng, một biểu đồ khác mà chúng ta có thể nhận được từ tệp âm thanh là phổ tần số. Đối với phổ tần số, chúng tôi vẽ tần số mẫu theo thời gian. Để tìm hiểu cách vẽ phổ tần số, hãy xem liên kết này
Có rất nhiều dữ liệu âm nhạc và giọng nói. Ngoài ra còn có các ứng dụng thú vị đi kèm với chúng. Chúng tôi chỉ cho bạn cách trực quan hóa âm thanh trong Python
Việc phân tích dữ liệu âm thanh đã trở nên phù hợp hơn bao giờ hết trong thời gian gần đây. Các sản phẩm trợ lý ảo phổ biến đã được phát hành bởi các công ty công nghệ lớn và những sản phẩm này đang trở nên phổ biến hơn trong điện thoại thông minh và gia đình trên khắp thế giới. Chúng phần lớn được phát triển dựa trên các mô hình phân tích dữ liệu giọng nói và trích xuất thông tin từ đó
Có rất nhiều ứng dụng sử dụng phân tích dữ liệu âm thanh và đây là một chủ đề phong phú để khám phá. Trong bài viết này, chúng ta sẽ tập trung vào một phần cơ bản của quy trình phân tích dữ liệu âm thanh – vẽ biểu đồ dạng sóng và phổ tần số của tệp âm thanh
Bài viết này hướng đến những người có kiến thức cơ bản hơn một chút về phân tích dữ liệu. Nếu bạn là người mới bắt đầu và đang tìm kiếm một số tài liệu để bắt kịp tốc độ trong khoa học dữ liệu, hãy xem bản nhạc này
Mở tệp WAV
Các tệp âm thanh có nhiều định dạng. Có thể bạn đã quen thuộc với MP3, sử dụng phương pháp nén mất dữ liệu để lưu trữ dữ liệu. Các định dạng như FLAC sử dụng nén không mất dữ liệu, cho phép dữ liệu gốc được tái tạo hoàn hảo từ dữ liệu nén. Tệp âm thanh của chúng tôi ở định dạng WAV [Tệp âm thanh dạng sóng], không nén. Do đó, kích thước tệp có thể trở nên lớn
Tệp âm thanh mà chúng ta sẽ xem xét là một bản nhạc lạc quan bắt đầu bằng tiếng đàn piano. Các âm thanh khác như tiếng chuông và tiếng vỗ tay phát ra trong suốt đoạn nhạc leng keng, với phần guitar gảy ở hai điểm trong bản nhạc. Điều đáng nói là các tính năng này trong bản ghi âm thanh vì chúng tôi có thể xác định một số tính năng này sau này khi chúng tôi vẽ biểu đồ dạng sóng và phổ tần số
Để mở tệp WAV của chúng tôi, chúng tôi sử dụng mô-đun sóng trong Python, có thể được nhập và gọi như sau
obj = wave.open['audio_file.wav', 'rb']
1Chế độ '
obj = wave.open['audio_file.wav', 'rb']
21' trả về một đối tượng obj = wave.open['audio_file.wav', 'rb']
22. Sử dụng 'obj = wave.open['audio_file.wav', 'rb']
23' để mở tệp trả về đối tượng obj = wave.open['audio_file.wav', 'rb']
24, đối tượng này có các phương thức khác với đối tượng cũ. Bạn cũng có thể sử dụng câu lệnh obj = wave.open['audio_file.wav', 'rb']
25 để mở tệp như chúng tôi minh họa ở đây. Nếu bạn muốn tìm hiểu thêm về cách lập trình xử lý số lượng lớn tệp, hãy xem bài viết nàySóng âm thanh là một đại lượng liên tục cần được lấy mẫu tại một khoảng thời gian nào đó để số hóa nó. Tốc độ lấy mẫu định lượng có bao nhiêu mẫu âm thanh được lấy mỗi giây. Chúng tôi có thể truy cập thông tin này bằng phương pháp sau
obj = wave.open['audio_file.wav', 'rb']
2Tần số mẫu định lượng số lượng mẫu mỗi giây. Trong trường hợp này là 44.100 lần/giây, tương ứng với chất lượng của đĩa CD. Số lượng khung hình riêng lẻ hoặc mẫu được cung cấp bởi
obj = wave.open['audio_file.wav', 'rb']
8Giờ đây, chúng tôi có thể tính toán thời lượng tệp âm thanh của mình tính bằng giây
obj = wave.open['audio_file.wav', 'rb']
9Tệp âm thanh được ghi ở dạng âm thanh nổi, nghĩa là ở hai kênh âm thanh độc lập. Điều này tạo ấn tượng về âm thanh phát ra từ hai hướng khác nhau. Ta có thể kiểm tra số lượng kênh như sau
obj = wave.open['audio_file.wav', 'rb']
0Bước tiếp theo là lấy các giá trị của tín hiệu, nghĩa là biên độ của sóng tại thời điểm đó. Để làm điều này, chúng ta có thể sử dụng phương thức
obj = wave.open['audio_file.wav', 'rb']
26, phương thức này nhận một đối số, n, xác định số lượng khung sẽ đọcobj = wave.open['audio_file.wav', 'rb']
2Phương thức này trả về một đối tượng bytes. Tự kiểm tra bằng cách sử dụng hàm tích hợp sẵn
obj = wave.open['audio_file.wav', 'rb']
27 trên đối tượng obj = wave.open['audio_file.wav', 'rb']
28. Để có được các giá trị tín hiệu từ điều này, chúng ta phải chuyển sang numpyobj = wave.open['audio_file.wav', 'rb']
5Điều này trả về tất cả dữ liệu từ cả hai kênh dưới dạng mảng 1 chiều. Nếu bạn kiểm tra hình dạng của
obj = wave.open['audio_file.wav', 'rb']
29, bạn sẽ nhận thấy nó có 10.768.652 phần tử, chính xác là obj = wave.open['audio_file.wav', 'rb']
80. Để chia dữ liệu thành các kênh riêng lẻ, chúng ta có thể sử dụng thủ thuật lát mảng nhỏ thông minhobj = wave.open['audio_file.wav', 'rb']
8Bây giờ, các kênh trái và phải của chúng ta được tách ra, cả hai đều chứa 5.384.326 số nguyên biểu thị biên độ của tín hiệu
Tiếp theo, chúng tôi hiển thị một số ví dụ về cách vẽ các giá trị tín hiệu. Chúng tôi có dữ liệu được lưu trữ trong các mảng ở đây, nhưng đối với nhiều ứng dụng khoa học dữ liệu, gấu trúc rất hữu ích. Xem bài viết này về trực quan hóa dữ liệu được lưu trữ trong một
obj = wave.open['audio_file.wav', 'rb']
81Vẽ biên độ tín hiệu
Trước khi vẽ các giá trị tín hiệu, chúng ta cần tính thời gian lấy từng mẫu. Đây chỉ đơn giản là tổng chiều dài của bản nhạc tính bằng giây, chia cho số lượng mẫu. Chúng ta có thể sử dụng
obj = wave.open['audio_file.wav', 'rb']
82 từ obj = wave.open['audio_file.wav', 'rb']
83 để tạo một mảng dấu thời gianprint['Parameters:', obj.getparams[]]
2Để vẽ đồ thị, chúng ta sẽ sử dụng lớp
obj = wave.open['audio_file.wav', 'rb']
84 từ obj = wave.open['audio_file.wav', 'rb']
85. Nếu bạn cần một số tài liệu cơ bản về vẽ đồ thị trong Python, chúng tôi có một số bài viết. Đây là phần 1 và phần 2 của phần giới thiệu về obj = wave.open['audio_file.wav', 'rb']
85Để đơn giản, chúng tôi chỉ vẽ tín hiệu từ một kênh. Hãy thiết lập hình và vẽ một chuỗi thời gian như sau
print['Parameters:', obj.getparams[]]
6Thao tác này sẽ mở hình sau trong một cửa sổ mới
Chúng tôi thấy biên độ tăng lên trong 6 giây đầu tiên, tại thời điểm đó, hiệu ứng chuông và tiếng vỗ tay bắt đầu. Có hai khoảng dừng ngắn trong tiếng leng keng ở 31. 5 và 44. 5 giây, thể hiện rõ trong các giá trị tín hiệu. Sau lần tạm dừng thứ hai, nhạc cụ chính xen kẽ giữa guitar và piano, điều này có thể nhìn thấy đại khái trong tín hiệu, trong đó phần guitar có biên độ thấp hơn. Sau đó, có một phần ngoại truyện có biên độ thấp hơn ở cuối bản nhạc
Vẽ phổ tần số
Bây giờ, chúng ta hãy xem phổ tần số, còn được gọi là biểu đồ phổ. Đây là biểu diễn trực quan về cường độ tín hiệu ở các tần số khác nhau, cho chúng ta biết tần số nào chiếm ưu thế trong bản ghi dưới dạng hàm của thời gian
obj = wave.open['audio_file.wav', 'rb']
20Cốt truyện sau đây mở ra trong một cửa sổ mới
Trong mã đồ thị ở trên, vmin và vmax được chọn để đưa ra các tần số thấp hơn chiếm ưu thế trong bản ghi này. Thật vậy, tần số chiếm ưu thế cho toàn bộ bản nhạc thấp hơn 2. 5kHz. Bạn thấy hiệu ứng của các nhạc cụ và hiệu ứng âm thanh khác nhau, đặc biệt là ở dải tần khoảng 10 kHz đến 15 kHz. Mỗi nhạc cụ và hiệu ứng âm thanh có chữ ký riêng trong phổ tần số
Đi đâu từ đây
Vẽ biểu đồ dạng sóng và phổ tần số bằng Python tạo thành nền tảng để phân tích sâu hơn về dữ liệu âm thanh. Có lẽ bạn có thể định lượng thêm tần số của từng phần của bản ghi. Tần số trung bình của phần guitar so với phần piano là bao nhiêu? . Một phần mở rộng khác của tài liệu ở đây là vẽ sơ đồ cả hai kênh và xem chúng so sánh như thế nào. Hãy thử vẽ sơ đồ sự khác biệt giữa các kênh và bạn sẽ thấy một số tính năng mới và thú vị xuất hiện từ dạng sóng và phổ tần số