WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




Объединение нескольких файлов .wav с помощью PHP


Прислал: Николай Рудченко [ 12.03.2008 @ 17:17 ]
Раздел:: [ Статьи по PHP ]


В этой статье мы рассмотрим интересное применение языку программирования PHP. В данном случае мы напишем функцию, с помощью которой можно объединить несколько звуковых файлов в один.

Где это может пригодиться? Да в той же CAPTCHA, к примеру. Ведь иногда, если пользователь не может распознать символов, которые изображены на сгенерированной картинке, ему предлагают прослушать их. И в данном случае вовсе не нужно использовать специальные синтезаторы типа текст -> звук, ведь в латинице только 26 букв + 10 цифр. Но нам потребуется соединить произношение каждого символа как говорится "на лету".

Вот, собственно, и сама функция:

function joinwavs($wavs){
$fields = join('/',array( 'H8ChunkID', 'VChunkSize', 'H8Format',
'H8Subchunk1ID', 'VSubchunk1Size',
'vAudioFormat', 'vNumChannels', 'VSampleRate',
'VByteRate', 'vBlockAlign', 'vBitsPerSample' ));
$data = '';
foreach($wavs as $wav){
$fp     = fopen($wav,'rb');
$header = fread($fp,36);
$info   = unpack($fields,$header);
// read optional extra stuff
if($info['Subchunk1Size'] > 16){
$header .= fread($fp,($info['Subchunk1Size']-16));
}
// read SubChunk2ID
$header .= fread($fp,4);
// read Subchunk2Size
$size  = unpack('vsize',fread($fp, 4));
$size  = $size['size'];
// read data
$data .= fread($fp,$size);
}
return $header.pack('V',strlen($data)).$data;
}

Думаю, разобраться вам будет с нею несложно.

Как видите, нам потребуется предварительно извлечь (заголовки) header information нашего звукового файла типа длительности duration, bit rate, audio channel и т.д.

Чтобы было понятнее, это делает функция unpack для декодирования файла:

<?php
$fp = fopen('chord.wav', 'r');
fseek($fp, 20);
$rawheader = fread($fp, 16);
$header = unpack('vtype/vchannels/Vsamplerate/Vbytespersec/valignment/vbits',
$rawheader);
print_r($header);
?> 

Вот что выдаст нам это скрипт после его запуска:

Array
(
[type] => 1
[channels] => 2
[samplerate] => 22050
[bytespersec] => 88200
[alignment] => 4
[bits] => 16
)

Вот полный листинг кода с комментариями:

<?php
/* При использовании этого скрипта подразумевается, что наши звуковые файлы
.wav имеют имена от a to z and 1 to 10 и находятся в папке captcha_wav в той же директории, где и этот php-файл.
Переменная с кодом безопасности будет генерироваться для каждой сессии и содержать некую строку,
которая и будет сверяться с данным, которые ввел пользователь */ $SecurityCode = "beb9"; $localCode = str_split(strtolower($SecurityCode));
// занесем нашу строку captcha в локальный массив и переведем в нижний регистр $wav_array = array();
// этот массив нам пригодится для хранения имен звуковых файлов foreach($localCode as $character){
// для каждого символа в строке капчи мы подберем соответствующий ему звуковой файл - типа 1.wav или c.wav array_push($wav_array, $character.".wav"); } header('Content-Type: audio/x-wav'); // заголовок для указания типа файла (аудио) $content = joinwavs($wav_array); // вызов функции joinwavs для соединения файлов echo $content; // вывод бинарного содержимого нового файла function joinwavs($wavs){ $data = ''; // бинарный блок аудио-данных $tsize = 0; // начальный размер файла foreach($wavs as $wav){ $fp = fopen("captcha_wav/".$wav,'rb'); // открываем wave-файл $header = fread($fp,50); // !!!!!!!!!! ВАЖНО !!!!!!!! Online документация говорит о том, что заголовочная информация
должна быть длиной 40 бит до непосредственного данных файла.
Но на практике оказалось лучше использвать 50, так что поиграйтесь с этим параметром. // чтение SubChunk2ID $wordata = fread($fp,4); // для проверки корректности чтения заголовка можно вывести на
echo эту переменную. В случае получения слова "data" все идет ок. $header .= $wordata; // добавим слово "data" в заголовок // чтение Subchunk2Size $originalBytes=fread($fp, 4); // 4 битовое поле, которое идет далее $size = unpack('Vsize',$originalBytes); // числовое значение размера данных $tsize += $size['size']; // суммируем размер // считываем данные, которые остались в файле $data .= fread($fp,100000); // закрываем data input stream fclose($fp); } return $header.pack('V',$tsize).$data; } ?>

От вас потребуется отправить объединенный файл пользователю с заголовком audio/x-wav, чтобы браузер знал, что это звуковой файл.

Также нужны будут сами аудио-файлы для каждого символа. Думаю, их в инете масса и найти их не составит большого труда. Да и можете сами записать.
Автор: Николай Рудченко


 :::::  Евгений пишет 12.03.2008 @ 17:49 
Очень хорошая статья!
 :::::  vat пишет 31.03.2008 @ 12:29 
Статья очень понравилась.
Полезно! :)
 :::::  Edpa пишет 14.07.2008 @ 01:56 
Наконец-то я нашел нормальный скрипт, чтобы озвучить сайт. Решил серьезно заняться сайтом для !!!!! слепых или практически слепых !!!! - то есть это сочетание определенных цветов, практически никакой графики (если конечно не смогу сделать полностью настраивающийся сайт) И ЗВУК естественно,очень контрастные, может быть, геометрические фигуры.Поиски по сайту показали (я не нашел даже у буржуев), что серьезных сайтов для слепых нет. Они разумеется есть, но в основном расчитаны , как это не смешно, для чтения нормальными людьми с нормальным зрением. В единичном только случае были попытки упростить прочтение сайта слепыми, но и то как-то однобоко и не совсем продумано.
У меня у самого в компе закачано кучу программ работы с речью, но на сайте их не использовать.
Николай, может быть, у тебя есть еще какие- нибудь скрипты (Visual Basic. Javascript) по работе со звуком, в основно с голосом, работа с TTS (типа движка для голосов).
Я обращаюсь также ко всем. Я буду очень признателен за любую помощь,идею.
Надеюсь, что не прощаюсь. Пишите на мыло. Заранее спасибо.
 :::::  egoholic пишет 05.11.2008 @ 16:02 
Ага значит для слепх ты зделаешь специальный сайт, а для глухих? Что им теперь тупо смотреть на него!
Имя:
Email:
URL

Введите сумму двух чисел девять и одинн (девять+одинн=?)
Запомнить мою информацию

* Html запрещен* Ваш E-mail опубликован не будет.

Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
Design © 2001 by Parallax Design Studio (aka Spectator.ru)
Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
Сгенерировано за: 0.0134320