Jump to content
Korean Random
kharlashkin

Активация голосового чата

Recommended Posts

Позавчера ночью когда хотел зайти в командные бои, вспомнил - что у меня очень неудобно назначена кнопочка "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 by kharlashkin
  • Upvote 3

Share this post


Link to post

Short link
Share on other sites

Так как дома пока нет интернета, опять лежит. Пользуюсь по вечерам "сломанными" соседскими 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 by kharlashkin
  • Upvote 2

Share this post


Link to post

Short link
Share on other sites

Сам с собой проверил скрипт в тренировочной комнате, в принципе вот так очень даже неплохо:

#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 by kharlashkin
  • Upvote 2

Share this post


Link to post

Short link
Share on other sites

Nice Job Maaaaaan))) Круто, идея отличная. Вг не делает ибо будут помехи (и правильно) но надо сделать как опцию и будет всёёёё гуд.

UPD,.Сделал такую же вещь на С++ библиотека bass library

Edited by nykaH_CTATucTA
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Nice Job Maaaaaan))) Круто, идея отличная. Вг не делает ибо будут помехи (и правильно) но надо сделать как опцию и будет всёёёё гуд.

UPD,.Сделал такую же вещь на С++ библиотека bass library

Тут дело в том, что я могу сделать как бы мод, который будет запускать этот скрипт напрямую из игры (я сейчас эмулятор для геймпада на AHK так запускаю). У Вас, я так понимаю, будет *.exe, что не есть гут для игры - я пробовал запускать экзешник из игрового питона и игра виснет.

 

Моё мнение что если картоха добавит эту опцию в игру - олешки (или баранчики) в голосовом чате такой словесный срач разведут - мама не горюй. Язык же за зубами держать не умеют по поводу/без повода.

Edited by kharlashkin

Share this post


Link to post

Short link
Share on other sites

Сделал скрипт автозапускаемый игровым python, выход из скрипта когда закрывается окно танков. В архиве так же установочный AHK и нужная библиотека. Запуск и остановка автоактивации голосового чата клавишей "Q". Тестовый скрипт для определения фонового шума так же в архиве. Отпишитесь пожалуйста о работе скрипта кто будет пробовать.

AutoVoice.7z

Share this post


Link to post

Short link
Share on other sites

Аппну тему. Я так понимаю, на сегодняшний день нет нормально работающего мода/скрипта на автоактивацию микрофона голосом. Выложенный выше скрипт не работает, кроме того он блокирует работу некоторых модов (суммарное ХП команд в частности). А мод "ProVoiceController" из ПроТанки тоже потерял актуальность и его поддержку Юша прекратил. Может есть у кого какие наработки?

Share this post


Link to post

Short link
Share on other sites

Аппну тему. Я так понимаю, на сегодняшний день нет нормально работающего мода/скрипта на автоактивацию микрофона голосом. Выложенный выше скрипт не работает, кроме того он блокирует работу некоторых модов (суммарное ХП команд в частности). А мод "ProVoiceController" из ПроТанки тоже потерял актуальность и его поддержку Юша прекратил. Может есть у кого какие наработки?

Я переделывал скрипт AHK под другую клавишу (по умолчанию LAlt давал дикие тормоза клиента). К тому же я не обновлял и не проверял запуск AHK-скрипта из клиента.

Share this post


Link to post

Short link
Share on other sites

@kharlashkin, А результат то есть? Работает?

Просто из меня программист как из ваты пуля, я не совсем понял куда нужно было ваш код вставлять?. Если работает, можно оформить в виде отдельного мода?

Share this post


Link to post

Short link
Share on other sites

Только что проверил с res_mods свой старый мод - скрипт AHK запустился, но так как у меня нет микрофона здесь на ПК то работу его проверить не могу.

Но могу сказать что работал как часы - главное как в любых "голосовых интерфейсах" говорить четко и слаженно.


Просто из меня программист как из ваты пуля, я не совсем понял куда нужно было ваш код вставлять?. Если работает, можно оформить в виде отдельного мода?

Там внутри архива есть что к чему куда, если будет что непонятно спрашивайте.

Edited by kharlashkin

Share this post


Link to post

Short link
Share on other sites

Спрашиваю. Для W7x64 установка в папку "Program Files" или "Program Files(х86)"?

Share this post


Link to post

Short link
Share on other sites

При установке "по-умолчанию" AutoHotkey ставит утилиту соответсвующей разрядности (32/64) в папку "C:\Program Files\AutoHotkey". А если конкретно то для W7x64 ставить нужно в C:\Program Files\AutoHotkey 64-битную версию.

 

P.S. Я проверял работу мода в игре следующим образом - включал автоактивацию, открывал общий чат, говорил в микрофон и наблюдал многократное нажатие "Q" в набираемом сообщении.

Edited by kharlashkin

Share this post


Link to post

Short link
Share on other sites

Сделал всё по описанию. Запустил проверочный скрипт

post-18872-0-31511600-1436360099.png

Как его теперь остановить? Только через "Дисп задач" удалить процесс?

Share this post


Link to post

Short link
Share on other sites

Сделал всё по описанию. Запустил проверочный скрипт

attachicon.gif005.png

Как его теперь остановить? Только через "Дисп задач" удалить процесс?

Рядом с часиками в области уведомлений есть значек AHK, правой кнопкой мыши - exit :)

post-19155-0-89787400-1436360428.png

Share this post


Link to post

Short link
Share on other sites

И судя по тому, что порог прописан 0,0075 а у меня больше, то надо уменьшить чувствительность микрофона в настройках? 

Хотя странно. Я запускал скрипт без загруженной WOT. Почему такой высокий уровень фона?

Share this post


Link to post

Short link
Share on other sites

И судя по тому, что порог прописан 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 by kharlashkin

Share this post


Link to post

Short link
Share on other sites

Возможно что-то я не так делаю. Проверочный скрипт запускается и значения в нем меняются где-то от 0,0040 до 0,020 когда говоришь в микрофон. А когда заходишь в WOT не могу активировать. То есть проверочный скрипт работает, а активации чата не происходит. Я проверял в окне взвода. 

post-18872-0-58666500-1436362032_thumb.png

При нажатии клавиши Q на рисунке видно активируется зеленая волна, а после нажатия "Проб+Q" автоматом не активируется. Кричи в микрофон, не кричи...

Share this post


Link to post

Short link
Share on other sites

А мод то сам скопировали в папку модов?

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 (скрипт запускающий предыдущий вместе с игрой)

 

Раз проверочный работает, то значит звук отлавливается правильно, так же я проверил что скрипт вместе с игрой тоже запускается, так же я уверен что нажатие клавиш игрой принимаются правильно. Я проверить смогу только вечером полностью работу мода.

Проверьте ещё настройки в клиенте - возможно у Вас пару разных входов на ПК и мод пытается отследить один вход а игра работает с другим.

post-19155-0-04870800-1436363084_thumb.jpg


@BogdanF1 глянь личку.

Share this post


Link to post

Short link
Share on other sites

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

Share this post


Link to post

Short link
Share on other sites

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

Хм... Имеется ввиду что-то типа кнопки "mute" для телефона? Как бы она постоянно нажата, но когда начинаешь говорить отжимать её?

Ну в общем в Skype есть две настройки клавиш для выключения микрофона - нажал выключил/нажал включил и держишь нажатой выключен.

post-19155-0-81257800-1446580340_thumb.png

 

Можно в принципе попробовать отправлять по уровню микрофона и так и эдак в неактивное окно 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 by kharlashkin
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...