kharlashkin 239 Posted August 26, 2014 (edited) Позавчера ночью когда хотел зайти в командные бои, вспомнил - что у меня очень неудобно назначена кнопочка "Q" на геймпаде. Ранее когда я использовал Xpadder было удобнее. Так как в качестве эмулятора геймпада для игры в танки, я использую AutoHotkey (которая и предназначена для нажатия кнопок клавиатур по событиям), решил поискать решения нажатия кнопки активации голосового чата во взводном/командным боях. Решение нашлось, и вчера вечером был написан простенький скрипт: #SingleInstance, Force device := VA_GetDevice("capture") VA_IMMDevice_Activate(device, IID_IAudioClient:="{1CB9AD4C-DBFA-4c32-B178-C2F568A703B2}", 7, 0, audioClient) VA_IAudioClient_GetMixFormat(audioClient, format) VA_IAudioClient_Initialize(audioClient, 0, 0, 0, 0, format, 0) audioMeter := VA_GetAudioMeter(device) MeterLength = 30 VA_GetDevicePeriod("capture", devicePeriod) Loop { VA_IAudioMeterInformation_GetPeakValue(audioMeter, peakValue) if peakValue > 0.0055 ControlSend,, {vk51 Down}, WoT Client else ControlSend,, {vk51 Up}, WoT Client Sleep, %devicePeriod% } Что делает скрипт - когда вы начинаете что-то говорить в гарнитуру (я использую беспроводную от Xbox 360), AHK отправляет в игру нажатие клавиши "Q", чтобы активировать голосовой чат, когда вы прекращаете говорить (т.е. уровень сигнала в микрофоне падает), AHK отправляет отпускание клавиши "Q". Я пока не проверял в танках, нужно тестировать все. Но в блокноте буковки рисовал мне скрипт очень четко - как только я говорю так и идет строка символов. P.S. AutoHotkey нужно использовать отсюда, так же добавить библиотеку работы со звуком в папку "C:\Program Files\Autohotkey\Lib" P.P.S. Так же наверное нужно будет откорректировать эту строчку "if peakValue > 0.0055" - это уровень сигнала в микрофоне (максимальное значение = 1.0). Я делал каким образом - запускал проверочный скрипт и смотрел на уровень сигнала при обычной моей речи в микрофон. 'Проверочный скрипт' #SingleInstance, Force ; Get the device which well be monitoring. device := VA_GetDevice("capture") ; Get IAudioClient interface. VA_IMMDevice_Activate(device, IID_IAudioClient:="{1CB9AD4C-DBFA-4c32-B178-C2F568A703B2}", 7, 0, audioClient) ; Get mixer format to pass to Initialize. VA_IAudioClient_GetMixFormat(audioClient, format) ; Initialize audio client to ensure peak meter is active. VA_IAudioClient_Initialize(audioClient, 0, 0, 0, 0, format, 0) ; Get IAudioMeterInformation interface. audioMeter := VA_GetAudioMeter(device) ; No longer needed, so free it: MeterLength = 30 ; "The peak value for each channel is recorded over one device ; period and made available during the subsequent device period." VA_GetDevicePeriod("capture", devicePeriod) Loop { VA_IAudioMeterInformation_GetPeakValue(audioMeter, peakValue) ToolTip, %peakValue% Sleep, %devicePeriod% } Edited August 26, 2014 by kharlashkin 3 Quote Share this post Link to post Short link Share on other sites
kharlashkin 239 #209700 Posted August 27, 2014 (edited) Так как дома пока нет интернета, опять лежит. Пользуюсь по вечерам "сломанными" соседскими Wi-Fi, через репитер, а он по какой-то причине режет UDP-траффик и в игру зайти не могу. По логике скрипта мне кажется что он не правильный, потому как при проверке в цикле в игру постоянно отправляются сообщения что "Q" нажата но не отпущена. Надо немного поменять логику работы цикла. Вот этот скрипт логичен, но нужно проверять: #SingleInstance, Force device := VA_GetDevice("capture") VA_IMMDevice_Activate(device, IID_IAudioClient:="{1CB9AD4C-DBFA-4c32-B178-C2F568A703B2}", 7, 0, audioClient) VA_IAudioClient_GetMixFormat(audioClient, format) VA_IAudioClient_Initialize(audioClient, 0, 0, 0, 0, format, 0) audioMeter := VA_GetAudioMeter(device) MeterLength = 30 VA_GetDevicePeriod("capture", devicePeriod) Loop { VA_IAudioMeterInformation_GetPeakValue(audioMeter, peakValue) if (peakValue > 0.0055 and trig="") { Trig=1 ControlSend,, {vk51 down}, WoT Client } else if trig=1 { Trig= ControlSend,, {vk51 up}, WoT Client } Sleep, %devicePeriod% } P.S. Подсказали, что нужно сделать переключателем, изменил скрипт Edited August 27, 2014 by kharlashkin 2 Quote Share this post Link to post Short link Share on other sites
kharlashkin 239 #209785 Posted August 27, 2014 (edited) Сам с собой проверил скрипт в тренировочной комнате, в принципе вот так очень даже неплохо: #SingleInstance, Force device := VA_GetDevice("capture") VA_IMMDevice_Activate(device, IID_IAudioClient:="{1CB9AD4C-DBFA-4c32-B178-C2F568A703B2}", 7, 0, audioClient) VA_IAudioClient_GetMixFormat(audioClient, format) VA_IAudioClient_Initialize(audioClient, 0, 0, 0, 0, format, 0) audioMeter := VA_GetAudioMeter(device) MeterLength = 30 VA_GetDevicePeriod("capture", devicePeriod) Loop { VA_IAudioMeterInformation_GetPeakValue(audioMeter, peakValue) if peakValue > 0.0075 ControlSend,, {vk51 Down}, WoT Client if peakValue < 0.0045 ControlSend,, {vk51 Up}, WoT Client Sleep, %devicePeriod% } Т.е. я указал как бы порог включения как обычно, но уровень отправки отжатия кнопки ниже, как бы для фонового шума. Получается первая мысль была правильной, второй и третий скрипт глючные. P.S. Как и в любой программе для голоса нужно говорить четко и связно, тогда работает без проблем. Откатал сегодня пяток командных боев с автоматическим голосовым чатом, жалоб не было от команды. Так что рекомендую - удобно;) Наверное нужно добавить активацию и приостановку автоматического голосового чата по кнопке ещё... Edited August 27, 2014 by kharlashkin 2 Quote Share this post Link to post Short link Share on other sites
PinkElfant 25 #209829 Posted August 28, 2014 (edited) Nice Job Maaaaaan))) Круто, идея отличная. Вг не делает ибо будут помехи (и правильно) но надо сделать как опцию и будет всёёёё гуд. UPD,.Сделал такую же вещь на С++ библиотека bass library Edited August 28, 2014 by nykaH_CTATucTA 1 Quote Share this post Link to post Short link Share on other sites
kharlashkin 239 #209882 Posted August 28, 2014 (edited) Nice Job Maaaaaan))) Круто, идея отличная. Вг не делает ибо будут помехи (и правильно) но надо сделать как опцию и будет всёёёё гуд. UPD,.Сделал такую же вещь на С++ библиотека bass library Тут дело в том, что я могу сделать как бы мод, который будет запускать этот скрипт напрямую из игры (я сейчас эмулятор для геймпада на AHK так запускаю). У Вас, я так понимаю, будет *.exe, что не есть гут для игры - я пробовал запускать экзешник из игрового питона и игра виснет. Моё мнение что если картоха добавит эту опцию в игру - олешки (или баранчики) в голосовом чате такой словесный срач разведут - мама не горюй. Язык же за зубами держать не умеют по поводу/без повода. Edited August 28, 2014 by kharlashkin Quote Share this post Link to post Short link Share on other sites
kharlashkin 239 #210068 Posted August 30, 2014 Сделал скрипт автозапускаемый игровым python, выход из скрипта когда закрывается окно танков. В архиве так же установочный AHK и нужная библиотека. Запуск и остановка автоактивации голосового чата клавишей "Q". Тестовый скрипт для определения фонового шума так же в архиве. Отпишитесь пожалуйста о работе скрипта кто будет пробовать. AutoVoice.7z Quote Share this post Link to post Short link Share on other sites
BogdanF1 51 #281135 Posted July 8, 2015 Аппну тему. Я так понимаю, на сегодняшний день нет нормально работающего мода/скрипта на автоактивацию микрофона голосом. Выложенный выше скрипт не работает, кроме того он блокирует работу некоторых модов (суммарное ХП команд в частности). А мод "ProVoiceController" из ПроТанки тоже потерял актуальность и его поддержку Юша прекратил. Может есть у кого какие наработки? Quote Share this post Link to post Short link Share on other sites
kharlashkin 239 #281138 Posted July 8, 2015 Аппну тему. Я так понимаю, на сегодняшний день нет нормально работающего мода/скрипта на автоактивацию микрофона голосом. Выложенный выше скрипт не работает, кроме того он блокирует работу некоторых модов (суммарное ХП команд в частности). А мод "ProVoiceController" из ПроТанки тоже потерял актуальность и его поддержку Юша прекратил. Может есть у кого какие наработки? Я переделывал скрипт AHK под другую клавишу (по умолчанию LAlt давал дикие тормоза клиента). К тому же я не обновлял и не проверял запуск AHK-скрипта из клиента. Quote Share this post Link to post Short link Share on other sites
BogdanF1 51 #281139 Posted July 8, 2015 @kharlashkin, А результат то есть? Работает? Просто из меня программист как из ваты пуля, я не совсем понял куда нужно было ваш код вставлять?. Если работает, можно оформить в виде отдельного мода? Quote Share this post Link to post Short link Share on other sites
kharlashkin 239 #281140 Posted July 8, 2015 (edited) Только что проверил с res_mods свой старый мод - скрипт AHK запустился, но так как у меня нет микрофона здесь на ПК то работу его проверить не могу. Но могу сказать что работал как часы - главное как в любых "голосовых интерфейсах" говорить четко и слаженно. Просто из меня программист как из ваты пуля, я не совсем понял куда нужно было ваш код вставлять?. Если работает, можно оформить в виде отдельного мода? Там внутри архива есть что к чему куда, если будет что непонятно спрашивайте. Edited July 8, 2015 by kharlashkin Quote Share this post Link to post Short link Share on other sites
BogdanF1 51 #281143 Posted July 8, 2015 Спрашиваю. Для W7x64 установка в папку "Program Files" или "Program Files(х86)"? Quote Share this post Link to post Short link Share on other sites
kharlashkin 239 #281147 Posted July 8, 2015 (edited) При установке "по-умолчанию" AutoHotkey ставит утилиту соответсвующей разрядности (32/64) в папку "C:\Program Files\AutoHotkey". А если конкретно то для W7x64 ставить нужно в C:\Program Files\AutoHotkey 64-битную версию. P.S. Я проверял работу мода в игре следующим образом - включал автоактивацию, открывал общий чат, говорил в микрофон и наблюдал многократное нажатие "Q" в набираемом сообщении. Edited July 8, 2015 by kharlashkin Quote Share this post Link to post Short link Share on other sites
BogdanF1 51 #281152 Posted July 8, 2015 Сделал всё по описанию. Запустил проверочный скрипт Как его теперь остановить? Только через "Дисп задач" удалить процесс? Quote Share this post Link to post Short link Share on other sites
kharlashkin 239 #281153 Posted July 8, 2015 Сделал всё по описанию. Запустил проверочный скрипт 005.png Как его теперь остановить? Только через "Дисп задач" удалить процесс? Рядом с часиками в области уведомлений есть значек AHK, правой кнопкой мыши - exit :) Quote Share this post Link to post Short link Share on other sites
BogdanF1 51 #281154 Posted July 8, 2015 И судя по тому, что порог прописан 0,0075 а у меня больше, то надо уменьшить чувствительность микрофона в настройках? Хотя странно. Я запускал скрипт без загруженной WOT. Почему такой высокий уровень фона? Quote Share this post Link to post Short link Share on other sites
kharlashkin 239 #281156 Posted July 8, 2015 (edited) И судя по тому, что порог прописан 0,0075 а у меня больше, то надо уменьшить чувствительность микрофона в настройках? Хотя странно. Я запускал скрипт без загруженной WOT. Почему такой высокий уровень фона? Нет, микрофоны и оборудование все разные, а вот эти значения уровня от 0 до 1, соответсвенно 0,0075 - это менее 1% шума. Это тестовый скрипт для точного выявления именно Вашего оборудования в циферках. Скрипт же который работает в танках "AutoVoice\res_mods\0.9.5\scripts\client\mods\AutoVoice.ahk" туда нужно эти значения прописывать. P.S. Уровень 0,0075 - это для наголовного микрофона от Xbox 360, где сам микрофон очень близко к "говорилке" :D Edited July 8, 2015 by kharlashkin Quote Share this post Link to post Short link Share on other sites
BogdanF1 51 #281161 Posted July 8, 2015 Возможно что-то я не так делаю. Проверочный скрипт запускается и значения в нем меняются где-то от 0,0040 до 0,020 когда говоришь в микрофон. А когда заходишь в WOT не могу активировать. То есть проверочный скрипт работает, а активации чата не происходит. Я проверял в окне взвода. При нажатии клавиши Q на рисунке видно активируется зеленая волна, а после нажатия "Проб+Q" автоматом не активируется. Кричи в микрофон, не кричи... Quote Share this post Link to post Short link Share on other sites
kharlashkin 239 #281165 Posted July 8, 2015 А мод то сам скопировали в папку модов? World_of_Tanks\res_mods\0.9.8.1\scripts\client\mods\AutoVoice.ahk (скрипт отслеживающий уровень голоса в микрофоне и нажимающий "Q") World_of_Tanks\res_mods\0.9.8.1\scripts\client\mods\AutoVoice.pyc (скрипт запускающий предыдущий вместе с игрой) Раз проверочный работает, то значит звук отлавливается правильно, так же я проверил что скрипт вместе с игрой тоже запускается, так же я уверен что нажатие клавиш игрой принимаются правильно. Я проверить смогу только вечером полностью работу мода. Проверьте ещё настройки в клиенте - возможно у Вас пару разных входов на ПК и мод пытается отследить один вход а игра работает с другим. @BogdanF1 глянь личку. Quote Share this post Link to post Short link Share on other sites
Nolan431 0 #297548 Posted November 3, 2015 kharlashkin, привет, случайно набрел на эту тему. Касательно танков никогда не нуждался в таком скрипте, но мне стало интересно, можно ли его приспособить под скайп? Когда играю, почти всегда общаюсь с кем то в скайпе, и его главная проблема в том что насколько бы хорош не был твой микрофон, от тебя все равно будет идти фон. Активации голосом в скайпе конечно же нет, поэтому когда все молчат, ты просто сидишь и слушаешь общее шипение ) Quote Share this post Link to post Short link Share on other sites
kharlashkin 239 #297549 Posted November 3, 2015 (edited) kharlashkin, привет, случайно набрел на эту тему. Касательно танков никогда не нуждался в таком скрипте, но мне стало интересно, можно ли его приспособить под скайп? Когда играю, почти всегда общаюсь с кем то в скайпе, и его главная проблема в том что насколько бы хорош не был твой микрофон, от тебя все равно будет идти фон. Активации голосом в скайпе конечно же нет, поэтому когда все молчат, ты просто сидишь и слушаешь общее шипение ) Хм... Имеется ввиду что-то типа кнопки "mute" для телефона? Как бы она постоянно нажата, но когда начинаешь говорить отжимать её? Ну в общем в Skype есть две настройки клавиш для выключения микрофона - нажал выключил/нажал включил и держишь нажатой выключен. Можно в принципе попробовать отправлять по уровню микрофона и так и эдак в неактивное окно Skype, запуск данного скрипта сделать совместно с танчиками. #SingleInstance, Force device := VA_GetDevice("capture") VA_IMMDevice_Activate(device, IID_IAudioClient:="{1CB9AD4C-DBFA-4c32-B178-C2F568A703B2}", 7, 0, audioClient) VA_IAudioClient_GetMixFormat(audioClient, format) VA_IAudioClient_Initialize(audioClient, 0, 0, 0, 0, format, 0) audioMeter := VA_GetAudioMeter(device) MeterLength = 30 VA_GetDevicePeriod("capture", devicePeriod) Loop { VA_IAudioMeterInformation_GetPeakValue(audioMeter, peakValue) if peakValue > 0.0075 Send, {vk51 Up} ;отпускаем клавишу Q if peakValue < 0.0045 Send, {vk51 Down} ;нажимаем клавишу Q Sleep, %devicePeriod% } P.S. Подправил скрипт выше, проверил работоспособность с эхотестом, когда молчу скайп думает что я жму кнопку "Q", не забываем про проверочный скрипт для отслеживания уровня шумов именно в Вашей системе (проверял на Windows10 x64) Edited November 3, 2015 by kharlashkin 1 Quote Share this post Link to post Short link Share on other sites