Hướng dẫn how do you sample a sound signal in python? - làm thế nào để bạn lấy mẫu tín hiệu âm thanh trong python?

Có rất nhiều dữ liệu âm nhạc và giọng nói ngoài kia. Ngoài ra còn có các ứng dụng thú vị để đi với họ. Chúng tôi chỉ cho bạn cách hình dung â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à nhà ở trên thế giới. Chúng phần lớn được phát triển trên đầu các mô hình phân tích dữ liệu thoại và trích xuất thông tin từ nó.

Có một loạt các ứ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 tôi 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ẽ sơ đồ phổ sóng và phổ tần số của tệp âm thanh.

Bài viết này nhằm vào những người có thêm một chút nền tảng trong 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 để tăng tốc độ khoa học dữ liệu, hãy xem bản nhạc này.

Mở tệp WAV

Các tập tin âm thanh có nhiều định dạng khác nhau. Bạn có thể quen thuộc với MP3, sử dụng nén mất để lưu trữ dữ liệu. Các định dạng như FLAC sử dụng nén lossless, cho phép dữ liệu gốc được xây dựng lại hoàn hảo từ dữ liệu được 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. Các kích thước tập tin có thể trở nên lớn như một hệ quả.

Tệp âm thanh mà chúng tôi sẽ xem là một tiếng leng keng lạc quan bắt đầu bằng một cây đàn piano. Những âm thanh khác như tiếng chuông và tiếng vỗ tay xuất hiện trong suốt tiếng leng keng, với một phần guitar sprumming ở hai điểm trong đường đua. Nó đáng để đề cập đến các tính năng này trong bản ghi âm vì chúng tôi có thể xác định một số trong số này sau khi chúng tôi vẽ hình 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:

>>> import wave
>>> wav_obj = wave.open('file.wav', 'rb')

Chế độ '

>>> sample_freq = wav_obj.getframerate()
>>> sample_freq
44100
1' trả về đối tượng
>>> sample_freq = wav_obj.getframerate()
>>> sample_freq
44100
2. Sử dụng '
>>> sample_freq = wav_obj.getframerate()
>>> sample_freq
44100
3' để mở tệp trả về một đối tượng
>>> sample_freq = wav_obj.getframerate()
>>> sample_freq
44100
4, 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
>>> sample_freq = wav_obj.getframerate()
>>> sample_freq
44100
5 để mở tệp như chúng tôi chứng minh ở đây. Nếu bạn quan tâm đến việc tìm hiểu thêm về cách xử lý một số lượng lớn các tệp, hãy xem bài viết này.

Sóng âm là một đại lượng liên tục cần được lấy mẫu vào một thời điểm để số hóa nó. Tốc độ lấy mẫu định lượng có bao nhiêu mẫu của â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:

>>> sample_freq = wav_obj.getframerate()
>>> sample_freq
44100

Tần số mẫu định lượng số lượng mẫu mỗi giây. Trong trường hợp này, nó là 44.100 lần mỗi giây, tương ứng với chất lượng CD. Số lượng khung riêng lẻ hoặc mẫu được đưa ra bởi:

>>> n_samples = wav_obj.getnframes()
>>> n_samples
5384326

Bây giờ chúng ta có thể tính toán thời gian tệp âm thanh của chúng ta trong vài giây:

>>> t_audio = n_samples/sample_freq
>>> t_audio
122.09356009070295

Tệp âm thanh được ghi lại trong âm thanh nổi, nghĩa là trong hai kênh âm thanh độc lập. Điều này tạo ra ấn tượng về âm thanh đến từ hai hướng khác nhau. Chúng tôi có thể kiểm tra số lượng kênh như sau:

>>> n_channels = wav_obj.getnchannels()
>>> n_channels
2

Bước tiếp theo là có được 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

>>> sample_freq = wav_obj.getframerate()
>>> sample_freq
44100
6, có một đối số, n, xác định số lượng khung hình cần đọc:

>>> signal_wave = wav_obj.readframes(n_samples)

Phương thức này trả về một đối tượng byte. Kiểm tra bản thân bằng cách sử dụng chức năng tích hợp

>>> sample_freq = wav_obj.getframerate()
>>> sample_freq
44100
7 trên đối tượng
>>> sample_freq = wav_obj.getframerate()
>>> sample_freq
44100
8. Để nhận được giá trị tín hiệu từ điều này, chúng ta phải chuyển sang Numpy:

>>> import numpy as np
>>> signal_array = np.frombuffer(signal_wave, dtype=np.int16)

Đ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

>>> sample_freq = wav_obj.getframerate()
>>> sample_freq
44100
9, bạn nhận thấy nó có 10.768.652 yếu tố, chính xác là
>>> n_samples = wav_obj.getnframes()
>>> n_samples
5384326
0. Để chia dữ liệu thành các kênh riêng lẻ, chúng ta có thể sử dụng một thủ thuật cắt mảng nhỏ thông minh:

>>> l_channel = signal_array[0::2]
>>> r_channel = signal_array[1::2]

Bây giờ, các kênh bên trái và bên phải của chúng tôi được tách ra, cả hai đều chứa 5.384.326 số nguyên đại diện cho 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. Kiểm tra bài viết này về trực quan hóa dữ liệu được lưu trữ trong một

>>> n_samples = wav_obj.getnframes()
>>> n_samples
5384326
1.

Vẽ âm mưu biên độ tín hiệu

Trước khi chúng ta đưa ra các giá trị tín hiệu, chúng ta cần tính thời gian mà mỗi mẫu được lấy. Đâ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

>>> n_samples = wav_obj.getnframes()
>>> n_samples
5384326
2 từ
>>> n_samples = wav_obj.getnframes()
>>> n_samples
5384326
3 để tạo một loạt dấu thời gian:

>>> times = np.linspace(0, n_samples/sample_freq, num=n_samples)

Để vẽ sơ đồ, chúng tôi sẽ sử dụng lớp

>>> n_samples = wav_obj.getnframes()
>>> n_samples
5384326
4 từ
>>> n_samples = wav_obj.getnframes()
>>> n_samples
5384326
5. Nếu bạn cần một số tài liệu nền về âm mưu trong Python, chúng tôi có một số bài viết. Ở đây, Phần 1 và Phần 2 của phần giới thiệu về
>>> n_samples = wav_obj.getnframes()
>>> n_samples
5384326
5.

Để đơn giản, chúng tôi chỉ vẽ tín hiệu từ một kênh. Hãy để Lừa thiết lập hình và vẽ một chuỗi thời gian như sau:

>>> import matplotlib.pyplot as plt
>>> plt.figure(figsize=(15, 5))
>>> plt.plot(times, l_channel)
>>> plt.title('Left Channel')
>>> plt.ylabel('Signal Value')
>>> plt.xlabel('Time (s)')
>>> plt.xlim(0, t_audio)
>>> plt.show()

Điều này mở ra con số sau trong một cửa sổ mới:

Hướng dẫn how do you sample a sound signal in python? - làm thế nào để bạn lấy mẫu tín hiệu âm thanh trong python?

Chúng ta thấy biên độ tích tụ trong 6 giây đầu tiên, tại thời điểm đó, các hiệu ứng chuông và vỗ tay bắt đầu. Có hai lần tạm dừng ngắn gọn trong tiếng leng keng ở 31,5 và 44,5 giây, điều nà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, được nhìn thấy gần như trong tín hiệu, nơi phần guitar có biên độ thấp hơn. Sau đó, có một bên ngoài biên độ thấp hơn ở cuối đường đua.

Vẽ sơ đồ phổ tần số

Bây giờ, hãy để Lôi xem xét phổ tần số, còn được gọi là phổ. Đây là một biểu diễn trực quan của cường độ tín hiệu ở các tần số khác nhau, cho chúng ta thấy tần số nào thống trị bản ghi là một hàm của thời gian:

>>> sample_freq = wav_obj.getframerate()
>>> sample_freq
44100
0

Biểu đồ sau đây mở ra trong một cửa sổ mới:

Hướng dẫn how do you sample a sound signal in python? - làm thế nào để bạn lấy mẫu tín hiệu âm thanh trong python?

Trong mã âm mưu ở trên, VMIN và VMAX được chọn để đưa ra các tần số thấp hơn thống trị bản ghi này. Thật vậy, tần số chiếm ưu thế cho toàn bộ đường đua thấp hơn 2,5 kHz. 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à trong phạm vi tần số khoảng 10 kHz đến 15 kHz. Mỗi công cụ và hiệu ứng âm thanh có chữ ký riêng trong phổ tần số.

Đi đâu từ đây

Vẽ sơ đồ phổ sóng và phổ tần số với Python tạo thành một 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à gì? Và ở đây, chúng tôi chỉ nhìn vào một kênh. Một phần mở rộng khác của tài liệu ở đây là vẽ cả hai kênh và xem cách chúng so sánh. Hãy thử vẽ đồ thị sự khác biệt giữa các kênh và bạn thấy một số tính năng mới và thú vị bật ra khỏi dạng sóng và phổ tần số.

Làm thế nào để bạn lấy mẫu một tệp âm thanh trong Python?

Tôi đã tạo một số lớp tiện ích để thực hiện nó bằng cách sử dụng scipy matplotlib và numpy ...
Mở tệp và chuyển đổi nó thành mono ..
Cắt giây từ tệp âm thanh ..
Nhận giây của tệp âm thanh ..
xử lý tệp âm thanh bằng phương thức tùy chỉnh ..
Lưu trình bao bọc tệp qua Scipy. io. wav ..
Phổ với matplotlib. specgram ..

Làm thế nào để bạn vẽ một tín hiệu âm thanh trong Python?

Approach..
Nhập mô -đun matplotlib, numpy, wave và sys ..
Mở tệp âm thanh bằng sóng.....
Đọc tất cả các khung của sóng âm thanh đã mở bằng hàm readframes () ..
Lưu trữ tốc độ khung hình trong một biến bằng hàm getFramrate () ..
Cuối cùng, hãy vẽ trục x trong vài giây bằng tốc độ khung hình ..

Làm cách nào để nhận được đầu vào âm thanh trong Python?

Lấy đầu vào giọng nói từ người dùng trong Python bằng pyaudio - sporde_recognizer..
Lấy đầu vào từ mic ..
Chuyển đổi giọng nói hoặc lời nói thành văn bản ..
Lưu trữ văn bản trong một biến/hoặc bạn có thể trực tiếp lấy nó làm đầu vào của người dùng ..

Làm thế nào để Python nhận ra âm thanh?

Nhận dạng các từ nói pyaudio - nó có thể được cài đặt bằng cách sử dụng lệnh pip install pyaudio.Bài phát biểu nhận thức - Gói này có thể được cài đặt bằng cách sử dụng PIP InstallingRec nhận thức.Google-Speech-API-Nó có thể được cài đặt bằng cách sử dụng lệnh PIP cài đặt Google-API-Python-client.Pyaudio − It can be installed by using pip install Pyaudio command. SpeechRecognition − This package can be installed by using pip install SpeechRecognition. Google-Speech-API − It can be installed by using the command pip install google-api-python-client.