Từ nhận xét của bạn, bạn muốn xử lý từng bit dữ liệu nhị phân, chuyển từng bit thành âm thanh cao hoặc thấp.
Bạn vẫn cần phải quyết định chính xác những âm thanh cao và thấp đó là gì và mỗi âm thanh dài bao nhiêu (và có khoảng trống ở giữa hay không). Nếu bạn làm cho nó chậm, như 1/4 của một giây cho mỗi âm thanh, sau đó bạn đang xử lý chúng như là ghi chú. Nếu bạn làm cho nó rất nhanh, như 1/44100 giây, bạn coi chúng là mẫu. Tai người không thể nghe được 44100 âm thanh khác nhau trong một giây; thay vào đó, nó nghe một âm thanh duy nhất lên đến 22050Hz.
Khi bạn đã đưa ra các quyết định đó, có hai phần trong vấn đề của bạn.
Trước tiên, bạn phải tạo luồng mẫu — ví dụ: một luồng gồm 44100 bit 16 bit cho mỗi giây. Đối với những thứ thực sự đơn giản, giống như chơi một đoạn tệp PCM thô ở định dạng đơn sắc 44 bit 16 bit hoặc tạo ra một wave vuông, điều này là tầm thường. Đối với các trường hợp phức tạp hơn, như chơi một đoạn tệp MP3 hoặc tổng hợp âm thanh ra khỏi sóng và bộ lọc sin, bạn sẽ cần một số trợ giúp. Các mô-đun audioop
, và một vài người khác trong stdlib, có thể cung cấp cho bạn những điều cơ bản; ngoài ra, bạn sẽ cần phải tìm kiếm PyPI cho các mô-đun phù hợp.
Thứ hai, bạn phải gửi luồng mẫu đó đến giắc cắm tai nghe. Không có hỗ trợ tích hợp cho điều này trong Python. Trên một số nền tảng, bạn có thể thực hiện việc này chỉ bằng cách mở một tệp đặc biệt và ghi vào đó. Nhưng, nói chung, bạn sẽ cần phải tìm một thư viện của bên thứ ba trên PyPI.
Mô-đun đơn giản hơn hoạt động cho một loại hệ thống âm thanh cụ thể. Mac và Windows đều có tiêu chuẩn riêng của họ, và Linux có một nửa tá các chuẩn khác nhau. Ngoài ra còn có một số mô-đun Python nói chuyện với trình bao bọc cấp cao hơn; bạn có thể phải cài đặt và thiết lập trình bao bọc, nhưng một khi bạn làm điều đó, mã của bạn sẽ hoạt động trên bất kỳ hệ thống nào.
Vì vậy, hãy làm việc thông qua một ví dụ thực sự đơn giản. Giả sử bạn đã cài đặt PortAudio trên hệ thống của mình và bạn đã cài đặt PyAudio để nói chuyện với nó. Mã này sẽ phát sóng vuông là 441Hz và 220.5Hz (ngay phía trên giữa C và C thấp) chỉ trong 1/4 giây (chỉ vì điều đó thực sự dễ dàng).
import binascii
a = open('/Users/kyle/Desktop/untitled folder/unix commands.txt', 'r')
c = a.read()
b = bin(int(binascii.hexlify(c), 16))
sample_stream = []
high_note = (b'\xFF'*100 + b'\0'*100) * 50
low_note = (b'\xFF'*50 + b'\0'*50) * 100
for bit in b[2:]:
if bit == '1':
sample_stream.extend(high_note)
else:
sample_stream.extend(low_note)
sample_buffer = b''.join(sample_stream)
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(8),
channels=1,
rate=44100,
output=True)
stream.write(sample_buffer)
Đầu tiên, "tệp văn bản chứa nhị phân" là gì. "Tệp văn bản" là tệp chứa văn bản thay vì dữ liệu nhị phân; tệp nhị phân là tệp có chứa dữ liệu nhị phân, thay vì văn bản. – abarnert
Thứ hai, bạn muốn loại mã hóa nào? Bạn có muốn đọc từng byte, chuyển đổi nó thành số nguyên thập phân từ 0-255 và tổng hợp giọng nói nói số đó không? Hoặc sử dụng từng cặp byte dưới dạng mẫu đơn 16 bit để phát ở 44,1k? Hoặc xử lý 7 bit dưới cùng của mỗi byte dưới dạng số ghi chú MIDI để phát ở 64 ghi chú/giây? Hay cái gì? – abarnert
Cảm ơn sự điều chỉnh, điều đó thật khó hiểu. –