Тема: AHK: Скрипт, реагирующий на хлопки
Здравствуйте.
Подскажите пожалуйста.
Как скриптом AHK отреагировать на звук двух хлопков, идущих с коротким промежутком - через микрофон ?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Здравствуйте.
Подскажите пожалуйста.
Как скриптом AHK отреагировать на звук двух хлопков, идущих с коротким промежутком - через микрофон ?
Воспользоваться программой распознавания речи.
ypppu, а хлопки - это разве речь ?
Вы не могли бы хотя бы примерное название такой программы дать, которая может распознать хлопки ?
димитрий2, для програм не существует понятия "речь". Человеческая речь - это набор звуков с определенными свойствами.
Что хлопки, что речь - это только колебания воздуха, которые запоминает программа распознавания. Даже сам программа не знает, являются ли те или иные звуки речью. Просто человек задаёт соответствие между данным звуком и набором символов.
Программы есть разные. Одна из наиболее легковесных Dragon dictate (или русифицированная версия - "Горыныч"). Там есть обучение: записываете через микрофон слово (звук), затем заносите в текстовое поле действие (или текстовую строку), которое будет происходить по этому слову (звуку). Желательно одно и то же слово записывать несколько раз с вариациями, поскольку в реальности трудно повторить тот же звук один-в-один.
ypppu, нашел программу "Горыныч". В ее описании написано, что это программа распознавания русскоязычной речи и превращения ее в текст.
Подскажите пожалуйста, как звук хлопка - может быть превращен в речь ?
В смысле - каким текстом он может быть описан ?
Очень давно им не пользовался. Там есть что-то типа встроенного словаря, но слова можно добавлять вручную. Подключаете микрофон. Нужно найти там в программе запись нового слова. Записываете хлопок. Можете его добавить в словарь как слово "хлопок". Подробности уже не вспомню.
ypppu, установил программу "Горыныч v.5", проверил ее работу.
Данная программа не распознает хлопки.
Только речь, да и то еле-еле.
димитрий2
Вот так можно взять уровень с микрофона.
Источник.
Библиотека.
hMedia:=MCI_Open("new","","type waveaudio")
l_CmdString:="status " . hMedia . " level"
OnExit, ExitSub
Progress, R0-128 B ,Press Escape to Exit, Microphone Audio Level, Microphone Audio Level,
loop
{
error := MCI_SendString(l_CmdString,l_lpszReturnString)
Progress, %l_lpszReturnString%
}
Esc::ExitApp
ExitSub:
MCI_Close(hMedia)
ExitApp
;#include MCI.ahk ; uncomment if MCI is not in your std-lib
MCI_SendString(p_lpszCommand,ByRef r_lpszReturnString="",p_hwndCallback=0) {
VarSetCapacity(r_lpszReturnString,512,0)
Return DllCall("winmm.dll\mciSendString" . (A_IsUnicode ? "W":"A")
,"Str",p_lpszCommand ;-- lpszCommand
,"Str",r_lpszReturnString ;-- lpszReturnString
,"UInt",512 ;-- cchReturn
,A_PtrSize ? "Ptr":"UInt",p_hwndCallback ;-- hwndCallback
,"Cdecl Int") ;-- Return type
}
; For more intuitive functions, see the MCI library by jballi.
; doc: http://www.autohotkey.net/~jballi/MCI/v1.1/MCI.html
; download: http://www.autohotkey.net/~jballi/MCI/v1.1/MCI.ahk
MCI_Open(p_MediaFile,p_Alias="",p_Flags="")
{
Static s_Seq=0
;[==============]
;[ Parameters ]
;[==============]
;-- p_MediaFile
if p_MediaFile<>new
{
;-- Media file exist?
IfNotExist %p_MediaFile%
{
outputdebug,
(ltrim join`s
End Func: %A_ThisFunc%: The media file can't be
found. Return=0
)
return false
}
;-- "Type" flag not defined?
if InStr(A_Space . p_Flags . A_Space," type ")=0
{
;-- Registered file extension?
SplitPath p_MediaFile,,,l_Extension
;-- Which OS type?
if A_OSType=WIN32_NT ;-- Windows NT4/2000/XP/2003/Vista
RegRead
,l_Dummy
,HKEY_LOCAL_MACHINE
,SOFTWARE\Microsoft\Windows NT\CurrentVersion\MCI Extensions
,%l_Extension%
else
{
;-- Windows 95/98/ME
iniRead
,l_Value
,%A_WinDir%\win.ini
,MCI Extensions
,%l_Extension%
if l_Value=ERROR
ErrorLevel=1
}
;-- Not found?
if ErrorLevel
{
outputdebug,
(ltrim join`s
End Func: %A_ThisFunc%: The file extension for this media
file is not registered as a valid MCI extension. Return=0
)
return false
}
}
;-- Enclose in DQ
p_MediaFile="%p_MediaFile%"
}
;-- Alias
if p_Alias is Space
{
s_Seq++
p_Alias=MCIFile%s_Seq%
}
;[===============]
;[ Open device ]
;[===============]
l_CmdString=open %p_MediaFile% alias %p_Alias% %p_Flags% wait
l_Return:=MCI_SendString(l_CmdString,Dummy)
if l_Return
l_Return:=0
else
l_Return:=p_Alias
;-- Set time format to milliseconds
if l_Return
{
l_CmdString=set %p_Alias% time format milliseconds wait
MCI_SendString(l_CmdString,Dummy)
}
;-- Return to sender
return l_Return
}
MCI_Close(p_lpszDeviceID)
{
Static MM_MCINOTIFY:=0x03B9
;-- Close device
l_Return:=MCI_SendString("close " . p_lpszDeviceID . " wait",Dummy)
;-- Turn off monitoring of MM_MCINOTIFY message?
if OnMessage(MM_MCINOTIFY)="MCI_Notify"
{
;-- Don't proceed unless all MCI devices are closed
MCI_SendString("sysinfo all quantity open",l_OpenMCIDevices)
if l_OpenMCIDevices=0
{
;-- Disable monitoring
OnMessage(MM_MCINOTIFY,"")
}
}
return l_Return
}
Остается только определить два хлопка по уровню, но есть шанс что будут случайные срабатывания (смотря как алгоритм построить, конечно).
димитрий2, по второму кругу решили?
http://forum.script-coding.com/viewtopic.php?id=14705
Близко к этому, но это же не скрипт.
Он как я понял - распознает два резких звуковых всплеска.
Но не отличает хлопок - от других резких звуков.
Здесь вопрос не о громкости двух звуковых возмущений, а об анализе амплитуды звучания.
по второму кругу решили?
Ну, научно-технический прогресс - не стоит на месте.
Кто знает, может уже появились какие-нибудь интересные решения, новый свежий взгляд.
Датчик хлопка можешь подключить к клавиатуре, например на клавишу Scroll Lock. А на AutoHotkey назначить действие на эту клавишу.
Alectric, подскажите - можно ли как-нибудь перехватить звуковой поток в режиме реального времени, чтобы лучше анализировать звуковой спектр исходящий из микрофона ?
Чтобы скрипт среагировал на определенный звуковой спектр, длинной в 2 секунды.
Как это сделано вот в этой программе (сейчас это спектр в виде прямой горизонтальной линии с двумя резкими всплесками):
Если вам нужно отличать звуки хлопка от других звуков, например цоканья, то дело опять кончится советом нанимать фрилансера.
димитрий2
Этот скрипт дает только амплитудные значения сигнала, а не частотные. Спектр получить из него не получится. Можно попытаться использовать какую-нибудь DLL от WinAmp'а, к примеру, в которой есть анализатор спектра, но тут я ничего не подскажу.
Можно попытаться использовать какую-нибудь DLL
Malcev, понятно.
А что это за язык такой ?
И как его использовать в скрипте autoit ?
Апи для С.
О вызовах функций в dll написано в справке и по автохотки и по автоит.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться