Category: музыка

Category was added automatically. Read all entries about "музыка".

vadim kataev logo compuvisor vm agent ai

Kinect

Качество распознования жестов отличное. Думаю, по-настоящему сильную популярность жестовый интерфейс получит не только в игрушках, но и в таких приложениях как редактирование музыки и видео, управление фото-видео альбомами, удалённая навигация роботами (например, для работы в опасной среде или с опасными материалами), управление транспортными средствами.
vadim kataev logo compuvisor vm agent ai

Интеллектуальные агенты. Часть 1


Найти и распарсить


Некоторые соглашения:

Агент
Сущность, взаимодействующая со своей окружающей средой. Это не просто пассивный наблюдатель, но инициатор действия. Если рассматривать агента как объект наблюдения Y в момент времени t, то можно сказать, что будущее поведение объекта Y хотя и продиктовано прошлым (t-dt) , без знания конкретной структуры конкретного объекта Y мы не сможем сделать достаточно точный прогноз о поведении объекта Y в будущем. Даже полное знание описания класса к которому принадлежит объект Y не позволит нам иметь гарантию точного предсказания поведения объекта в момент времени (t+dt) без возможности наблюдателя иметь информацию о внутреннем состоянии системы "объект Y" в момент t.

Отличия агентов от объектов
Выделим среди класса "объекты" некотрой системы все объекты, к которым не принадлежат агенты. Назовём их пассивными объектами и посмотрим на их отличия от агентов. Главное отличие состоит в том, что пассивные объекты в системе не являются сами инициаторами действий по изменению своего поведения в окружающей среде*. Так же у пассивных объектов отсутствуют механизмы защиты внутреннего состояния.

Впрочем, всё это звучит абстрактно и давайте посмотрим на примеры.
Пусть у нас есть два объекта, Камень и Жук.
Class Stone:
    states
    percept

Class Beatle:
    states
    percept


В states хранятся физические состояния объекта и на них может повлиять либо percept либо ограниченный класс законов (в случае для всех объектов это гравитация, для камня это ещё и например внутренняя радиоактивность)

percept является внешней поверхностью объекта, реагирующей на определённый класс законов (например, на свет, температуру, влажность). Таким образом, percept есть просто первый взаимодействующий слой объекта с окружающим миром.

Теперь конкретно про отличия. Скажем, мы пронаблюдали за объектами-представителями обоих этих классов и приходим к следующим выводам:

1) объект класса Beatle не поддаётся изменению своей внутренней структуры под действием некоторых воздействий на его percept. Исследуя класс Beatle, мы замечаем интересную особенность его структуры - она построена таким образом, что в state сохраняется информация о percept в моменты времени (t¹-dt¹, t¹) и имеется механизм позволяющий в момент времени t²-dt² при "похожем" состоянии percept "знать" состояние state в ещё не состоявшемся времени t², то есть образно говоря:
    if  percept[t¹-dt¹] == shadow   and  state[t¹] == low_energy:
        if percept[t²] == shadow:
            state[future(t² + dt²)] = low_energy

    if state[future(t² + dt²)] == low_energy:
        go()
    if state[future(t² + dt²)] == comfortable:
        stay()

такой объект всегда инициирует действие - избегать тени. Реализация механизма в структуре тела объекта.
Пусть вас не вводят в заблуждения обозначения low_energy и comfortable - это сделано для наглядности.
Пассивные объекты могут имеють такое поведение, но система Beatle сочетает в себе множество реакций и не только на освещённость.

2)а как выглядит поведение объекта Stone ?
    if  percept[t¹-dt¹] == temperature_up 
        state[t¹] = temperature_up
    ...
    if  percept[t¹-dt¹] == shadow
        state[t¹] = temperature_down

отличие камня от жука в таком случае есть отсутствие внутреннего сохранения информации о прошлом и использования этой информации для изменения своего поведения.

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

Интеллектуальный программный агент
Программа, имеющая свойства рационального агента, запоминающая состояния окружающей среды, умеющая распозновать состояния окружающей среды на основе накопленной информации, делать прогнозы развития окружающей среды. Как правило, для окружающей среды используется информационное пространство Internet, а программа состоит из потока исполнения.

Посмотрим на типичную реализацию интеллектуального программного агента.
Работа агента представлена на рисунке жёлтыми прямоугольниками:



Как видим, искусственный интеллект агента базируется на обработке информационных потоков, изначально инициатором которых является человек. Данная схема так же может быть соотнесена со схемой работы службы google answers, где множество агентов-людей работая по этой схеме получают деньги от человека, задавающего вопросы.
Давайте подробно рассмотрим первую часть работы агента:

Понять и найти
Сначала человек инициирует запрос, скажем на обычном натуральном языке.
Лингвистическая конструкция сначала приводится к нормальному виду, где объекты запроса (слова), выстраивают дерево взаимосвязей have, is_a, part_of etc. Таким образом, переделанный запрос агент передаёт поисковым машинам и получает ответ либо в форме веб-страницы, либо в форме программных объектов. Например google позволяет вам бесплатно делать до 1000 запросов в сутки при подключении вашего агента через SOAP интерфейс:
import google
data = google.doGoogleSearch(search_terms)
total_results = len(data.results)
for d in data:
    print d

но я предпочитаю другую схему - самую надёжную, т.к. она не имеет ограничений на количество запросов и обрабатывает результаты которые расчитанны на клиента-человека а не на агента. Самым простым решением в таком случае становится парсинг страницы уже готовыми инструментами, например следующая комманда возвращает нам список URL на наш запрос:
lynx -dump "http://www.google.com/search?
num=10&hl=en&lr=&q=$1&btnG=Search" | 
grep '. http' | grep -v 'google'  | awk -F '. ' '{print $3}'


Не поленитесь и создайте скрипт search.sh состоящий всего из одной вышеприведённой комманды - она нам очень пригодится позднее при создании "умного" агента.

Есть ещё лучший способ:
    [...]
    req = urllib2.Request('http://www.google.com/search?lr=&ie=UTF-8&oe=UTF-8&q=' + Req)
    req.add_header('User-Agent', 'Mozilla/5.0 (X11; compatible; MSIE 5.5; Linux i666)')
    try:
        f = urllib2.urlopen(req)
    except IOError, e:
        if hasattr(e, 'reason'):
        print 'Error with reason : ';  print e.reason
    BUFSIZE = 8192 * 2
    while True:
        data = f.read(BUFSIZE)
        if not data: break
    [...]

в такой программе легко собрать необходимый парсер например с помощью наследования от класса sgmllib.SGMLParser (вспомните как работает LinuxOrgRu агент о котором я писал здесь)

Следующим шагом является просмотр страниц, к которым ведут ссылки со страницы результата поиска:
    a=open('from_google').readlines()
    a = [x[:-1] for x in a]
    x=0
    for URL in a:
        links -source ${URL} > result${x}
        x+=1


теперь посмотрим в наш директорий:
globalsearch: ls
google-search.py   result0    result12  result15  result18  result3  result6  result9
gsearch.py             result1    result13  result16  result19  result4  result7
numbers                result11   result14  result17  result2   result5  result8

у нас есть непропарсенных 20 результатов в виде html страниц. Следите за рисунком - сейчас мы в точке, где начинается кластеризация информации на relevant/irrelevant блоки.

Если вы внимательно следите за повествованием, то заметите, что всё что мы делаем поддаётся автоматизации и от человека зависят только условия запроса, поэтому мы смело можем делать все наши операции в форме скрипта.

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

Рекомендуемое чтение для этой части:
M.E. Bratman
Intention, Plans and Practical Reason Harvard University Press: Cambridge, MA, 1987

S.Brin, L.Page
The Anatomy of a Large-Scale Hypertextual Web Search Engine Computer Science Department, Stanford, 2000

G.Wooldridge
Reasoning about rational agents Massachusets Institute of Technology, 2000

Продолжение следует.
vadim kataev logo compuvisor vm agent ai

Как закачать 1000 и более альбомов музыки

Так как интеллект поисковых агентов ещё не достиг уровня самостоятельной полностью автономной работы, нам таки придётся сначала запастись терпением и самим найти вебресурс-жертву. Прежде всего мы должны чётко сформулировать критерий поиска - в данном примере нас интересуют не просто файлы определённого формата (в нашем случае это могли бы быть mp3), но и такие файлы, прямые ссылки на которые содержат дополнительную релевантную для нас информацию (скажем мы ищем последний альбом группы Сплин).
Поехали...

Прогуглим что нить типа "сплин альбом 2003 2004 mp3", уже разглядывая сайт третьего результата от гугла, мы замечаем наличие прямых линков на mp3 файлы - как раз что нам нужно. Сайт-жертва найден и теперь самое время взять информацию о структуре каталогов сайта. Для этого мы можем например сравнить
1)две ссылки на разные файлы из одного альбома
2)две ссылки на разные файлы из двух разных альбомов одного исполнителя
3)аналогично (если важно) по другим категориям (напр. жанр)
То есть смысл этого в том, что бы узнать структуру дерева файлов на сайте-жертве.
Существует несколько скриптов-скраулеров для автоматизации этой работы, но я не хочу углубляться сейчас в тонкости DataMining :) (такие скрипты используют почти все поисковые агенты)

Итак, в нашем случае обнаруживается инкрементный индекс файлов и директориев, что даёт нам возможность всего одной-двумя строками скачать вообще весь ресурс :)
Посмотрим поближе.
В одном альбоме нумерация такая:

http://dl.zvuki.ru/3/0692/mp3/2.mp3
http://dl.zvuki.ru/3/0692/mp3/3.mp3


то есть инкремент ровно +1, что скачивается например так:

for i in range(1,30):wget -c "http://dl.zvuki.ru/3/0692/mp3/${i}.mp3"


и мы имеем последний альбом группы Сплин.
Если же мы будем использовать что то вроде:
for alb in range(592,693)
        for i in range(1,20):wget -c "http://dl.zvuki.ru/3/0${alb}/mp3/${i}.mp3"

то мы скачаем 100 альбомов музыки, аналогично качается 1000 и более альбомов :)

PS:
a)используйте комманду ipython -p pysh для входа в ipython shell
b)на ресурсе в примере многие альбомы не полные
vadim kataev logo compuvisor vm agent ai

Жизнь в Linux. От скрипта до агента.

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


SCRIPTS
Первое правило автоматизации - все программы уже есть в системе и что бы заставить программы сами работать при минимальном участии человека, нужно написать скрипты.
Скрипты - это маленькие программы, оперирующие вместо функций другими программами системы.
Обычно простые скрипты пишутся без помощи текстовых редакторов. Напишем скрипт, который будет искать для нас файлы определённого типа и составлять их список в текстовый файл:

cd ~; mkdir scripts; cd scripts
echo "find / -name \"*.\$1\" > \$1" > find_types.sh
chmod u+x find_types.sh


Теперь если мы будем вызывать наш скрипт с параметром, показывающим определённое расширение, он будет находить и составлять список всех файлов такого типа, например, составим списки всех mp3 и avi файлов системы:

./find_types mp3
./find_types avi


После этого мы имеем два списка файлов, один для mp3, другой для avi. Теперь посмотрим, что полезного могут дать нам списки файлов.


MUSIC
А, например, как мы слушаем музыку ?
Используя наш список mp3 мы можем легко организовать плейлист. Что нам надо? Правильно, ещё один скрипт, назовём его play-mp3:

echo "cat mp3 | grep -i \"\$1\" | mpg123 --shuffle -@ -" > play_mp3.sh
chmod u+x play_mp3.sh


После этого, всё, что нам надо, это указать один параметр при запуске скрипта - примерное название либо каталога либо альбома либо ещё чего, в зависимости от того, как называются директории где лежат файлы либо от того как называются сами файлы. Кроме того, вы можете использовать регулярные выражения. Более того, если заменить grep на agrep, то скрипт не будет обращать внимание на незначительные ошибки в названиях:

./play_mp3.sh enja

будет проигрывать все файлы в пути или имени которых есть слово enja или похожее на него:
/mnt/pub/jet/old_disk_D_copy/musik/4soul/enya - May it be.mp3
/mnt/pub/jet/old_disk_D_copy/musik/4soul/Enya - Now We Are Free (Gladiator Theme).mp

Если хотите, что бы скрипт играл всё, то укажите *, если у вас mp3 файлы отсортированы по стилям то укажите название стиля и т.д. и т.п. Выбор может ограничиться только вашей фантазией.
Такой скрипт удобен ещё и потому, что легко подключается к программе распознования голоса или к демону пульта дистанционного управления или ещё к чему нить. Для проигрывания следующего файла используется сигнал Ctrl+C, для выхода быстро два раза Ctr+C.


VIDEO
Напишем по аналогии с mp3 следующий скрипт:

echo "cat avi | grep -i \"\$1\" | mplayer -fs -playlist -" > play_avi.sh
chmod u+x play_avi.sh


Часто бывает так, что имеется множество мелких роликов в одном из каталогов. Что бы их просмотреть один за одним, нам нужно указать только название каталога лиюо части имени этих роликов:

./play_avi ai_lecture

Точно так же, такой скрипт легко подключить к системе распознавания голоса или к интеллектуальному агенту, которому вы можете просто сказать какое у вас настроение и агент поставит вам например хард-рок видеоклипы :)


INTERNET
По этой части отдыхают все, кроме нас с вами, линуксоидов:)
Типичная ситуация, когда на сайте множество ссылок и хочется скачать всё, но в долго тыкать по каждой ссылке. Кто то использует FlashGet и ему подобные менеджеры в винде, ну а мы используем для этого нашу скриптовую силу:

cat > down.sh
i=2
iend=100
while [ "$i" -lt "$iend" ]
do
wget -c "http://www.gorodok.ru/video/small/$i.mpg"
i=$(expr $i + 1 )
echo $i
done

Ctrl+C

Данный скрипт может качать не только файлы-видео программы Городок. Если вы присмотритесь внимательно, то на типичной веб-странице если есть много линков, то части их имён обычно отличаются упорядоченными номерами - просто меняйте в скрипте адрес и номера начала и конца.
Например, если вы любите новости недели, то можете поставить такие параметры:

i=3539
iend=3559
wget "http://video1.rfn.ru/vesti7/$i.asf"

Мало того, если вы хотите что бы раз в неделю скрипт сам качал свежие передачи, то можете написать ещё один скрипт, который будет инкрементировать цифровые значения раз в неделю и запускать скрипты-качалки. Засуньте его в ваш любимый планировщик заданий, например cron.

Советую вместо wget использовать wpro - он умеет качать стрим-видео.
Кроме того, вы можете делать вложенные циклы и использовать механизмы простейшего анализа текста сайта с которого качаете, для этого используйте языковой словарь и HTML парсер.


AGENT
Ну куда же настоящему линуксоиду без искусственных агентов :)
Для того, что бы воплотить эту идею в жизнь на практике, я делаю следующее:

В системе крутятся несколько демонов:
1.Демон- Распознователь голоса генерирует список распознанных фраз
2.Демон- Управление реакциями на определённые фразы из списка
3.Множество скриптов - реакций агента
4.Генератор голоса агента

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

"покажи что ты видишь")
if [ "$state" = "ready" ]; then
say "Пожалуйста {Pause:300}"
cd $SPEECHSCRIPTS/vision
./detector /dev/video1 &
cd -
fi
state="void"
;;

"сколько времени?")
if [ "$state" = "ready" ]; then
$SPEECHSCRIPTS/say-time.sh
fi
state="void"
;;


Вот примерная схема работы всей системы в целом:
вот тут
и вот тут

Агент получает внимание следующим образом:

"Джек")
state="atention"
;;

"ты тут?")# |"слушай"|"мне нужна твоя помощь")
if [ "$state" = "atention" ]; then
[...]
state="ready"
fi
;;


т.е. сначала я произношу имя агента, а потом просьбу помочь и только потом я прошу его конкретно о том что мне нужно. Такая система привлечения внимания позволяет добиться того, что я могу с кем нибудь разговаривать и быть уверенным что агент не среагирует неправильно. Он реагирует только на обращение к себе и процент правильного узнавания фразы колеблется между 70-80%. С помощью хитрых средств (например, переспрашивание вопросами на которые я могу только ответить да/нет) удаётся добиться весьма высокого качества общения.

Что может такой агент ?
Конечно же, он может не только показывать картинку с вебкамеры (впрочем ещё и с детектором движения - и надеюсь скоро агент сможет распозновать хозяина по-лицу) или время или прогноз погоды или актуальные новости или цены на интересующие хозяина товары. Агент может ооооочень многое - по сути, потенциально, агент может всё, что есть в интернет либо на локальном носителе. Агент очень простой, это скорее простой рефлекторный агент, но он потенциально может перерабатывать всё что есть в интернете а это значит, что ему не обязательно уметь например видеть, что бы писать на форумах или торговать на eBay.

Всё что могут скрипты, может и агент. Кстати, характер агента вы можете так же сформировать по желанию или в зависимости например от актуальной погоды, получаемой с каких нибудь веб-сервисов. Например, агент может прочитать анекдот, полученный с os3e или включить грустную музыку если новости грустные на cnn или стереть самого себя :)

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

Противников искусственного интеллекта прошу сильно не критиковать - я искусственный интеллект строить не собираюсь - всё что я делаю, осознанно пишу программы, которые помогают работать продуктивно и удобно.
А секрет так называемой свободы воли лежит просто в количестве обрабатываемой информации, так же как и прямой зависимости действий и решений агента от неё.

Поэтому, нужно только усложнять систему и тогда агенты смогут писать для вас например музыку и книги, решать задачи и строить дома, ведь главное, что имеют агенты, это доступ ко всему тому, что человек тысячелетиями копил --- семантическая сеть знаний в форме сети интернет.


http://www.compuvisor.net