2013-06-05 55 views
5

sử dụng C hoặc python (python preferred), Làm thế nào tôi mã hóa tệp nhị phân thành âm thanh sau đó được xuất ra mặc dù giắc cắm tai nghe, cũng như thế nào tôi giải mã âm thanh jack cắm microphone, cho đến nay tôi đã học cách bí mật một tập tin văn bản thành nhị phân sử dụng python, Nó sẽ tương tự như giao tiếp RTTY.mã hóa nhị phân thành python âm thanh hoặc C

Điều này để tôi có thể ghi dữ liệu vào băng cassette.

import binascii 

a = open('/Users/kyle/Desktop/untitled folder/unix commands.txt', 'r') 
f = open('/Users/kyle/Desktop/file_test.txt', 'w') 
c = a.read() 
b = bin(int(binascii.hexlify(c), 16)) 
f.write(b) 
f.close() 
+1

Đầ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

+0

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

+0

Cảm ơn sự điều chỉnh, điều đó thật khó hiểu. –

Trả lời

5

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) 
+0

đó là một số lời khuyên hữu ích tôi điều tra mô-đun 'audioop' kỹ lưỡng. –

+2

Phần giải mã là phần cứng ... :-) –

5

Vì vậy, bạn muốn truyền thông tin kỹ thuật số bằng âm thanh? Về cơ bản bạn muốn thực hiện một phần mềm MODEM (không quan trọng nếu nó là phần mềm thuần túy, nó vẫn được gọi là modem).

Modem (MOdulator-DEModulator) là thiết bị điều chỉnh tín hiệu sóng mang tương tự để mã hóa thông tin kỹ thuật số và cũng giải điều chế tín hiệu sóng mang để giải mã thông tin được truyền. Mục tiêu là tạo ra một tín hiệu có thể được truyền đi dễ dàng và giải mã để tái tạo dữ liệu số gốc. Modem có thể được sử dụng trên bất kỳ phương tiện truyền tín hiệu tương tự, từ điốt phát sáng đến radio. [wikipedia]

Có modem ở mọi nơi bạn cần truyền dữ liệu qua phương tiện tương tự, có thể là âm thanh, sóng ánh sáng hoặc sóng vô tuyến. Điều khiển từ xa của bạn có thể là modem hồng ngoại.

Các modem được thực hiện bằng phần mềm thuần túy được gọi là modem mềm. Hầu hết các soft-modem tôi thấy trong tự nhiên đang sử dụng một số hình thức FSK điều chế:

Tần ca keying (FSK) là một kiểu điều chế tần số trong đó thông tin kỹ thuật số được truyền qua những thay đổi tần số rời rạc của một sóng mang. 1 FSK đơn giản nhất là FSK nhị phân (BFSK). BFSK sử dụng một cặp tần số rời rạc để truyền thông tin nhị phân (0 và 1). 2 Với lược đồ này, "1" được gọi là tần số đánh dấu và "0" được gọi là tần số không gian. Miền thời gian của nhà cung cấp dịch vụ điều biến FSK được minh họa trong các hình bên phải. [wikipedia]

Có những ứng dụng rất thú vị để truyền dữ liệu qua bầu không khí qua sóng âm thanh - Tôi đoán đó là những gì shopkick sử dụng để verify user presence.

Đối với Python, hãy kiểm tra dự án GnuRadio.

Đối với thư viện C, hãy xem công việc của Steve Underwood (nhưng vui lòng không liên hệ với anh ấy với câu hỏi ngớ ngẩn). Tôi đã sử dụng modem mềm của mình để khởi động FAX to email gateway cho Asterisk (truyền fax không nhiều hơn một tệp B/W TIFF được mã hóa bằng âm thanh để truyền qua đường dây điện thoại).

+0

Tôi muốn một thứ đơn giản hơn và rẻ hơn mà không yêu cầu phần cứng mới khác so với máy ghi băng cassette. –

+1

@kylek: bạn có thể thực hiện điều này bằng phần mềm thuần túy, ví dụ: sử dụng máy tính xách tay hoặc điện thoại thông minh của bạn để mã hóa/giải mã tín hiệu. Điều đó nói rằng, xử lý tín hiệu không nằm trong số các chủ đề dễ nhất trong CS. –

+2

@ kylek: Tôi khá chắc chắn những gì Paulo Scardine gợi ý là bạn có thể xây dựng một modem hoàn toàn bằng phần mềm. Ví dụ, các modem máy tính gia đình phổ biến đầu tiên chỉ là BFSK với 300 thay đổi/giây.Lúc đó, bạn cần phần cứng đặc biệt để thực hiện đủ nhanh để theo kịp - nhưng ngày nay, chỉ cần sử dụng mã khá gần với mẫu trong câu trả lời của tôi, bạn có thể thực hiện nó bằng một ngôn ngữ cấp cao như Python chỉ với CPU 1%. – abarnert

0

Nếu bạn đang tìm thư viện làm điều này, tôi muốn giới thiệu libquiet. Nó sử dụng một thư viện SDR hiện có để thực hiện điều chế của nó, và nó cung cấp các tệp nhị phân sẽ cung cấp cho bạn một đường ống ở một đầu và sẽ cung cấp âm thanh ngay cho soundcard của bạn bằng cách sử dụng PortAudio ở đầu kia. Nó có GMSK cho truyền tải bitrate "qua không khí" và QAM cho tốc độ bit cao hơn dựa trên cáp.

Các vấn đề liên quan