Для передачи информации исходный файл конвертируется в бинарное представление ‒ набор нулей и единиц (рисунок 3). Далее, присоединяем к звуковому разъему передающего ПК через шнур AUX (IN-IN) персональный компьютер, выступающий в роли приемника-микрофона и запускаем скрипт генерации тестовой звуковой волны (рисунок 4).
Это так можно и модем изобрести
Таким образом, наш файл со сказкой Пушкина «О царе Салтане» содержащий 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("Недопустимое действие. Пожалуйста, попробуйте еще раз.")
если кому код интересен пишите
Игорь