Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для Mans7
64 / 64 / 14
Регистрация: 05.08.2011
Сообщений: 323
Записей в блоге: 5
.NET 4.x

Обработка звука полученного от модема

14.04.2016, 12:13. Показов 2484. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет! Я так и не понял куда мне написать это сообщение, попробую сюда. Суть такая: есть модем USB Huaweii E173. После приёма вызова и ввода АТ-команды "AT^DDSETEX=2", он начинает выдавать поток данных в порт. Я этот поток записал в файл и теперь пытаюсь его преобразовать в звук.

Насколько мне известно, звук должен быть 8 кГц, 16 бит, моно. И блоками по 320 байт. Пользуясь библиотекой NAudio, пытаюсь вывести звук следующим образом:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public MainWindow()
        {
            InitializeComponent();
 
            waveOut = new WaveOut();
            waveProvider = new BufferedWaveProvider(new WaveFormat(8000, 16, 1));
            waveOut.DesiredLatency = 100;
            waveOut.Init(waveProvider);
            waveOut.PlaybackStopped += wavePlayer_PlaybackStopped;
 
            var incoming = File.ReadAllBytes("Log\\2016-04-14-11-34-11_RAW_Com1.txt");
            
            int x = incoming.Length;
 
            var offset = 0;
            var part = 320;
            while (incoming.Length-offset > part)
            {
                waveProvider.AddSamples(incoming, offset, part);
 
                waveOut.Init(waveProvider);
                waveOut.Play();
 
                offset += part;
            }
        }
 
        private BufferedWaveProvider waveProvider = null;
        private WaveOut waveOut = null;
 
        void wavePlayer_PlaybackStopped(object sender, StoppedEventArgs e)
        {
            // dispose of wave output
            if (waveOut != null)
            {
                waveOut.Dispose();
                waveOut = null;
            }
        }
На выхлопе получаю шум. Ну не совсем шум, но весьма громкий "белый шум" на фоне которого слышится мой голос. И весьма прерывисто. Не понимаю почему и что я делаю не так. Я знаю, что модем может принимать и передавать чистый голос. Это подтверждается работой программы HUAWEII Modem, которая идет в комплекте с дровами. Теперь я пытаюсь это реализовать программно.

Я пока не делаю попыток вывести звук "в реальном времени", т.к. на это может уйти много денег. А так я записал всё что получил модем и теперь ковыряю это. Если я этот набор байтов (файл) засуну в MemoryStream и потом в SoundPlayer, то последний будет ругаться на то, что заголовок повреждён.

Я очень слабо понимаю какие данные приходят от модема. То ли каждый блок 320 байт по сути самостоятельный WAV файл, то ли ещё что. Но когда я пытаюсь вручную найти стандартные байты заголовка в файле, вообще их не нахожу.

Помогите пожалуйста, что я делаю не так?

Если кому интересно, вот ссылка на файл с данными от модема: http://www.filedropper.com/201... -11rawcom1
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.04.2016, 12:13
Ответы с готовыми решениями:

Обработка массива, полученного из api vk
Все сделал верно: авторизовался, получил токен, и на экране вывел ссылку (если её вставить в адресную строку браузера - выдаст инф о...

Обработка полученного docx-файла
Всем доброго время суток, хотел спросить, в форме получаю docx-файл, его содержимое необходимо прочитать и записать в БД. Обработку docx...

Обработка исключения путём взятия ошибки из полученного http запроса
using (HttpRequest httpRequest = new HttpRequest()) { try { ...

11
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
14.04.2016, 12:20
Цитата Сообщение от Mans7 Посмотреть сообщение
Если кому интересно, вот ссылка на файл с данными от модема: http://www.filedropper.com/201... -11rawcom1
Вы что вот так данные и записываете? Прямо в текстовый файл?
Бинарные данные нельзя писать в текстовый файл. Звук - не текст. Используйте для записи в файл метод FileStream.Write(byte[])
1
 Аватар для Mans7
64 / 64 / 14
Регистрация: 05.08.2011
Сообщений: 323
Записей в блоге: 5
14.04.2016, 12:44  [ТС]
Storm23, К сожалению, ранее со звуком практически не имел дело, потому допускаю грубые ошибки. Сейчас попробую!

Добавлено через 8 минут
Пробую записать так:
C#
1
2
3
4
5
6
7
8
9
10
public void PortVoiceRecieced(object sender, SerialDataReceivedEventArgs serialDataReceivedEventArgs)
{
        using (FileStream fs = new FileStream("1.txt", FileMode.OpenOrCreate))
        {
                int x = connector.port.BytesToRead; //получает кол-во байтов пришедших от модема
                buffer = new byte[x];
                connector.port.Read(buffer, 0, x); //запись байтов в буфер
                fs.Write(buffer,0,x);
        }
}
Но записывается лишь 320 пробелов. Попытался сделать отступ:
C#
1
2
                fs.Write(buffer,off,x);
                off += x;
Но появилось исключение, говорящее, что отступ вышел за пределы.

Добавлено через 5 минут
Попробовал вывести звук напрямую:
C#
1
2
3
4
5
6
7
8
9
10
11
        public void PortVoiceRecieced(object sender, SerialDataReceivedEventArgs serialDataReceivedEventArgs)
        {
            int x = connector.port.BytesToRead;
            buffer = new byte[x];
 
            connector.port.Read(buffer, 0, x);
 
            waveProvider.AddSamples(buffer, 0, x);
            waveOut.Init(waveProvider);
            waveOut.Play();
        }
Слышу в колонках себя, что уже неплохо. Без белого шума, но слегка прерывисто.

Storm23, выходит, мне этот поток надо сразу писать в аудио файл? Я почему-то думал, что можно и в текстовом формате всё записать.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
14.04.2016, 12:46
Лучший ответ Сообщение было отмечено Mans7 как решение

Решение

Mans7, После открытия файла, вам нужно передвигать позицию записи в конец файла:

C#
1
2
3
4
            using (FileStream fs = new FileStream("1.txt", FileMode.OpenOrCreate))
            {
                fs.Seek(fs.Length, SeekOrigin.Begin);
                ...
Ну или создание потока должно быть вне метода PortVoiceRecieced.


выходит, мне этот поток надо сразу писать в аудио файл? Я почему-то думал, что можно и в текстовом формате всё записать.
Бинарные данные нельзя писать в текстовом формате.
1
 Аватар для Mans7
64 / 64 / 14
Регистрация: 05.08.2011
Сообщений: 323
Записей в блоге: 5
14.04.2016, 13:19  [ТС]
Storm23,
Бинарные данные нельзя писать в текстовом формате
Поясните, пожалуйста? Ко мне приходит раз в N миллисекунд блок 320 байт данных. Возможно даже уже форматированных под Wave формат. Почему его нельзя записать в файл?

Добавлено через 12 минут
Благодаря вашей подсказке с передвижением позиции в файле, получается записать в файл (даже текстовый) всё что я произношу. И прочитать удаётся. Однако прерывистость сохраняется. Ну, это уже, видимо, параметры самой записи. Хотя надо бы, конечно, разобраться до конца - почему сохраняется эта прерывистость...

Добавлено через 11 минут
Хотя вот что любопытно... вывод звука сразу в потоке, и запись текста в файл - сами по себе разные операции и не связаны друг с другом. Но то, что было записано в файл и воспроизведено - полностью соответствует тому что было проиграно в реальном времени. Это наводит на мысль: возможно, надо как-то поработать с приходящими данными от модема?

Либо надо копать под той библиотекой которая воспроизводит звук...
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
14.04.2016, 14:00
Цитата Сообщение от Mans7 Посмотреть сообщение
Поясните, пожалуйста? Ко мне приходит раз в N миллисекунд блок 320 байт данных. Возможно даже уже форматированных под Wave формат. Почему его нельзя записать в файл?
В файл записывать можно, нельзя записывать в текстовый файл. Если вы пишите бинарные данные как текст, то не всякому байту может соответствовать символ. Кроме того, текстовое представление зависит от кодировки. Например ASCII не содержит вообще символов с кодом выше 128. Таким образом, если вы в ASCII будете писать байт 230, то вместо него будет записан символ ? (именно из них и стостоит в основном файл, который вы выкладывали в первом посте). Другие кодировки, например Uncode вообще вместо одного байта запишут два, потому что юникод записывает символы несколькими байтами и т.д.
1
 Аватар для Mans7
64 / 64 / 14
Регистрация: 05.08.2011
Сообщений: 323
Записей в блоге: 5
14.04.2016, 14:17  [ТС]
Storm23, но ведь символ (байт 230) будет записан и может быть прочитан в дальнейшем как "байт 230"? Текстовый файл - это так, просто для записи данных которые потом я бы преобразовал в аудио-поток. То, что символ не будет отображён - неважно для данной ситуации. Просто для индикации того, что что-то записано и это что-то имеет такой-то объём.

В общем и целом я разобрался. Сейчас даже почти разобрался в том как строится WAVE файл с его заголовками. Одна мелочь лишь непонятна, но это не критично в общем и целом. Спасибо вам за помощь! В конечном итоге удалось записать голос в файл таким способом:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        WaveFileWriter writer = new WaveFileWriter("1.wav", new WaveFormat(8000,16,1));
 
        public void PortVoiceRecieced(object sender, SerialDataReceivedEventArgs serialDataReceivedEventArgs)
        {
            //Получаем данные
            int x = connector.port.BytesToRead;
            buffer = new byte[x];
            connector.port.Read(buffer, 0, x);
 
            //Пишем в аудиофайл
            writer.Write(buffer, 0, x);
            writer.Flush();
        }
Причём после этого я вскрыл то, что было записано с помощью FileStream и то, что записал WaveFileWriter. К моему удивлению эти файлы отличались лишь начальными 46 байтами. Это и есть заголовок WAVE файла. Позже буду копать как в mp3 перегнать в целях компрессии, но это будет отдельная тема и там, скорее всего, я не буду столь дотошным и воспользуюсь готовым решением.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
14.04.2016, 14:46
Цитата Сообщение от Mans7 Посмотреть сообщение
но ведь символ (байт 230) будет записан и может быть прочитан в дальнейшем как "байт 230"?
Нет.
Вот ваш файл:


Вас не смущает что в этом файле половина символов - знаки вопроса, с кодом 3F? А также обратите внимание на то, что там вообще нет байт больше 127. И это не то как он отображается, это реальное его содержимое.
А почему? Потому что вы писали бинарные данные в тексте с кодировкой ASCII.
1
 Аватар для Mans7
64 / 64 / 14
Регистрация: 05.08.2011
Сообщений: 323
Записей в блоге: 5
14.04.2016, 16:13  [ТС]
Понял, спасибо за разъяснение!
0
0 / 0 / 0
Регистрация: 15.09.2015
Сообщений: 2
29.06.2016, 12:43
Привет. Прочел , твои записи и решил задать вопрос. Не совсем по теме, но... Мучаюсь со своим E173 ни как не могу получить голосовой поток на порт Application Interface. Команда AT^DDSETEX=2 проходит, модем реагирует, а потока нет. Родная звонилка HUAWEI работает нормально. Сравнивал данные полученные со снифера - видимо дело в таймингах. Скажи пожалуйста, как ты решил подобное (если было конечно)?
0
 Аватар для Mans7
64 / 64 / 14
Регистрация: 05.08.2011
Сообщений: 323
Записей в блоге: 5
30.06.2016, 19:05  [ТС]
serg009, подпишись на событие PortVoiceRecieced для порта Application Interface. Далее, установи связь (позвони с модема и сними трубку или прими звонок на модеме) соответствующей командой на командный порт (название порта связано с "UI Interface"). Теперь лишь (когда связь установлена) вводи в тот же командный порт команду AT^DDSETEX=2, после этого сразу же должно само вызываться событие PortVoiceRecieced примерно раз в 20-25 миллисекунд. Здесь тайминги не нужны, событие будет срабатывать автоматически, т.к. модем получает данные непрерывно с этим маленьким периодом, тайминг нужен для передачи голосовых данных и то в принципе можно и без них обойтись. Сам процесс получения данных в событии примерно такой:
C#
1
2
3
            int bytesToReadCount = connector.port.BytesToRead;
            byte[] readBuffer = new byte[bytesToReadCount];
            connector.port.Read(readBuffer, 0, bytesToReadCount);
Должны приходить блоки по 320 байт. Это данные PCM. Что бы их воспроизвести, к ним нужно добавить заголовок аудио-файла (WAV, например). У меня так было и это является стандартом. Если не получится, дай знать или напиши в приват, попробую помочь разобраться. У библиотеки NAudio есть почти всё необходимое.

Добавлено через 6 минут
Схема общая такая: у тебя должно быть 2 подключения к 2-м портам (интерфейсам). Порт командный и порт "интерфейса". На командный ты передаёшь все управляющие команды и там же получаешь ответы. На другом ты получаешь только звуковые данные и передавать надо на него же твои голосовые данные. Но передача работает только если вышеупомянутая команда была введена после установления связи.
1
0 / 0 / 0
Регистрация: 15.09.2015
Сообщений: 2
02.07.2016, 13:54
Урра! Заработала железяка! Что там в потоке идет - вопрос десятый. Разберусь. Тем более, что есть такой "мануал" от тебя и Storm23
Спасибо огромное!

"Как я сам не дотумкал, как я сам не дотумкал!" (с)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.07.2016, 13:54
Помогаю со студенческими работами здесь

HTTP и HTTPS запросы в моей Java программе и подальшая обработка полученного HTML
В общем, требуется создать метод, который бы давал моей программке на Java ходить в интернеты и получать HTML код, а далее я бы его...

Обработка звука
Доброго времени суток, господа подскажите какие нибудь библиотеки в питоне для работы со звуком, в особенности интересует, распознавание...

обработка звука
Доброго времени суток. У меня есть программа которая записывает звук с микрофона и воспроизводит. Необходимо, что бы программа рисовала...

Обработка звука
добрый день. Все найденные мной учебники по Java ME в основном концентрируются на создании игр. Как следствие, про обработку звука там...

Обработка звука.
Здраствуйте, есть задача, которая на мой взгляд очень сложная и я даже не представляю как это сделать пограммно с помощью ПК. Вобщем нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru