根据您的评论,您希望逐位处理二进制数据,将每一位转换为高音或低音。
你仍然需要准确地确定那些高音和低音是什么,以及每个声音的时长(以及两者之间是否有间隙,等等)。如果你让它变慢,比如每个声音 1/4 秒,那么你就是把它们当作音符。如果你让它非常快,比如 1/44100 秒,你就把它们当作样本。人耳在一秒钟内听不到 44100 种不同的声音;相反,它会听到高达 22050Hz 的单一声音。
一旦你做出了这些决定,你的问题就有两个部分。
首先,您必须生成一个样本流——例如,每秒包含 44100 个 16 位整数的流。对于非常简单的事情,比如以 44k 16 位单声道格式播放一段原始 PCM 文件,或者生成方波,这是微不足道的。对于更复杂的情况,例如播放一段 MP3 文件或从正弦波和滤波器合成声音,您需要一些帮助。该audioop
模块以及 stdlib 中的其他一些模块可以为您提供基础知识;除此之外,您还需要在 PyPI 中搜索合适的模块。
其次,您必须将该样本流发送到耳机插孔。Python 中没有对此的内置支持。在某些平台上,您只需打开一个特殊文件并写入即可。但是,更一般地说,您需要在 PyPI 上找到第三方库。
更简单的模块适用于一种特定类型的音频系统。Mac 和 Windows 各有自己的标准,而 Linux 有六种不同的标准。还有一些 Python 模块与更高级别的包装器通信;您可能必须安装和设置包装器,但是一旦您这样做了,您的代码就可以在任何系统上运行。
所以,让我们通过一个非常简单的例子来工作。假设您已经在系统上设置了 PortAudio,并且您已经安装了PyAudio来与它对话。这段代码将播放 441Hz 和 220.5Hz(略高于中 C 和低 C)的方波,持续时间不到 1/4 秒(因为这真的很容易)。
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)