| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Клеим Звук |
| Автор: Ivankult 13.12.2009, 13:35 |
| Как склеить 2 wav файла в один? |
| Автор: Экскалупатор 13.12.2009, 14:12 |
| представляешь файлы как массив байтов и с склеиваешь два массива между собой. тут есть запара в том что в wav файле должен быть заголовок. вот http://forum.vingrad.ru/topic-261721.html есть похожая тема. |
| Автор: Ivankult 13.12.2009, 18:33 |
| А стандартных функций в студии разве нет? |
| Автор: Ivankult 14.12.2009, 18:32 | ||
Денис, если опустить громкость звука и всякую лабуду, нам надо только этот кусок кода:
Теперь вопрос: зачем нам 2 буфера? Тогда порядок действий для склеивания n файлов? Читаем первый, добавляем в очередь заголовок, добавляем к размеру нового файла размер текущего файла. Читаем следующий. потом получившийся массив читаем. Так? Тааак. А теперь вопрос, куда в буфер плеера вставлять заголовки файлов?? Или этого не надо делать? Т.е. можно для заголовка использовать какую-то рандомную строку, а в буфер добавлять содержание файлов и соответсвенно увеличивать длину файла? |
| Автор: KuMa1104 14.12.2009, 19:40 |
| Здравствуйте. Ivankult Собственно зачем вам их склеивать? Я же вам кинул пример(возможно не самый лучший но всётаки) того как это надо делать. |
| Автор: Ivankult 14.12.2009, 20:15 | ||
| В том то и дело, что не самый лучший. Если склеить буквы слова и воспроизвести файл, то задержки и "тормоза" программы будут в местах пробелов и не будут заметны.+ мне нужна функция записи прочитанного в файл. Денис, вот я накарябал код, но сомневаюсь что будет работать. Проверять страшно))) А если честно то это е работает. Где ошибки и "косяки"?
|
| Автор: KuMa1104 14.12.2009, 20:33 | ||
Вот поясните это, я не совсем вас понял. Почему вы решили что задержки и тормоза программы будут в местах пробелов и не будут заметны? |
| Автор: Ivankult 14.12.2009, 21:20 |
| Смотрите. Я побуквенно записываю в буфер звуки, потом воспроизвожу и собираю следующее слово, опять воспроизвожу, и т.д. Тогда все осн. команды и соответсвенно издержки, будут в местах пробелов, и пользователь это не заметит(какя разница-пробел будет длится 0,2 сек или 0.,4?) |
| Автор: KuMa1104 14.12.2009, 22:35 | ||||
Я так понял что Вы имеете в виду не буфер звуковой карты, а просто буфер в памяти( т.е. грубо говоря масив баитов)в него вы кидаете данные отдельных слов Слово "Мама" Буфер = М+а+м+а В вашем буфере 4 буквы после вы их воспроизводите. Знаете если вы будете непосредственно подкидывать каждую букву то это даст на мои взгляд большую чуствительность и удобность в управлении.
Хм На сколько я понимаю ваш алгоритм.
Лучше если когда вы програмируете под звуковую карту чтобы она работала в непрерывном режиме. У вас будет работать несколько потоков. 1. В обязанность одного будет входить только подкидывание новых буферов для воспроизведения. 2. В обязанности другого извлекать данные для этих буферов и создовать очередь которая будет воспроизводится первым потоком. Я бы посоветовал вас сделать анологично с алфавитом и пустые буферы для запятои точки пробела, разной длины и тогда просто подкидывать их в звуковую карту. |
| Автор: Экскалупатор 14.12.2009, 23:25 | ||||||
честно не знаю. может у человека там что то планировалось.
в общем похоже. в результате должно получиться так: заголовок(36 байт) + 4 байта (длина = сумма длин n файлов которые нужно клеить - 40*n байт заголовков из каждого файла) + остальное тело, т.е. содержимое всех файлов(исключая заголовки).
если я ничего не путаю то заголовок плееру не нужен, т.е. заголовок в плеер вставлять не нужно, заголовок нужен треку. т.е. сначала нужно склеить трек, а потом весь его передать в плеер. заголовок можно вырезать например у любого из файлов один раз и больше его не трогать. менять только размер тела и собственно само тело. по поводу пробелов и прочего, я так понимаю что у тебя должен быть трек отвечающий за паузу, т.е. тут надо не вешать приложение на определенное время а просто вставлять нужную паузу в трек. т.е. фактически должен получиться один большой трек, в котором будет находиться все что нужно читать. если планируется читать что то большое("Война и Мир" например) то наверное придется разбивать на куски какого более менее большого размера(пару метров, к примеру) и работать с ними. Добавлено @ 23:27 мне кажется что тут бы все ускорилось, если бы у тебя трек для каждой буквы был одного размера(в байтах) тогда можно было бы сразу подсчитать размер итогового буфера, и потом просто записать в него все что нужно, иначе придется менять размер при добавлении каждой новой буквы, а это чревато большими проблемами. |
| Автор: KuMa1104 14.12.2009, 23:45 | ||
В точку! Только незабудьте убедиться что у вас в чанках прописана одно итоже, иначе склеите треки с разнои частотой дискретизации, и вместо пауз и пробелов можете получить страшный вопль. Я когдато давно, так случаино сделал, а на калонках была большая громкость.... Всех родных среди ночи перепугал |
| Автор: Экскалупатор 15.12.2009, 00:08 | ||
да это правильно. в идеале, я считаю, надо вообще подготовить треки так что бы они во всем были одинаковы, ну кроме конечно содержания. и надо бы еще учитывать всякие варианты, при которых некоторые буквы не читаются. или читаются не так как пишется. например "йод" как будет читаться? или как читаться будет твердый/мягкий знак? сам знак не читается никогда, но меняет стоящую перед ним букву. потом отдельный вопрос с ударением. я например не знаю как реализовать этот момент. т.е. как программа прочитает слова зАмок и замОк? скорее всего прочитается замок, без ударения вообще, короче нюансов в этой проге намного больше чем можно представить с первого взгляда. тут кстати можно попробовать не по буквам читать а по целым словам. а не "известные" для проги слова читать по буквам. |
| Автор: Ivankult 15.12.2009, 06:48 |
| Я не хотел в эту тему выкладывать свои сооброжения на тему говорилки(для этого есть своя тема) но ладно. Что я делаю: 1. Храню в БД или ресурс файле оцифрованные звуки(размер в байтах и массив байтов) 2.Читаю какую-то часть текста ("("Война и Мир" например) то наверное придется разбивать на куски какого более менее большого размера(пару метров, к примеру) и работать с ними.") и начинаю обрабатывать 3. Читаю в новую строку слово до первого пробела. 4. Обрабатываю слово(собираю трек), если есть такие вещи как мягкий знак или е,ё,я,ю то это обрабатывается тут же. 5.Запускаю трек и на опр. время усыпляю поток(вместо пробела, точки, запятой, двоеточия и т.д.) 6.Очищаю строку слова(то что делал в п.3) 7. Повторяю с п3 до п7. "Только незабудьте убедиться что у вас в чанках прописана одно итоже, иначе склеите треки с разнои частотой дискретизации, и вместо пауз и пробелов можете получить страшный вопль." Не понял о чем речьhttp://forum.vingrad.ru/html/emoticons/pack/dash1.gif Теперь вопрос Денису. "в общем похоже. в результате должно получиться так: заголовок(36 байт) + 4 байта (длина = сумма длин n файлов которые нужно клеить - 40*n байт заголовков из каждого файла) + остальное тело, т.е. содержимое всех файлов(исключая заголовки)." вообще-то, заголовок трека это 40 байт, + 4 байта длина файла(сумма длительности коротких треков),+само тело. Про заголовок спасибо что пояснил. Посмотрите пожалуйста, что я наваял, может где-то что-то можно исправить или оптимизировать |
| Автор: Ivankult 15.12.2009, 07:59 | ||||
| Вот что я наваял: класс AudioWAV
а вот код основного тела программы(не ругайтесь на ифы, так читабельнее, а потом ифы заменю на case)
Этот вариант полностью работает, все ошибки устранил |
| Автор: Экскалупатор 15.12.2009, 15:16 | ||||||||
Ivankult, привет
согласен. немного запутался вчера... по поводу ошибок. в первой говорит что заголовок неверный. перепроверь что ты там создаешь. ниже структура заголовка.
второй говорит что файл занят. т.е. ты открыл поток, прочитал файл, но поток остался открыт, или сборщик мусора его не успел собрать. попробуй обернуть это место в using
теперь самое прикольно. по поводу основного тела(хорошо что потом заменишь на CASE) но я не понял зачем тебе два раза проверять одни и теже буквы? я имею ввиду "а" и "А", это одинаковые буквы только в разном регистре. если сделать перевод всех букв в один регистр например методом http://msdn.microsoft.com/ru-ru/library/e78f86at.aspx, то у тебя сразу отпадет половина блоков if. и еще для меня осталось загадкой зачем проверять по два раза? один раз в методе
а второй в обработчике кнопки. на мой взгляд достаточно и одного раза. хотя это наверняка должен делать класс который клеит звук. но в любом случае не форма которая является интерфейсом пользователя. |
| Автор: KuMa1104 15.12.2009, 18:44 | ||||||
Я бы вам очень советовал пересмотреть ваш алгоритм пока вы ещё не написали много кода. Потом будет очень сложно всё менять.
Добавлено через 11 минут и 57 секунд Здравствуй Экскалупатор! Ухс помню я его в ручную заполнял, не весело было. Я код особо не смотрел. А как Ivankult подаёт буферы в звуковую карту. там много кода в том все не читал, видимо
Так вот я так понемаю что SoundPlayer оперирует сразу только одним буфером. Т.е. если в него что то закинули то он это воспроизведёт, потом закидываем что то новое. А можно закидывать прям во время воспроизведения чтоб оно выполнялось без задержек на Player.Stream.Write? |
| Автор: Heinzz 15.12.2009, 19:43 | ||
GC шайтан-сундук! успеет или нет непонятно, но вот "зоопарк" точно не успеет. Предлагаю все файлы предварительно загрузить в MemoryStream-ы и уже из них читать/переводить позицию на начало. |
| Автор: Экскалупатор 15.12.2009, 20:15 | ||||
Heinzz, а что такое "зоопарк"?
загрузить сразу все конечно можно, но если их там штук 50? да и держать постоянно все это тоже как то не очень. хотя если учесть что там по одной букве...
вроде нельзя. он по идее только один трек воспроизводит. так что надо собирать а потом воспроизводить. |
| Автор: KuMa1104 15.12.2009, 20:35 | ||
Это плохо. Тогда если автор нехочит мучиться, то возможно деиствительно не стоит стремится к совершенству. Нарезать куски по 1 мин. и после того как кусок проигран тут же подкидывать следующий. Эти минутные треки естественно компоновать в другом потоке и все это синхронизировать. Я думаю что если раз в минуту слушатель будет иметь пол секунды задержки то это не смертельно. |
| Автор: Heinzz 15.12.2009, 22:33 | ||
две "о" подряд |
| Автор: Экскалупатор 15.12.2009, 22:41 |
| Heinzz, аааа, понятно.))))) да "зоопарк" наверное не успеет. это ты хорошо заметил. меня больше интересует процесс обработки знаков препинания. особенно те которые меняют интонации. как например будут отличаться вопросительные предложения от повествовательных? если читать по одному слову, а вместо знаков ставить поток в паузу, то это как то странно. |
| Автор: KuMa1104 15.12.2009, 23:15 | ||
Вопрос конечно интересный, как вариант необходимо как то осуществить что то вроде эквалаизера. ИМХО. Там ведь фактически просто происходит усиление отдельнои полосы частот. После этого сделать несколько регулярных выражений для анализа структуры предложений. И в соответствии с этим уже использовать ф-ии эквалаизера. Но думаю что это можно сделать как то попроще. |
| Автор: Heinzz 17.12.2009, 11:36 | ||
"У Вас на улице перевернулся камаз с пряниками?" Вопросительное выражение может иметь ударение на разные слова и смысл вопроса будет меняться. Это уже от контекста зависит. Спрашивающий может уточнять : перевернулся ли именно камаз, с пряниками ли или просто место где перевернулся на улице или в ограде. |
| Автор: KuMa1104 17.12.2009, 20:17 |
| Класс! Образно и при этом очень наглядно Это прямо какои то тест Тьюринга получается. Человек из контекста может впринципе легко понять как нужно правильно читать а машина нет (или с большим трудом?). |
| Автор: Экскалупатор 17.12.2009, 21:53 |
| KuMa1104, наверное все такие "нет" ничерта эта машина не поймет, потому что компьютер делает только то что ему скажут и обучат, так что сам он не будет. а как научить? я например даже не представляю, а все что видел из читалок, это в основном тупое чтение отдельных букв(в лучшем случае целых слов). |
| Автор: KuMa1104 18.12.2009, 00:03 |
| Ну наше мышление основано тоже на неких принципах, поэтому часто говорят что наш образ мышления и например японцев отличаеться. Кроме того сушествуют же самообучаюшиеся программы.Я сейчас запямятовал. помоему неиросеть или как то так называеться я про это гдето краем глаза читал. Суть в том что впринципе автор топика может написать такое приложение которое будет обучатся и когданибудь заговорит настоящим человеческим голосом. После этого автор продаст его и заработае миллионы!!! А после я надеюсь он вспомнит тех скромных форумчан которые стояли у истоков его проекта, и старались помочь кто чем может |
| Автор: Ivankult 21.12.2009, 20:22 |
| я все подправил уже давно ,код на первой странице. а про case забыл, извините)) |