1

Тема: Голосовая связь, активация микрофона

Есть игра, где активация микрофона для голосовой связи вызывается кнопкой. Я в игре использую макросы AutoHotkey. Подскажите где можно подсмотреть следующий скрипт - нажатие кнопки по уровню шума в микрофоне. То есть я начинаю говорить что-то и AHK жмет кнопку?
Поиск пока ни к чему не привел, только распознавание, не хотелось бы предварительно говорить "кодовое слово" для активации. А для того, чтобы сказать что-то не в игру - есть кнопочка "Mute" на гарнитуре.

2 (изменено: Alectric, 2014-08-25 19:00:03)

Re: Голосовая связь, активация микрофона

Вот так можно взять уровень микрофона:
Только нужно подобрать его ID, на моем компе ID микрофона = 5.

#SingleInstance, Force
MeterLength = 30
#include va.ahk

id=5
device := VA_GetDevice(id)
audioMeter := VA_GetAudioMeter(device)

VA_IAudioMeterInformation_GetMeteringChannelCount(audioMeter, channelCount)

; "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
{
    ; Get the peak value across all channels.
    VA_IAudioMeterInformation_GetPeakValue(audioMeter, peakValue)
    meter := MakeMeter(peakValue, MeterLength)

    ; Get the peak values of all channels.
    VarSetCapacity(peakValues, channelCount*4)
    VA_IAudioMeterInformation_GetChannelsPeakValues(audioMeter, channelCount, &peakValues)
    Loop %channelCount%
        meter .= "`n" MakeMeter(NumGet(peakValues, A_Index*4-4, "float"), MeterLength)

    ToolTip, %meter%
    Sleep, %devicePeriod%
}

MakeMeter(fraction, size)
{
    global MeterLength
    Loop % fraction*size
        meter .= "|"
    Loop % (1-fraction)*size
        meter .= "."
    meter .= "  " fraction
    return meter
}

Требуется библиотека VA.ahk

Хм.. странно, работает только если отрыто окно настроек звука, причем именно вкладка "Запись".

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

3

Re: Голосовая связь, активация микрофона

Спасибо!!! Уже нашел эту библиотеку - Vista Audio, уже проверял перехват вывода звука. Сейчас буду смотреть и Ваш скрипт.

4 (изменено: Alectric, 2014-08-25 19:12:20)

Re: Голосовая связь, активация микрофона

Это не мой скрипт это пример с оф-сайта. В качестве ID можно использовать слово "capture" (берет устройство записи по умолчанию). Также на оф-сайте указано, что уровень будет отображаться только когда устройство используется в каком либо приложении.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

5

Re: Голосовая связь, активация микрофона

С "capture" не получилось, можете ссылку дать где это написано? А так я отловил уровни от микрофона, попробовал в игре - это не то, что мне нужно - потому как скрипт начинает показывать уровни именно когда я в игре нажимаю кнопку, а нужно наоборот.

6

Re: Голосовая связь, активация микрофона

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

7 (изменено: Alectric, 2014-08-26 06:22:08)

Re: Голосовая связь, активация микрофона

Самое обычное условие, ничего сверхестественного.


Level=0.1
if (peakvalue>level)
  Tooltip, %level%`n%peakvalue%
Else
  Tooltip
Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

8

Re: Голосовая связь, активация микрофона

Alectric пишет:

Самое обычное условие, ничего сверхестественного.


Level=0.1
if (peakvalue>level)
  Tooltip, %level%`n%peakvalue%
Else
  Tooltip

Я как-то ожидал подводных камней - а там реально проще не куда. У меня так:

Loop
{
    VA_IAudioMeterInformation_GetPeakValue(audioMeter, peakValue)
    if peakValue > 0.0055
        Send {Space Down}
    else Send {Space Up}
    Sleep, %devicePeriod%
}

Буду тестировать - по крайней мере пробелы в блокноте ставит именно когда звучит речь.

9

Re: Голосовая связь, активация микрофона

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

Мне же нужно в момент превышения уровня микрофона зажать кнопку {Space down} и когда уровень стал нижу фонового шума отжать {Space up}

Вопрос - этот вариант подойдет?

Loop
{
    VA_IAudioMeterInformation_GetPeakValue(audioMeter, peakValue)
    if peakValue > 0.0055
        GoSub, QDown
    if peakValue < 0.0055
        {
        Send {Space up}
        QToggle = 0
        Break
        }
    Sleep, %devicePeriod%
}
Return

QDown:
QToggle++
If QToggle = 1
{
    Send {Space down}
}
return

10 (изменено: Alectric, 2014-08-27 13:41:45)

Re: Голосовая связь, активация микрофона

Нужен тригер.

  
Loop
{
    VA_IAudioMeterInformation_GetPeakValue(audioMeter, peakValue)
    if (peakValue > 0.0055 and trig="")
    {
      Trig=1
        Send {Space Down}
     }
    else if trig=1
    {
     Trig=
      Send {Space Up}
     }
    Sleep, %devicePeriod%
}

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.