Обучение работать с аудио в [закрытом] C++

Для того, чтобы получить желаемый результат, вам необходимо внести небольшие изменения. В вашем

my_list = ['Ref.:', 'Reference', 'tramite', 'Expediente', 'Expediente No', 'Expedien N°', 'Exp.No', 'Expedien', 'Expedien N0']

Вы указали Expedien перед Expedien N0, из-за чего в text Expedien N0 18-00232995 текст Expedien совпадает, а N0 совпадает во второй группе и не оставляет области для сопоставления [118 ] как это происходит позже. Следовательно, если вы просто измените порядок в вашем списке и поместите Expedien N0 перед Expedien, то Expedien N0 соответствует первой группе, а 18-00232995 будет захвачено во второй группе и даст вам желаемые результаты. Проверьте ваш модифицированный код Python ниже,

import re
s="""text Expedien N0 18-00232995
$cat input_file
some text before Expedien: 1-21-212-16-26 some random text
Reference RE9833 of all sentences.
abc
123
456
something blah blah Ref.: 
tramite  1234567
Ref.:
some junk Expedien N° 18-00777 # some new content
some text Expedien N°18-0022995 # some garbled content"""
my_list = ['Ref.:', 'Reference', 'tramite', 'Expediente', 'Expediente No', 'Expedien N°', 'Exp.No', 'Expedien N0', 'Expedien']

rx = r'(?<!\w)({})\W*([A-Z]*\d+(?:-+[A-Z]*\d+)*)'.format('|'.join(map(re.escape,my_list)))
print(rx)
print(re.findall(rx, s))

Prints,

[('Expedien N0', '18-00232995'), ('Expedien', '1-21-212-16-26'), ('Reference', 'RE9833'), ('tramite', '1234567'), ('Expedien N°', '18-00777'), ('Expedien N°', '18-0022995')]
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ You have your intended tuple here in your findall results
32
задан Skilldrick 3 April 2009 в 12:28
поделиться

11 ответов

Это действительно зависит от того, какую работу со звуком Вы хотите сделать, Если Вы хотите реализовать аудио для игры, C++ уверен правильный язык. Существуют многие библиотеки вокруг, OpenAL является большим, свободным и многоплатформенным. Я также использовал DirectSound и Fmod с большим успехом. Проверьте их, все это зависит от Ваших потребностей.

14
ответ дан 27 November 2019 в 20:49
поделиться

На окнах ищут учебные руководства на DirectSound.

На Linux существует множество библиотек и методов для доступа к звуковым картам, самая легкая из которых просто открыта файл для устройства, и используют ioctrl для установки скорости, и т.д.

Если Вы даете больше информации о среде, у нас могли бы быть лучшие рекомендации.

- Adam

0
ответ дан 27 November 2019 в 20:49
поделиться

Если Вы хотите сфокусироваться на фактической обработке звука (в противоположность всей грязи, что приложения GUI обременены), я проверил бы CSound. Это дает Вам текстовый файл базирующийся langugae, который позволяет Вам создавать почти любое аудиоустройство фактически из того, что они называют кодами операций, но также и у Вас есть исходный код, в котором можно копаться видеть фактические алгоритмы, которые представляют коды операций.

1
ответ дан 27 November 2019 в 20:49
поделиться

У меня нет всего так большим опытом в создании аудио приложений для меня - но если бы я был в Вашем положении, то я играл бы вокруг с созданием первого VSTi's (виртуальный студийный технологический инструмент). Насколько я знаю, Steinberg выпустили SDK C++ для этого, и я считаю, что это была бы хорошая начальная точка, если требуется войти в приложения саунд-дизайна

1
ответ дан 27 November 2019 в 20:49
поделиться

Если бы Вы уже изучили основы DSP, то я рекомендовал бы Аналоговым устройствам Процессоры Blackfin. Можно использовать и C и C++, и они обеспечивают много Аудио примеров для запущения Вас. Они предоставляют достаточно кода, чтобы считать аудио в плату, обработать его и воспроизвести его.

От этого можно применить любые типы фильтров, или другая обработка Вас желают. Я использовал BF533 Ez-Kit, Облегченный в сочетании с последовательной ЖК-панелью для создания Аудио Эквалайзера для проекта однажды. Были большой полезный опыт и большая забава!

1
ответ дан 27 November 2019 в 20:49
поделиться

Не слушайте меня! Я мог бы быть неправым!

Я не программирую C++, но соглашаюсь с Jalf в нем являющийся трудным для новичков, существует много вещей, которые должны быть сделаны вручную, который другие языки сделают для Вас автоматически, такие как выделение памяти, сборка "мусора" и т.д., они также правы в высказывании, что C++ не знает аудио, и что другим языкам встроили аудио возможности с нуля. Однако обычно большинство из них является довольно основными возможностями: открытие и проигрывание файлов, отправляя playhead в различные части файла, корректируют панорамирование и объем, возможно, извлекая eq данные.

Но... Я предполагаю, что Вы хотите добраться немного глубже и на самом деле сформировать звук, добавляют ли посредством синтеза или эффектов, и что Вы хотите сделать эти вещи вместо просто, их. Я поощрил бы Вас смотреть на VST и VSTi, но это - область C++ (библиотека JUCE, потрясающая потрясающий потрясающий), и трудная тяжелая работа, но если Вы хотите сделать свой собственный продукт, затем это мог бы быть путь. иначе, поскольку другие предложили CSound, Max, Циклическое повторение и возможно Обработка могли бы представлять интерес. программное обеспечение как Reaktor позволяет Вам соединять модульный componenets с намного меньше (если таковые имеются) кодирование.

пойдите и взгляните на некоторые форумы по KVRAudio, существует несколько героев там, которые разработали старое классическое бесплатное программное обеспечение как Головка молотка и затем другое инди-программное обеспечение как Фруктовые Циклы, Возрождение, туарег, Audiomulch и т.д.

Я думаю, узнавая о VST, и C++ является лучшим, но это будет дальняя дорога с болью и мучением, и если Вы не будете хотеть создать одинокую часть программного обеспечения или плагина для другой части программного обеспечения (кроме Csound и т.д.), это будет dissapointing.

Я думаю.

2
ответ дан 27 November 2019 в 20:49
поделиться

Смелость выезда. Это - межплатформенное (Linux, OS X и Windows) аудио редактор с открытым исходным кодом, записанный в C++. Я не знаю, в каком уровне Ваши навыки GUI, но код, который имеет дело с работой со звуком, должен быть довольно легок отличить от wxWidgets (GUI) код.

5
ответ дан 27 November 2019 в 20:49
поделиться

Действительно ли C++ является правильным языком? Это зависит полностью от контекста. Если необходимо включить код в другое приложение, платформу или безотносительно, вероятно, необходимо использовать любой язык, для которого сделана платформа.

Если Вы делаете свое собственное автономное приложение?Наверное, нет. Существует несколько причин, почему я предложил бы, чтобы Вы пошли с другим языком:

  • C++ не хорошо подходит для новичков. Если Ваша цель состоит в том, чтобы изучить программирование через эти проекты, пойдите с языком, который более поддается "обучению на практике". C++ полон ловушек и вещей, которые ", кажется, работают" до одного дня, который они не делают. Добавьте к этому ужасно сложный синтаксис и некоторые довольно сложные идиомы и методы, которые необходимо освоить для работы вокруг причуд языка, которые просто являются надуманными вопросами на в значительной степени любом другом языке, и у Вас есть хороший источник ошибок и разочарований, и не намного больше.
  • C++ не имеет никакого понятия "аудио". C++ не идет ни с каким видом поддержки записи, обработки или проигрывания аудио, загрузки или сохранить звуковые файлы или что-либо еще. Наиболее современные языки имеют некоторую форму аудио поддержки, встроенной в стандартный язык (по крайней мере, способность загрузить и играть mp3 файлы и другие такие основы). В C++ все это должно будет быть сделано через сторонние библиотеки и определенный для ОС код.

Если бы у Вас есть реальный выбор на языке, я сказал бы, идут для чего-то как Python или C#. Их легче изучить, идти с намного большей функциональностью из поля и сделать его намного тяжелее для стрельбы в в ноге. Я не рекомендовал бы C++ кому-то, кто уже не опытный программист.

10
ответ дан 27 November 2019 в 20:49
поделиться

Если Вы действительно решаете использовать C++, то Инструментарий Синтеза стоит отметить. Я использую его для schoolproject, и это очень применимо, разрабатывается в Стэнфордском университете, межплатформенным (победа, Mac и Linux), свободен и с открытым исходным кодом. Извлечение из страницы Википедии на нем:

Версии инструментальных классов STK были интегрированы в ChucK, Csound, Cmix В реальном времени, Макса/MSP (как часть PeRColate) и SuperCollider

У них есть много тестового кода, включенного + на сайте, некоторые учебные руководства для начала работы с их библиотекой. (Но действительно необходимо знать некоторый C++, конечно),

STK имеет некоторых классифицируемых к звуковым файлам чтения-записи (и matlab файлы), аудио/midi в реальном времени io, некоторые основные алгоритмы (использование на основе подобных функций из matlab)...


Другая очевидная опция и вероятно наиболее используемой средой для изучения/тестирования материала dsp является Matlab (или свободная октава, но я не использовал его прежде). Я иногда проверяю материал в Matlab прежде, чем реализовать его в C++.


Править: В прошлом году я использовал JUCE, который является довольно классной библиотекой C++, центрируемой вокруг программирования аудио C++, хотя его более склонение к чему-то как QT. У одного из их разработчиков (Timur Doumler) есть хороший разговор об оперативном аудио с C++ и JUCE на CppCon 2015, который определенно стоит проверить, даже если Вы не заканчиваете тем, что использовали JUCE: https://youtu.be/boPEO2auJj4

12
ответ дан 27 November 2019 в 20:49
поделиться

C ++ может быть отличным языком для обработки звука, я использую платформу Marsyas , кроссплатформенный пакет, который позволяет вам легко выполнять сложные задачи по обработке аудиосигналов, поиску музыкальной информации и машинному обучению. Это также очень быстро, и вы можете выполнять множество сложных задач в реальном времени, в отличие от многих других пакетов. В наших тестах Marsyas может быть в сотни раз быстрее, чем Matlab.

Для начала вот небольшой код. Допустим, вы хотели воспроизвести аудиофайл, для этого вы d создать сеть в Marsyas, которая выглядит так:

  • Series
    • SoundFileSource
    • Gain
    • AudioSink

Marsyas использует модель скрытого исправления, которая похожа на явное исправление, которое вы видите в Max / MSP, но вам не нужно рисовать провода между объектами, вы просто помещаете их в контейнеры, и провода создаются автоматически. Вышеупомянутый объект Series содержит SoundFileSource, который вы передаете аудиофайлу, затем передаете его в Gain, который позволяет вам изменять громкость звука, а затем передает его в AudioSink, который воспроизводит аудиофайл на ваших динамиках.

C ++ для создания этой сети предельно прост:

     MarSystem* playbacknet = mng.create("Series", "playbacknet");
     playbacknet->addMarSystem(mng.create("SoundFileSource", "src"));
     playbacknet->addMarSystem(mng.create("Gain", "gt"));
     playbacknet->addMarSystem(mng.create("AudioSink", "dest"));

     // Set the SoundFileName
     playbacknet->updctrl("SoundFileSource/src/mrs_string/filename",inAudioFileName);

     // Turn on the audio output
     playbacknet->updctrl("AudioSink/dest/mrs_bool/initAudio", true);

     while (playbacknet->getctrl("SoundFileSource/src/mrs_bool/notEmpty")->isTrue())    {
        playbacknet->tick();
     }

Первые четыре строки создают MarSystem, которая обрабатывает ваше аудио. Сначала создается объект Series, который содержит все остальное, а затем к нему добавляются SoundFileSource, Gain и AudioSink.

В следующей строке задается имя файла SoundFileSource, вы должны дать ему имя файла .wav, .au, .aiff или .mp3, который вы хотите обработать здесь.

Затем вы включаете AudioSource, который сообщает вашей звуковой карте начать воспроизведение звука, обновив элемент управления «initAudio» в AudioSource. Затем цикл while повторяется до тех пор, пока SoundFileSource имеет аудиоданные.

Вы можете видеть, что этот простой пример действительно легко выполнить, но настоящая сила Marsyas - это когда вы хотите выполнять более сложные задачи. Например, чтобы выполнить БПФ, вы должны просто сделать:

     MarSystem* net = mng.create("Series", "net");
     net->addMarSystem(mng.create("SoundFileSource", "src"));
     net->addMarSystem(mng.create("Spectrum", "spectrum"));
     net->addMarSystem(mng.create("PowerSpectrum", "powerspectrum"));

     while (playbacknet->getctrl("SoundFileSource/src/mrs_bool/notEmpty")->isTrue())    {
         cout << net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>() << endl;
     }

Чтобы оценить основную частоту источника звука, вы должны сделать что-то вроде:

  MarSystem* net = mng.create("Series", "series");
  net->addMarSystem(mng.create("AudioSource", "src"));
  net->addMarSystem(mng.create("AubioYin", "yin"));

    while (playbacknet->getctrl("SoundFileSource/src/mrs_bool/notEmpty")->isTrue())    {
         cout << net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>() << endl;
     }

Последний будет считывать звук в реальном времени с вашей звуковой карты и запускать на нем мощный алгоритм определения высоты тона Инь. Мило, а?

Чтобы получить больше кода,

2
ответ дан 27 November 2019 в 20:49
поделиться

C может быть лучшим выбором, чем C ++ для звука, особенно если вы хотите использовать какой-либо DSP.

  • Большинство практических справочников по аудио и DSP используют C для примеров кода
  • Большинство аудио / DSP библиотек написаны на C (или, по крайней мере, имеют C API).
  • C ++ значительно увеличивает время обучения по сравнению с C, но не не добавляет большого преимущества для работы со звуком / DSP (ООП не особенно актуален для низкоуровневого кода / кода реального времени)

В изучении C ++, конечно, нет ничего «плохого», и это не помешает вам понять используя код C (поскольку C ++ в основном является надмножеством C) - просто вы будете работать с C намного быстрее, и вы всегда можете перейти на C ++ позже, если решите.

2
ответ дан 27 November 2019 в 20:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: