Em yêu của tôi, theo như tôi hiểu những gì bạn đang tìm kiếm, bạn đang tham gia vào một trường lý thuyết gọi là Xử lý tín hiệu số [DSP]. Khu vực kỹ thuật này xuất phát từ một phân tích đơn giản về các tín hiệu thời gian rời rạc đến các bộ lọc thích ứng phức tạp. Một ý tưởng hay là nghĩ về các tín hiệu thời gian rời rạc như một vectơ, trong đó mỗi yếu tố của vectơ này là giá trị được lấy mẫu của tín hiệu thời gian liên tục ban đầu. Khi bạn nhận được các mẫu ở dạng vector, bạn có thể áp dụng các kỹ thuật tín hiệu số khác nhau cho vectơ này.
Thật không may, trên Python, việc chuyển từ các tệp âm thanh sang vectơ mảng numpy khá cồng kềnh, như bạn có thể nhận thấy ... nếu bạn không thần tượng hóa ngôn ngữ lập trình khác, tôi khuyên bạn nên thử MATLAB/OCTAVE. MATLAB làm cho các mẫu truy cập từ các tập tin đơn giản. audioread[]
làm cho nhiệm vụ này cho bạn :] và có rất nhiều hộp công cụ được thiết kế dành riêng cho DSP.
Tuy nhiên, nếu bạn thực sự có ý định tham gia vào Python cho việc này, tôi sẽ cung cấp cho bạn một bước để hướng dẫn bạn.
1. Nhận các mẫu
Cách dễ nhất lấy các mẫu từ tệp .wav
là:
from scipy.io import wavfile
sampling_rate, samples = wavfile.read[f'/path/to/file.wav']
Ngoài ra, bạn có thể sử dụng gói wave
và struct
để lấy mẫu:
import numpy as np
import wave, struct
wav_file = wave.open[f'/path/to/file.wav', 'rb']
# from .wav file to binary data in hexadecimal
binary_data = wav_file.readframes[wav_file.getnframes[]]
# from binary file to samples
s = np.array[struct.unpack['{n}h'.format[n=wav_file.getnframes[]*wav_file.getnchannels[]], binary_data]]
Trả lời câu hỏi của bạn: binary_data
là một đối tượng
import numpy as np
import wave, struct
wav_file = wave.open[f'/path/to/file.wav', 'rb']
# from .wav file to binary data in hexadecimal
binary_data = wav_file.readframes[wav_file.getnframes[]]
# from binary file to samples
s = np.array[struct.unpack['{n}h'.format[n=wav_file.getnframes[]*wav_file.getnchannels[]], binary_data]]
0, không thể đọc được của con người và chỉ có thể có ý nghĩa với một máy. Bạn có thể xác thực câu lệnh này gõ import numpy as np
import wave, struct
wav_file = wave.open[f'/path/to/file.wav', 'rb']
# from .wav file to binary data in hexadecimal
binary_data = wav_file.readframes[wav_file.getnframes[]]
# from binary file to samples
s = np.array[struct.unpack['{n}h'.format[n=wav_file.getnframes[]*wav_file.getnchannels[]], binary_data]]
1. Nếu bạn thực sự muốn hiểu thêm một chút về một loạt các nhân vật kỳ lạ này, bấm vào đây.Nếu âm thanh của bạn là âm thanh nổi [nghĩa là có 2 kênh], bạn có thể định hình lại tín hiệu này để đạt được định dạng tương tự thu được với
import numpy as np
import wave, struct
wav_file = wave.open[f'/path/to/file.wav', 'rb']
# from .wav file to binary data in hexadecimal
binary_data = wav_file.readframes[wav_file.getnframes[]]
# from binary file to samples
s = np.array[struct.unpack['{n}h'.format[n=wav_file.getnframes[]*wav_file.getnchannels[]], binary_data]]
2s_like_scipy = s.reshape[-1, wav_file.getnchannels[]]
Mỗi cột là một Chanell. Dù bằng cách nào, các mẫu thu được từ tệp .wav
có thể được sử dụng để vẽ và hiểu hành vi tạm thời của tín hiệu.
Trong cả hai lựa chọn thay thế, các mẫu thu được từ các tệp được biểu diễn trong điều chế mã xung tuyến tính [LPCM]
2. Thực hiện các công cụ xử lý tín hiệu số vào các mẫu âm thanh
Tôi sẽ để phần đó cho bạn :] nhưng đây là một cuốn sách hay để đưa bạn qua DSP. Thật không may, tôi không biết những cuốn sách hay với Python, chúng thường là những cuốn sách khủng khiếp ... nhưng đừng lo lắng về điều đó, lý thuyết có thể được áp dụng theo cách sử dụng bất kỳ ngôn ngữ lập trình nào, miễn là bạn phạm vi ngôn ngữ đó.
Bất kể cuốn sách nào bạn chọn, hãy gắn bó với các tác giả cổ điển, chẳng hạn như Proakis, Oppenheim, v.v. không quan tâm đến chương trình ngôn ngữ mà họ sử dụng. Để biết hướng dẫn thực tế hơn về DPS để sử dụng Python, hãy xem trang này.
3. Phát các mẫu âm thanh được lọc
import pyaudio
p = pyaudio.PyAudio[]
stream = p.open[format = p.get_format_from_width[wav_file.getsampwidth[]],
channels = wav_file.getnchannels[],
rate = wav_file.getframerate[],
output = True]
# from samples to the new binary file
new_binary_data = struct.pack['{}h'.format[len[s]], *s]
stream.write[new_binary_data]
trong đó
import numpy as np
import wave, struct
wav_file = wave.open[f'/path/to/file.wav', 'rb']
# from .wav file to binary data in hexadecimal
binary_data = wav_file.readframes[wav_file.getnframes[]]
# from binary file to samples
s = np.array[struct.unpack['{n}h'.format[n=wav_file.getnframes[]*wav_file.getnchannels[]], binary_data]]
4 là số byte trên mỗi mẫu và import numpy as np
import wave, struct
wav_file = wave.open[f'/path/to/file.wav', 'rb']
# from .wav file to binary data in hexadecimal
binary_data = wav_file.readframes[wav_file.getnframes[]]
# from binary file to samples
s = np.array[struct.unpack['{n}h'.format[n=wav_file.getnframes[]*wav_file.getnchannels[]], binary_data]]
5 là tỷ lệ lấy mẫu. Chỉ cần sử dụng cùng một tham số của âm thanh đầu vào.4. Lưu kết quả trong tệp .wav
mới
wav_file=wave.open['/phat/to/new_file.wav', 'w']
wav_file.setparams[[nchannels, sampwidth, sampling_rate, nframes, "NONE", "not compressed"]]
for sample in s:
wav_file.writeframes[struct.pack['h', int[sample]]]
Trong đó
import numpy as np
import wave, struct
wav_file = wave.open[f'/path/to/file.wav', 'rb']
# from .wav file to binary data in hexadecimal
binary_data = wav_file.readframes[wav_file.getnframes[]]
# from binary file to samples
s = np.array[struct.unpack['{n}h'.format[n=wav_file.getnframes[]*wav_file.getnchannels[]], binary_data]]
7 là số lượng kênh, import numpy as np
import wave, struct
wav_file = wave.open[f'/path/to/file.wav', 'rb']
# from .wav file to binary data in hexadecimal
binary_data = wav_file.readframes[wav_file.getnframes[]]
# from binary file to samples
s = np.array[struct.unpack['{n}h'.format[n=wav_file.getnframes[]*wav_file.getnchannels[]], binary_data]]
8 là số byte trên mỗi mẫu, import numpy as np
import wave, struct
wav_file = wave.open[f'/path/to/file.wav', 'rb']
# from .wav file to binary data in hexadecimal
binary_data = wav_file.readframes[wav_file.getnframes[]]
# from binary file to samples
s = np.array[struct.unpack['{n}h'.format[n=wav_file.getnframes[]*wav_file.getnchannels[]], binary_data]]
9 là tỷ lệ lấy mẫu, s_like_scipy = s.reshape[-1, wav_file.getnchannels[]]
0 là tổng số mẫu. ________ 21 Lớp
s_like_scipy = s.reshape[-1, wav_file.getnchannels[]]
2 giúp bạn dễ dàng nhập và thao tác các tệp âm thanh bằng Python.Trong bài tập này, chúng tôi sẽ nhập một tệp âm thanh quan tâm bằng cách tạo một thể hiện là
s_like_scipy = s.reshape[-1, wav_file.getnchannels[]]
2.Để nhập tệp âm thanh, bạn có thể sử dụng chức năng
s_like_scipy = s.reshape[-1, wav_file.getnchannels[]]
4 trên s_like_scipy = s.reshape[-1, wav_file.getnchannels[]]
2 và chuyển tên đường dẫn của tệp âm thanh đích của bạn dưới dạng chuỗi. Tham số s_like_scipy = s.reshape[-1, wav_file.getnchannels[]]
6 cung cấp cho bạn một tùy chọn để chỉ định định dạng của tệp âm thanh của bạn, tuy nhiên, đây là tùy chọn vì s_like_scipy = s.reshape[-1, wav_file.getnchannels[]]
1 sẽ tự động suy ra nó.s_like_scipy = s.reshape[-1, wav_file.getnchannels[]]
1 hoạt động với các tệp .wav
mà không có bất kỳ phụ thuộc bổ sung nào nhưng đối với các loại tệp khác như import pyaudio
p = pyaudio.PyAudio[]
stream = p.open[format = p.get_format_from_width[wav_file.getsampwidth[]],
channels = wav_file.getnchannels[],
rate = wav_file.getframerate[],
output = True]
# from samples to the new binary file
new_binary_data = struct.pack['{}h'.format[len[s]], *s]
stream.write[new_binary_data]
0, bạn sẽ cần cài đặt FFMPEG.Một tệp âm thanh mẫu đã được thiết lập là
import pyaudio
p = pyaudio.PyAudio[]
stream = p.open[format = p.get_format_from_width[wav_file.getsampwidth[]],
channels = wav_file.getnchannels[],
rate = wav_file.getframerate[],
output = True]
# from samples to the new binary file
new_binary_data = struct.pack['{}h'.format[len[s]], *s]
stream.write[new_binary_data]
1, bạn có thể nghe nó ở đây.