Изучение возможности передачи данных по звуковому каналу

В рамках эксперимента перед нами стояла задача выявления дополнительных способов передачи сигналов с одного персонального компьютера (далее — ПК) на другой. В данной статье речь пойдет про один из найденных экзотических способов – передаче файлов-инструкций через аудио разъем ПК.

Изучение возможности передачи данных по звуковому каналу

Шаг 1: Подготовка данных для передачи.

Нами был создан файл с подготовленными данными для передачи (текст). (Рисунок 2).

Изучение возможности передачи данных по звуковому каналу

Шаг 2: Подключение и передача данных.

Использовались базовые библиотеки языка программирования Python (binascii­ ‒ модуль, содержащий методы численной конвертации). Этот инструмент входит в пакет модулей программы для разработки ПО и анализа данных Anaconda Navigator.

Для передачи информации исходный файл конвертируется в бинарное представление ‒ набор нулей и единиц (рисунок 3). Далее, присоединяем к звуковому разъему передающего ПК через шнур AUX (IN-IN) персональный компьютер, выступающий в роли приемника-микрофона и запускаем скрипт генерации тестовой звуковой волны (рисунок 4).

Изучение возможности передачи данных по звуковому каналу
Изучение возможности передачи данных по звуковому каналу

Рисунок 4 – Вывод сигнала на звуковой разъем компьютера.

В результате тестирования получаем, что скорость передачи данных составляет 270 знаков в минуту. Таким образом, наш файл со сказкой Пушкина «О царе Салтане» содержащий 23744 символов (размер 43 КБ) передастся за 87 минут (1 час 27 минут).

Шаг 3: Преобразование аудио-сигнала в текстовый формат.

Полученная запись обрабатывается на ПК также с помощью библиотек Python (технологии спектрального анализа). Расшифровка данных идет путем анализа звуковой волны. В заданном алгоритме единица воспроизводится с большой частотой, чем ноль (рисунок 5 и 6).

Изучение возможности передачи данных по звуковому каналу

Рисунок 5 – Визуальное представление звуковой волны.

Изучение возможности передачи данных по звуковому каналу

Рисунок 6 – Визуальное представление звуковой волны после «обработки».

Очищенная звуковая волна расшифровывается в бинарный код алгоритмом полосового спектроанализа (рисунок 7).

Изучение возможности передачи данных по звуковому каналу

Рисунок 7 – преобразование звуковой волны в бинарный код.

Финальным шагом является декодирование бинарного кода в исходный файл (рисунок 8).

Изучение возможности передачи данных по звуковому каналу

Рисунок 8 – восстановление исходного файла из бинарного кода.

Таким образом, данный способ передачи информации показал свою жизнеспособность, хоть и с небольшой скоростью и требует навыков программирования от пользователя.Спасибо за прочтение.

22
9 комментариев

Это так можно и модем изобрести

2
Ответить

Таким образом, наш файл со сказкой Пушкина «О царе Салтане» содержащий 23744 символов (размер 43 КБ) передастся за 87 минут (1 час 27 минут).

До модема еще далеко

Ответить

если речь идет о передаче текстовой информации, то не проще взять движок speech recognition и через него передать?

Ответить

Вероятно, количество ошибок должно стремиться к нулю, при speech recognition есть много причин эти ошибки получить, а также ещё и не заметить при получении.

Ответить

"В заданном алгоритме единица воспроизводится с большой частотой, чем ноль (рисунок 5 и 6)" - Но судя по рисункам, единица отличается не частотой а длительностью. Поздравляю с изобретением телеграфа!)

Ответить

import sounddevice as sd
import binascii
import re
import numpy as np
import scipy.io.wavfile as wavfile

# Частоты звукового кода (от 27.5 Гц до 4000 Гц)
frequencies = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']

# Создаем шаблон для преобразования шестнадцатеричных данных в аудиоформу
def create_audio_template():
# Создаем пустой массив для хранения частотных значений
audio_template = []

# Проходимся по всем возможным комбинациям шестнадцатеричных символов
for hex_char in frequencies:
# Преобразуем шестнадцатеричный символ в частоту
frequency = 27.5 + (float(int(hex_char, 16)) * (4000 - 27.5) / 15)
audio_template.append(frequency)

return audio_template

# Функция для записи аудио данных в виде шестнадцатеричного кода
def accept_hex_input():
# Создаем пустую строку для хранения шестнадцатеричного кода
hex_code = ""

# Создаем шаблон аудиоформы
audio_template = create_audio_template()

# Определяем обратный вызов для обработки аудиоданных
def callback(indata, frames, time, status):
nonlocal hex_code
# Преобразуем аудиоданные в шестнадцатеричный код и добавляем к строке
hex_code += convert_to_hex(indata, audio_template)

# Начинаем запись с микрофона
sd.InputStream(callback=callback, samplerate=44100).start()

# Ждем ввода пользователя для остановки записи
input("Нажмите Enter, чтобы остановить запись...")

# Останавливаем запись
sd.stop()

# Записываем шестнадцатеричные данные в текстовый файл
write_hex_data(hex_code)

print("Шестнадцатеричные данные сохранены в файл text1.txt.")

# Функция для преобразования аудиоданных в шестнадцатеричный код
def convert_to_hex(audio_data, audio_template):
hex_code = ""
# Проходимся по каждому сэмплу аудиоданных
for sample in audio_data:
# Находим ближайший индекс в шаблоне частот
idx = (np.abs(audio_template - sample)).argmin()
# Преобразуем индекс в шестнадцатеричный символ
hex_char = frequencies[idx]
hex_code += hex_char
return hex_code

# Функция для записи шестнадцатеричных данных в текстовый файл
def write_hex_data(hex_data):
# Удаляем символы, не являющиеся шестнадцатеричными
hex_data = re.sub('[^0-9a-fA-F]', '', hex_data)

# Проверяем, имеет ли шестнадцатеричный код нечетную длину
if len(hex_data) % 2 != 0:
hex_data += '0'

# Записываем шестнадцатеричные данные в текстовый файл
with open('text1.txt', 'w') as file:
formatted_hex_data = ' '.join(hex_data[i:i+2] for i in range(0, len(hex_data), 2))
file.write(formatted_hex_data)

# Функция для преобразования шестнадцатеричных данных в аудиоформу
def convert_to_audio():
# Читаем шестнадцатеричные данные из текстового файла
with open('text.txt', 'r') as file:
hex_data = file.read().strip()

# Преобразуем шестнадцатеричные данные в аудиоформу
audio_data = convert_to_audio_data(hex_data)

# Сохраняем аудиоформу в файл WAV
write_audio_data('audio.wav', audio_data)

print("Текстовые данные преобразованы в audio.wav.")

# Функция для преобразования шестнадцатеричных данных в аудиоформу
def convert_to_audio_data(hex_data):
# Удаляем символы, не являющиеся шестнадцатеричными
hex_data = re.sub('[^0-9a-fA-F]', '', hex_data)

# Проверяем, имеет ли шестнадцатеричный код нечетную длину
if len(hex_data) % 2 != 0:
hex_data += '0'

# Преобразуем шестнадцатеричные данные в двоичные данные
binary_data = binascii.unhexlify(hex_data)

# Убедимся, что размер двоичных данных делится на 2
if len(binary_data) % 2 != 0:
binary_data += b'\x00'

# Преобразуем двоичные данные в аудиоформу
audio_data = np.frombuffer(binary_data, dtype=np.int16)

return audio_data

# Функция для записи аудиоформы в файл WAV
def write_audio_data(filename, audio_data):
wavfile.write(filename, 44100, audio_data)

# Запрашиваем у пользователя действие
action = input("Введите 'accept', чтобы принять шестнадцатеричные данные, или 'convert', чтобы преобразовать текст в аудио: ")

if action == 'accept':
accept_hex_input()
elif action == 'convert':
convert_to_audio()
else:
print("Недопустимое действие. Пожалуйста, попробуйте еще раз.")

Ответить

если кому код интересен пишите
Игорь

Ответить