обработка аудио потоков
Модератор: Olej
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
обработка аудио потоков
Эта тема будет ответвлением Python - графика.
Т.е. намерение: вынести в отдельное обсуждение вопросов аудиообработки, которое ненароком там затронули (но к основной теме там это не относится).
В принципе, в такой постановке вопроса тему можно было бы назвать, на манер разбивки соседних тем и направления разговора, как-то так: Python - аудио. Но я этого не стал делать специально, т.к. интересует этот вопрос меня шире: не только обработка аудио конкретно из Python, а обработка любыми доступными средствами, в том числе и вызываемыми из Python.
Т.е. намерение: вынести в отдельное обсуждение вопросов аудиообработки, которое ненароком там затронули (но к основной теме там это не относится).
В принципе, в такой постановке вопроса тему можно было бы назвать, на манер разбивки соседних тем и направления разговора, как-то так: Python - аудио. Но я этого не стал делать специально, т.к. интересует этот вопрос меня шире: не только обработка аудио конкретно из Python, а обработка любыми доступными средствами, в том числе и вызываемыми из Python.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: обработка аудио потоков
Там писалось (повторю, чтоб не бегать с темы в тему):Olej писал(а):Эта тема будет ответвлением Python - графика.
И лучше всего для этого будет начать с:Olej писал(а): - в стандартной библиотеке Python достаточно много модулей мультимедийной обработки (беру документацию по версии 3.2.2) - The Python Standard Library:Но (по поверхностному взгляду) - это только зачаточные возможности по аудиообработке. А серьёзная обработка может быть легко сделана:22. Multimedia Services
22.1. audioop — Manipulate raw audio data
22.2. aifc — Read and write AIFF and AIFC files
22.3. sunau — Read and write Sun AU files
22.4. wave — Read and write WAV files
22.5. chunk — Read IFF chunked data
22.6. colorsys — Conversions between color systems
22.7. imghdr — Determine the type of an image
22.8. sndhdr — Determine type of sound file
22.9. ossaudiodev — Access to OSS-compatible audio devices
- либо запуском как дочерних процессов аудиоутилит развитых проектов (ALSA, SoX, Ogg etc.);
- либо прямым использованием DLL библиотек этих же проектов.
Это связано ещё и с тем, что аудиообработка - это часто ресурсоёмкие алгоритмы цифровой обработки сигналов (DSP), а Python уступает в производительности на таких задачах в 40 и более раз (сообщается и о 100 раз). А увязывание Python-кода с исполняющими функциями C/C++, в общем, понятно, и уже хорошо рассмотрено: связка Python + C/C++.
Т.е. с разборок с public (open) аудио проектами, и что там у них происходит на сегодня, и утилит в их составе:Olej писал(а): - ... всё это напомнило про большую работу по экспериментированию с аудиообработкой, которую я делал лет 5-6 назад, и которая вылилась в достаточно обстоятельное описание, которое и лежит вот здесь: аудио tools - самое время его достать и реставрировать применительно к текущей задаче;
P.S. Есть ещё куча всяких GUI обработчиков аудио, типа таких: Аудио редакторы в Убунту, но они меня как-раз не интересуют, а интересуют консольные утилиты и их библиотеки. А многие GUI и есть только фронтэнды к таким утилитам и библиотекам.
1. Проект ALSA - Advanced Linux Sound Architecture (ALSA) project homepage
Код: Выделить всё
bash-4.2$ which aplay
/usr/bin/aplay
bash-4.2$ which arecord
/usr/bin/arecord
2. Проект SoX - Sound eXchange
SoX 14.4.1 was released on February 1, 2013.
Код: Выделить всё
bash-4.2$ which sox
/usr/bin/sox
bash-4.2$ which play
/usr/bin/play
Код: Выделить всё
bash-4.2$ which ogg123
/usr/bin/ogg123
bash-4.2$ ls /usr/bin/ogg*
/usr/bin/ogg123 /usr/bin/oggdec /usr/bin/oggenc /usr/bin/ogginfo
bash-4.2$ ls /usr/bin/vorbis*
/usr/bin/vorbiscomment
Для того, чтобы были доступны утилиты speexenc, speexdec - должен быть установлен пакет speex-tools (на моём текущем компьютере не установлен):
Код: Выделить всё
bash-4.2$ yum list speex*
...
Установленные пакеты
speex.i686 1.2-0.14.rc1.fc17 installed
Доступные пакеты
speex-devel.i686 1.2-0.14.rc1.fc17 fedora
speex-tools.i686 1.2-0.14.rc1.fc17 fedora
4. Проект PulseAudio - freedesktop.org/ www/ Software/ PulseAudio
http://www.freedesktop.org/wiki/Software/PulseAudio/
Заодно разобраться что это у них там за совместимость с Windows - http://ru.wikipedia.org/wiki/PulseAudio :
PulseAudio работает на платформах POSIX, таких как Linux, Solaris и FreeBSD, а также на платформе Microsoft Windows.
Код: Выделить всё
bash-4.2$ which pulseaudio
/usr/bin/pulseaudio
bash-4.2$ which pactl
/usr/bin/pactl
bash-4.2$ which pacmd
/usr/bin/pacmd
Код: Выделить всё
bash-4.2$ paplay --help
...
bash-4.2$ parecord --help
...
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: обработка аудио потоков
Я добавил (пользуясь административными полномочиями) некоторые типы расширений файлов, которые можно прикреплять к сообщениям - группа аудио файлов... (см. прикрепляемые файлы: расширения и ограничения)
Пользуясь случаем , теперь проверяем прикрепление звуковых файлов к тексту сообщения ... в порядке хулиганства
(Теперь можете прикреплять к своим текстам ругательные .wav в мой адрес)
Но это и 2 тестовых файла, из проекта Speex, кажется, которые можно использовать как тестовые данные (мужская и женская речь).
А заодно прикрепляю + когда-то написанную мной программу воспроизведения файлов .wav с темпокоррекцией (используя утилиту sox).
Собрать эту программу не представляет труда:
После чего можете позапускать
- вот так фраза будет проговариваться протяжно (на 50% медленнее):
- а вот так скороговоркой:
Но! Это не просто изменение скорости прогона - тембр речи при этом остаётся постоянным, голос идентифицируемый.
Как?
А вот так!
Пользуясь случаем , теперь проверяем прикрепление звуковых файлов к тексту сообщения ... в порядке хулиганства
(Теперь можете прикреплять к своим текстам ругательные .wav в мой адрес)
Но это и 2 тестовых файла, из проекта Speex, кажется, которые можно использовать как тестовые данные (мужская и женская речь).
А заодно прикрепляю + когда-то написанную мной программу воспроизведения файлов .wav с темпокоррекцией (используя утилиту sox).
Собрать эту программу не представляет труда:
Код: Выделить всё
bash-4.2$ gcc wav-play.c -o wav-play
- вот так фраза будет проговариваться протяжно (на 50% медленнее):
Код: Выделить всё
bash-4.2$ ./wav-play -s 1.5 male.wav
Код: Выделить всё
bash-4.2$ ./wav-play -s 0.75 male.wav
Как?
А вот так!
- Вложения
-
- male.wav
- (93.79 КБ) 351 скачивание
-
- female.wav
- (93.79 КБ) 365 скачиваний
-
- wav-play.c
- (1.52 КБ) 350 скачиваний
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: обработка аудио потоков
А теперь о том, как самому наделать любых аудио файлов для экспериментирования со звуком:Olej писал(а):Но это и 2 тестовых файла, из проекта Speex, кажется, которые можно использовать как тестовые данные (мужская и женская речь).
1. Запись утилитой из PulseAudio (запись завершаем по ^C), воспроизведение утилитой play из проекта SoX (но play - это просто упрощённый скрипт из SoX, поэтому в более общем виде это можно делать утилитой sox):
Код: Выделить всё
bash-4.2$ parecord -rvvv > pmic.wav
Открытие потока запись со спецификацией сэмплов 's16le 2ch 44100Гц' и схемой каналов 'front-left,front-right'.
Соединение установлено.
Поток успешно создан.
Показатели буфера: maxlength=4194304, fragsize=352800
Использование семплов 's16le 2ch 44100Гц', схемы каналов 'front-left,front-right'.
Соединён с устройством alsa_input.pci-0000_00_1b.0.analog-stereo (1, not ожидание).
^CСигнал получен, выход.: 752106 мкс.
bash-4.2$ ./wav-play pmic.wav
sox FAIL formats: can't open input file `pmic.wav': WAVE: RIFF header not found
Запись произведена в сыром формате (.raw), без заголовка - просто последовательность цифровых отсчётов звука.
Любое преобразование формата файла (.raw в .wav, или наоборот) можете позже сделать утилитой sox.
Тогда сделаем так:
Код: Выделить всё
bash-4.2$ cp pmic.wav pmic.raw
bash-4.2$ play -r44100 -s -2 -c2 pmic.raw
pmic.raw:
File Size: 361k Bit Rate: 1.41M
Encoding: Signed PCM
Channels: 2 @ 16-bit
Samplerate: 44100Hz
Replaygain: off
Duration: 00:00:02.05
In:100% 00:00:02.05 [00:00:00.00] Out:90.3k [ | ] Clip:0
Done.
Вот теперь всё замечательно звучит.
2. То же, но пользуемся утилитами ALSA (другая звуковая подсистема):
Код: Выделить всё
bash-4.2$ arecord -v -c2 -fS16_LE amic.raw
Recording WAVE 'amic.raw' : Signed 16 bit Little Endian, Rate 8000 Hz, Stereo
ALSA <-> PulseAudio PCM I/O Plugin
Its setup is:
stream : CAPTURE
access : RW_INTERLEAVED
format : S16_LE
subformat : STD
channels : 2
rate : 8000
exact rate : 8000 (8000/1)
msbits : 16
buffer_size : 4000
period_size : 1000
period_time : 125000
tstamp_mode : NONE
period_step : 1
avail_min : 1000
period_event : 0
start_threshold : 1
stop_threshold : 4000
silence_threshold: 0
silence_size : 0
boundary : 2097152000
^CAborted by signal Прерывание...
bash-4.2$ play -r8000 -s -2 -c2 amic.raw
amic.raw:
File Size: 128k Bit Rate: 256k
Encoding: Signed PCM
Channels: 2 @ 16-bit
Samplerate: 8000Hz
Replaygain: off
Duration: 00:00:04.00
In:100% 00:00:04.00 [00:00:00.00] Out:32.0k [ | ] Clip:0
Done.
Код: Выделить всё
bash-4.2$ arecord -v -c2 -fS16_LE -twav awmic.wav
Recording WAVE 'awmic.wav' : Signed 16 bit Little Endian, Rate 8000 Hz, Stereo
ALSA <-> PulseAudio PCM I/O Plugin
Its setup is:
stream : CAPTURE
access : RW_INTERLEAVED
format : S16_LE
subformat : STD
channels : 2
rate : 8000
exact rate : 8000 (8000/1)
msbits : 16
buffer_size : 4000
period_size : 1000
period_time : 125000
tstamp_mode : NONE
period_step : 1
avail_min : 1000
period_event : 0
start_threshold : 1
stop_threshold : 4000
silence_threshold: 0
silence_size : 0
boundary : 2097152000
^CAborted by signal Прерывание...
bash-4.2$ play awmic.wav
awmic.wav:
File Size: 168k Bit Rate: 256k
Encoding: Signed PCM
Channels: 2 @ 16-bit
Samplerate: 8000Hz
Replaygain: off
Duration: 00:00:05.25
In:100% 00:00:05.25 [00:00:00.00] Out:42.0k [ | ] Clip:0
Done.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: обработка аудио потоков
Любопытно вот что:Olej писал(а):Эта тема будет ответвлением Python - графика.
- Файл .wav, который я только-что при вас записал, совершенно нормально воспроизводится утилитой sox, или её клоном play, или программой wav-play, которая показана выше:
Код: Выделить всё
bash-4.2$ ./wav-play awmic.wav
Код: Выделить всё
bash-4.2$ ./test-wav.py awmic.wav
- А запись .wav 32-битными отсчётами для Python вообще заканчивается "core dumped" :
Код: Выделить всё
bash-4.2$ arecord -c1 -twav -fS32_LE -r4000 aw8mic.wav
Recording WAVE 'aw8mic.wav' : Signed 32 bit Little Endian, Rate 4000 Hz, Mono
^CAborted by signal Прерывание...
bash-4.2$ ./test-wav.py aw8mic.wav
*** glibc detected *** /usr/bin/python: double free or corruption (!prev): 0x0856d260 ***
======= Backtrace: =========
/lib/libc.so.6[0x42026069]
/lib/libc.so.6(fclose+0x14c)[0x4201480c]
/lib/libSDL-1.2.so.0(+0x474bc0fb)[0xb73cf0fb]
/lib/libSDL_mixer-1.2.so.0(Mix_LoadWAV_RW+0x276)[0xb7249646]
/usr/lib/python2.7/site-packages/pygame/mixer.so(+0x258d)[0xb72cb58d]
/lib/libpython2.7.so.1.0[0x47474cef]
...
/usr/bin/python[0x80485a1]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:03 244954 /usr/bin/python2.7
08049000-0804a000 r--p 00000000 08:03 244954 /usr/bin/python2.7
...
43e3b000-43e3c000 r-xp 00000000 08:03 211842 /usr/lib/libX11-xcb.so.1.0.0
Аварийный останов (core dumped)
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: обработка аудио потоков
P.S. При экспериментах со звуком обращайте внимание на то, что:Olej писал(а): Вот теперь всё замечательно звучит.
- некоторые игрушки захватывают глухо звуковое устройство, так что sox, play и все другие команды не смогут воспроизводить звук...
- особенно это характерно для многих WEB, браузерных игрушек, которых развелось во множестве...
- и это независимо от того, запущена ли такая гадость на другом рабочем столе, в другом браузере и т.д.
- проверяйте доступность звукового устройства перед началом экспериментов, элементарным play ... чтоб не потерять много часов бездарно
P.S. Похоже, это связано с бездарностью изготовителей таких игр. Но какое это для нас имеет значение?
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: обработка аудио потоков
Оно, конечно, одно дело проиграть "бла-бла-бла под сурдинку" , сопровождая какой-то бойкий игровой сюжет (кто там разберётся с темпом воспроизведения? ), и совсем другое - а). вытащить поток из файла, которые бывают тысячи форматов, с разными параметрами записи + б). декодировать, если нужно, декомпрессировать поток + в). направить на устройство воспроизведения.Olej писал(а): - Это, конечно, связано с несоответствием параметров (частота квантования, 1/2 байта на отсчёт, число каналов - моно/стерео и т.д.). Но всё это должно быть записано в RIFF-заголовке .wav, и должно отрабатываться считывающей программой. А pygames этого не делает. Это показатель а). ограниченности его возможностей и б). то, что универсальные пакеты "широкого применения" всегда ущербны по сравнению с профессиональными средствами.
Меня пока интересовали бы возможности делать это средствами стандартной библиотеки Python (а не какими-то сторонними пакетами).
Но в составе стандартной библиотеки Python (версия 3.4, beta - куда уж более):
Очень негусто! Звуковая система OSS, которая а). очень старая уже не развивается и б). которая существует только в Linux.22. Multimedia Services
22.1. audioop — Manipulate raw audio data
22.2. aifc — Read and write AIFF and AIFC files
22.3. sunau — Read and write Sun AU files
22.4. wave — Read and write WAV files
22.5. chunk — Read IFF chunked data
22.6. colorsys — Conversions between color systems
22.7. imghdr — Determine the type of an image
22.8. sndhdr — Determine type of sound file
22.9. ossaudiodev — Access to OSS-compatible audio devices
А поиск (поверхностный!) показал, что народ ничего искать не хочет , и использует либо Pygames, либо тяжеловесные сторонние проекты, либо в Windows какие-то специфические приблуды DLL ...
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: обработка аудио потоков
Но и с OSS (которая практически нигде в Linux не стоит уже) можно наглядно посмотреть как происходит чтение .wav, декодирование и воспроизведение.Olej писал(а): Меня пока интересовали бы возможности делать это средствами стандартной библиотеки Python (а не какими-то сторонними пакетами).
Но в составе стандартной библиотеки Python (версия 3.4, beta - куда уж более):Очень негусто! Звуковая система OSS, которая а). очень старая уже не развивается и б). которая существует только в Linux.22. Multimedia Services
22.1. audioop — Manipulate raw audio data
22.2. aifc — Read and write AIFF and AIFC files
22.3. sunau — Read and write Sun AU files
22.4. wave — Read and write WAV files
22.5. chunk — Read IFF chunked data
22.6. colorsys — Conversions between color systems
22.7. imghdr — Determine the type of an image
22.8. sndhdr — Determine type of sound file
22.9. ossaudiodev — Access to OSS-compatible audio devices
Для этого нам поможет такая утилита padsp из PulseAudio (и если OSS - слишком старая, то PulseAudio - слишком новая ). Команда padsp эмулирует в PulseAudio присутствие OSS. И если мы просто запустим программу, использующую OSS, то получим ошибку:
Код: Выделить всё
bash-4.2$ python ./ossw.py ../male.wav
параметры записи: (1, 2, 8000, 48000, 'NONE', 'not compressed')
Traceback (most recent call last):
File "./ossw.py", line 18, in <module>
adev = ossaudiodev.open( 'w' ) # открыть OSS аудио устройство
IOError: [Errno 2] No such file or directory: '/dev/dsp'
Код: Выделить всё
bash-4.2$ padsp python ./ossw.py ../male.wav
параметры записи: (1, 2, 8000, 48000, 'NONE', 'not compressed')
считано 20000
проиграно 20000
считано 20000
проиграно 20000
считано 20000
проиграно 20000
считано 20000
проиграно 20000
считано 16000
проиграно 16000
считано 0
последняя считанная позиция 48000
Код: Выделить всё
bash-4.2$ sudo padsp cp male.raw /dev/dsp
А программа вот такая:
Код: Выделить всё
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
import wave
import sndhdr
import ossaudiodev
if len( sys.argv ) != 2:
print( "правильный запуск: {} <файл.wav>".format( sys.argv[ 0 ] ) )
sys.exit( 1 )
if not sndhdr.whathdr( sys.argv[ 1 ] ):
print( "файл не содержит RIFF заголовка (не .wav формат)" )
sys.exit( 2 )
fw = wave.open( sys.argv[ 1 ], 'r' )
print( 'параметры записи: {}'.format( fw.getparams() ) )
adev = ossaudiodev.open( 'w' ) # открыть OSS аудио устройство
adev.channels( fw.getnchannels() ) # настроить число каналов, 1/2 - mono-stereo
adev.speed( fw.getframerate() ) # настроить частоту квантования
adev.setfmt( ossaudiodev.AFMT_S16_LE ) # настроить формат, правильно: fw.getsampwidth()
flen = fw.getnframes() # полное число отсчётов в завписи
# getcomptype() -- returns compression type ('NONE' for linear samples)
# getcompname() -- returns human-readable version of compression type ('not compressed' linear samples)
bufsize = 10000
while True:
stream = fw.readframes( bufsize ) # читывание из файла
print( 'считано {}'.format( len( stream ) ) )
if len( stream ) == 0: break
print( 'проиграно {}'.format( adev.write( stream ) ) )
print( 'последняя считанная позиция {}'.format( fw.tell() ) )
- Вложения
-
- ossw.py
- (1.51 КБ) 349 скачиваний
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: обработка аудио потоков
Обыскался примеров использования звуковой системы ALSA и звукового сервера PulseAudio (который интересен из соображений совместимости с Windows).Olej писал(а):Но и с OSS (которая практически нигде в Linux не стоит уже) можно наглядно посмотреть как происходит чтение .wav, декодирование и воспроизведение.Olej писал(а): Меня пока интересовали бы возможности делать это средствами стандартной библиотеки Python (а не какими-то сторонними пакетами).
Но в составе стандартной библиотеки Python (версия 3.4, beta - куда уж более):Очень негусто! Звуковая система OSS, которая а). очень старая уже не развивается и б). которая существует только в Linux.22. Multimedia Services
22.1. audioop — Manipulate raw audio data
22.2. aifc — Read and write AIFF and AIFC files
22.3. sunau — Read and write Sun AU files
22.4. wave — Read and write WAV files
22.5. chunk — Read IFF chunked data
22.6. colorsys — Conversions between color systems
22.7. imghdr — Determine the type of an image
22.8. sndhdr — Determine type of sound file
22.9. ossaudiodev — Access to OSS-compatible audio devices
На удивление ничегошеньки не нашёл связанного с Python.
Но на самих сайтах проектов ALSA и PulseAudio нашёл примеры записи и воспроизведения звука (в формате .raw последовательности сэмплов). Примеры, как обычно, не собирающиеся, но слегка повозившись довёл их до ума (до работы). Теперь отталкиваясь от этих кодов можно без большого труда написать интерфейсные модули Python для работы с аудио системами, совместимые по форме вызовов с ossaudiodev ... скажем alsaaudiodev и pulseaudiodev (см. связка Python + C/C++ - весь инструментарий описан и под рукой). Таким путём можно прийти к независимости аудио возможностей от устройств и, в принципе, переносимости между операционными системами - http://linuxdoc.ru/918-pulseaudio-4.0.html:
Не знаю, стану ли я это делать ... и когда ... Но может кого заинтересует такое занятие - выкладываю всё своё файловое дерево работы с аудио, там же есть 2 каталога5-06-2013
Представлен звуковой сервер PulseAudio 4.0, который выступает в роли посредника между приложениями и различными низкоуровневыми звуковыми подсистемами, абстрагируя работу с оборудованием. Код PulseAudio распространяется в рамках лицензии LGPL 2.1+. Поддерживается работа в Linux, Solaris, FreeBSD, DragonFlyBSD, NetBSD, Mac OS X и Windows.
alsa и pulse, где работающие теперь уже примеры C-кодов и файлы .hist - журнал выполняемых команд, где всё понятно что и как.
- Вложения
-
- audio.tgz
- (2.63 МБ) 366 скачиваний
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя