Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 10.11.2019, 21:53   #1
c1gnum
 
Регистрация: 10.11.2019
Сообщений: 6
По умолчанию Синтез звука

Доброго времени суток! Мне необходимо написать программу, с помощью которой можно организовать передачу текстовой информации между двумя ноутбуками посредством звука, т.е. на одном из устройств вводится какой-то текст, этот текст необходимо преобразовать в звуковой файл, после, звуковой файл воспроизводится этим устройством, второе же устройство через микрофон должно принять этот звуковой файл и конвертировать его обратно в текст. Я не могу понять как сформировать звуковой файл после преобразования текста в бинарный код. Т.е. преобразовав текст в его двоичное представление, мне необходимо по определенным правилам, например, для 1 устанавливается одна частота или уровень громкости, а для 0 соответственно другая частота или громкость, создать звуковой файл. У меня мало опыта в программировании. Возможно есть какие-нибудь библиотеки, которые могут решить данную задачу?
Я нашел код, который создает WAV - файл:
Код:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication8
{
    class Program
    {
        public static double Sine(int index, double frequency)
        {
            return Math.Sin(frequency * index);
        }

        public static void SaveWave(Stream stream, short[] data, int sampleRate)
        {
            BinaryWriter writer = new BinaryWriter(stream);
            short frameSize = (short)(16 / 8); // Количество байт в блоке (16 бит делим на 8).
            writer.Write(0x46464952); // Заголовок "RIFF".
            writer.Write(36 + data.Length * frameSize); // Размер файла от данной точки.
            writer.Write(0x45564157); // Заголовок "WAVE".
            writer.Write(0x20746D66); // Заголовок "frm ".
            writer.Write(16); // Размер блока формата.
            writer.Write((short)1); // Формат 1 значит PCM.
            writer.Write((short)1); // Количество дорожек.
            writer.Write(sampleRate); // Частота дискретизации.
            writer.Write(sampleRate * frameSize); // Байтрейт (Как битрейт только в байтах).
            writer.Write(frameSize); // Количество байт в блоке.
            writer.Write((short)16); // разрядность.
            writer.Write(0x61746164); // Заголовок "DATA".
            writer.Write(data.Length * frameSize); // Размер данных в байтах.
            for (int index = 0; index < data.Length; index++)
            { // Начинаем записывать данные из нашего массива.
                foreach (byte element in BitConverter.GetBytes(data[index]))
                { // Разбиваем каждый элемент нашего массива на байты.
                    stream.WriteByte(element); // И записываем их в поток.
                }
            }
        }

        static void Main(string[] args)
        {

            int sampleRate = 8000; // наша частота дискретизации.
            short[] data = new short[sampleRate];  // Инициализируем массив 16 битных значений.
            double frequency = Math.PI * 2 * 440.0 / sampleRate; // Рассчитываем требующуюся частоту.
            for (int index = 0; index < sampleRate; index++)
            { // Перебираем его.
                data[index] = (short)(Sine(index, frequency) * short.MaxValue); // Приводим уровень к амплитуде от 32767 до -32767.

            }
            Stream file = File.Create("test.wav"); // Создаем новый файл и стыкуем его с потоком.
            SaveWave(file, data, sampleRate); // Записываем наши данные в поток.
            file.Close(); // Закрываем поток.
        }
    }
}
Можно ли этот код изменить следующим образом: допустим, после перевода текста в двоичный код мы имеем последовательность нулей и единиц, далее по этой последовательности необходимо создать звуковой файл, с тем условием, что для нуля устанавливается один уровень громкости/частоты, а для единицы другой?

Последний раз редактировалось c1gnum; 10.11.2019 в 22:17.
c1gnum вне форума   Ответить с цитированием
Старый 10.11.2019, 23:31   #2
Desc
Форумчанин
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 319
По умолчанию

Цитата:
Сообщение от c1gnum Посмотреть сообщение
т.е. на одном из устройств вводится какой-то текст, этот текст необходимо преобразовать в звуковой файл, после, звуковой файл воспроизводится этим устройством, второе же устройство через микрофон должно принять этот звуковой файл и конвертировать его обратно в текст.
Что значит второе устройство через микрофон - один кричит посредством акустической системы, а другой слушает микрофоном и выводит текст услышанного?
Объясните более детально, а то бред какой-то получается. Здесь напечатали, крикнули - там услышали напечатали то что услышали. Правильно понял постановку задачи?
Desc вне форума   Ответить с цитированием
Старый 11.11.2019, 00:02   #3
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,463
По умолчанию

DTMF кодирование чтоли?
ПО сути то правильно идете. Каждый символ в определенную частоту с шагом в 500 герц например. Сформировали вафку и затем воспроизвелис помощью MediaPlayer.
на другой стороне фурье анализатор. По частотам воспроизводите код и переводите в символы.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума   Ответить с цитированием
Старый 11.11.2019, 02:14   #4
c1gnum
 
Регистрация: 10.11.2019
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Desc Посмотреть сообщение
Что значит второе устройство через микрофон - один кричит посредством акустической системы, а другой слушает микрофоном и выводит текст услышанного?
Объясните более детально, а то бред какой-то получается. Здесь напечатали, крикнули - там услышали напечатали то что услышали. Правильно понял постановку задачи?
Да, вы правильно поняли суть задачи - на одном компьютере вводится текст, этот текст преобразуется в двоичный код, по этому коду в соответствии с определенными правилами создается звуковой файл, аудио-файл воспроизводится, второй компьютер слушает этот файл и переводит обратно в текст.
c1gnum вне форума   Ответить с цитированием
Старый 11.11.2019, 02:26   #5
c1gnum
 
Регистрация: 10.11.2019
Сообщений: 6
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
DTMF кодирование чтоли?
ПО сути то правильно идете. Каждый символ в определенную частоту с шагом в 500 герц например. Сформировали вафку и затем воспроизвелис помощью MediaPlayer.
на другой стороне фурье анализатор. По частотам воспроизводите код и переводите в символы.
Нет, не dtmf. По сути может быть введен любой символ или цифра, поэтому каждому отдельному символу назначать свою частоту, я думаю, будет нецелесообразно.
Я вот думаю, а можно ли обойтись без создания wav-файла, а воспользоваться
Код:
Console.Beep()
?

Последний раз редактировалось c1gnum; 11.11.2019 в 02:41.
c1gnum вне форума   Ответить с цитированием
Старый 11.11.2019, 07:33   #6
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,463
По умолчанию

Цитата:
Сообщение от c1gnum Посмотреть сообщение
отдельному символу назначать свою частоту, я думаю, будет нецелесообразно.
почему? символов немного да и распознать одну частоту куда проще.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума   Ответить с цитированием
Старый 11.11.2019, 12:48   #7
c1gnum
 
Регистрация: 10.11.2019
Сообщений: 6
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
почему? символов немного да и распознать одну частоту куда проще.
Я неправильно выразился, что будет вводится текстовое значение, может быть введена любая последовательность букв (русских/английских), любые цифры, знаки препинания, скобки, слеши и т.д.
Или вы имели в виду соответствие определенной частоты каждому отдельному символу 16-ой системы счисления?

Последний раз редактировалось c1gnum; 11.11.2019 в 16:42.
c1gnum вне форума   Ответить с цитированием
Старый 12.11.2019, 13:33   #8
Desc
Форумчанин
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 319
По умолчанию

Цитата:
Сообщение от c1gnum Посмотреть сообщение
Или вы имели в виду соответствие определенной частоты каждому отдельному символу
Здесь подразумевается соответствие определенной частоты коду символа (клавиши) ASCII кодов.
Получится общение между ПК в стиле R2-D2.
Примерно как Здесь, только без анализатора речи.
P. S.
В принципе это и будет выглядеть как DTMF пакеты.

Последний раз редактировалось Desc; 12.11.2019 в 13:38. Причина: Добавил P. S.
Desc вне форума   Ответить с цитированием
Старый 12.11.2019, 16:06   #9
c1gnum
 
Регистрация: 10.11.2019
Сообщений: 6
По умолчанию

Понял, спасибо за разъяснение. Я примерно так и вижу решение данной задачи, но я перевожу введенную строку в ее двоичное представление, и затем 1 назначаю один уровень амплитуды/частоты сигнала, а для 0 соответственно другой, и записываю все это дело в wav-файл.
Сейчас думаю, как реализовать программу на компьютере-приемнике. Я не знаю, будет ли записанный компьютером-приемником звуковой файл, обладать +- теми же характеристиками, что и исходный файл.
c1gnum вне форума   Ответить с цитированием
Ответ
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синтез звуков в роботе. WorldMaster Микроконтроллеры, робототехника, схемотехника, 3D принтеры 0 25.11.2018 19:27
Игра - голосовой синтез jura_k Обсуждение статей 4 31.05.2017 14:09
синтез речи+файл drak2000 Мультимедиа в Delphi 2 21.01.2011 15:12
СИНТЕЗ TreeView и CheckListBox! Wi1D Компоненты Delphi 2 29.07.2009 04:55