Тема: AHK: Запись с микрофона
Здравствуйте, ребят.
Интересуюсь, а есть ли у кого код, который при удерживании какую-либо кнопку, записывал голос пользователя с микрофона?
В гугле не нашел, как ни странно.
Заранее спасибо за помощь)
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Здравствуйте, ребят.
Интересуюсь, а есть ли у кого код, который при удерживании какую-либо кнопку, записывал голос пользователя с микрофона?
В гугле не нашел, как ни странно.
Заранее спасибо за помощь)
В Windows XP есть стандартная программа "Звукозапись" (sndrec32.exe). Пробел нажал - запись началась. Ещё раз нажал - прекратилась. Ещё раз нажал - продолжилась. Остаётся при помощи AutoHotkey прикрутить удержание. Там кнопки стандартные "button", скорее всего командой ControlSend получится без труда реализовать.
ypppu, спасибо большое за ответ! Но ведь это в XP, и тут два вопроса:
1) А на других ОС также все работает?
2) Где сохраняется файл? И можно ли изменить параметры сохранения?
1) В других ОС не имею возможности посмотреть.
2) Та программка позволяет указывать место для сохранения.
ypppu, посмотрел в гугле, вроде бы на остальных ОС ее скачивать надо, а возможно ли как-то через COMObject сделать, или что-то подобное? Ну хотелось бы либо через DLL, либо через готовый класс, либо через подключение COM.
Если не устраивают сторонние программы, поищите на англоязычном форуме. У нас вроде не было ещё такой темы.
ypppu, поискал, не нашел(
В Win7 sndrec32 заменили на soundrecorder.
Может, Audacity для этой цели подойдет.
svoboden, не хотелось бы ничего качать для программы, чтобы пользователи могли запустить только мою программу и все(
Если уж очень хочется через АПИ, то:
name := "sample"
waitsec := 5
Tooltip Recording %name%.wav
MCI_SendString("close all wait")
MCI_SendString("open new type waveaudio alias " . name)
MCI_SendString("set " . name . " time format ms wait")
;MCI_SendString("set " . name . " bitspersample 16 wait")
;MCI_SendString("set " . name . " channels 1 wait")
;MCI_SendString("set " . name . " samplespersec 16000 wait")
;MCI_SendString("set " . name . " alignment 1 wait")
;MCI_SendString("set " . name . " bytespersec 8000 wait")
MCI_SendString("record " . name)
Sleep waitsec*1000
MCI_SendString("stop " . name . " wait")
MCI_SendString("save " . name . " """ . name . ".wav""")
Tooltip Finished ... Playing
MCI_SendString("delete " . name)
MCI_SendString("close " . name . " wait")
MCI_SendString("open """ . name . ".wav"" type waveaudio alias " . name)
MCI_SendString("play " . name . " wait")
MCI_SendString("close " . name . " wait")
Tooltip
Return
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
Такой еще есть вариант:
;*********************
; SRW7.AHK Library
; vers 0.0.1
; by FredInGA
; Forum #53673
;*********************
;SoundRecorder Docs: http://
SRW7_Open(View) {
global
IfNotExist, %A_WinDir%\system32\soundrecorder.exe
{
Msgbox,4096,Whoops!, Cannot find Microsoft Sound Recorder!`n`nPlease make sure soundrecorder.exe is located in:`n`n*Drive*:\WINDOWS\System32
ExitApp
}
Run, %A_WinDir%\system32\soundrecorder,,%View%,SRW7pid
return SRW7pid
}
SRW7_Record() {
ControlClick, ToolbarWindow324, ahk_class AudioRecorderMainFrameTraits
return 1
}
SRW7_Stop() {
ControlClick, ToolbarWindow323, ahk_class AudioRecorderMainFrameTraits
return 0
}
SRW7_Exit() {
WinClose, ahk_class AudioRecorderMainFrameTraits
return 0
}
; recorderSRW7 by fredinga
; Forum # 53673
#Persistent
#SingleInstance FORCE
#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%
#SingleInstance, ignore
DetectHiddenWindows, On
SetTitleMatchMode, 2
;open with "MIN", "MAX", "HIDE" or "" (normal size)
SRW7_Open("HIDE")
SetTimer showRecording,350
SetTimer showRecording,Off
Recording = 0
Step = 0
gui Margin,0,0
gui -MinimizeBox
gui Add,Button, w220 gRecord, Record
gui Add,Button, wp h25 gExit, Exit (Save as .WMA)
Gui, Add, StatusBar,, Ready
gui, Show,,Sound Recorder Windows 7
Return
Record:
if (Recording = 0) {
status := SRW7_Record()
SetTimer showRecording,On
gosub, showRecording
Recording = 1
}
return
showRecording:
Step ++
if (Step = 1)
SB_SetText("Recording")
else if (Step = 2)
SB_SetText(" Recording")
else {
SB_SetText(" Recording")
Step = 0
}
return
ESC::
Exit:
GUIClose:
status := SRW7_Stop()
SB_SetText(" Saving")
SRW7_Exit()
ExitApp
return
, в общем, тут еще посмотри.
У меня вот как-то попроще вышло:
pathToSaveRec := A_Desktop . "\record.wav" ; путь для сохранения записи
CapsLock::
Record()
KeyWait, CapsLock
Record("stop", pathToSaveRec)
Return
Record(mode := "start", filePath := "") {
commands := { start: ["open new type waveaudio alias recsound", "record recsound"]
, stop: ["save recsound " . filePath, "close recsound"] }
for k, v in commands[mode]
DllCall("Winmm\mciSendString", Str, v, Str, "", UInt, 0, Ptr, 0)
}
Ребят, всем огромное спасибо за помощь! Очень приятно, что многие откликнулись на помощь!
Всем поставлю плюсики, особенная благодарность teadrinker'у!
А кто знает как начинать запись при появлении звуков, и заканчивать при тишине (выставлять какие то определённые уровни и задержки), при этом опционально записывать в один файл.
Так можно отключать/включать микрофон:
1::
SoundSet, +1, Master, Mute, 3
tooltip off
return
Malcev спасибо. Но вот как записывать в один файл?
Если хочется записывать уже в существующий файл, то надо перед записью переходить на конец:
path := "C:\test.wav"
MCI_SendString("open " path " type waveaudio alias wav")
MCI_SendString("seek wav to end wait")
MCI_SendString("record wav")
Sleep 5000
MCI_SendString("save wav " path)
Return
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
}
Добавил wait.
Спасибо, молодца!
teadrinker
pathToSaveRec := A_Desktop . "\record.wav" ; путь для сохранения записи
CapsLock::
Record()
KeyWait, CapsLock
Record("stop", pathToSaveRec)
Return
Record(mode := "start", filePath := "") {
commands := { start: ["open new type waveaudio alias recsound", "record recsound"]
, stop: ["save recsound " . filePath, "close recsound"] }
for k, v in commands[mode]
DllCall("Winmm\mciSendString", Str, v, Str, "", UInt, 0, Ptr, 0)
}
Добр день! Подскажите пож-та, не хочет сохраняться, если брать переменную "var" из GUI. Заранее спасибо!
GuiControlGet, var,, % A_GuiControl
msgbox % pathToSaveRec ; (D:\audio\~Смирнов А.А._05.10.2019.wav)
pathToSaveRec := fold "\~" var "._" timestring ".wav"
Проверяйте, что находится в переменной pathToSaveRec непосредственно перед сохранением в MsgBox.
teadrinker
переменная "pathToSaveRec" пустая перед сохранением, если без переменной "var", которая берется из GUi то всё ОК -
pathToSaveRec := fold "\~._" timestring ".wav"
И почему то на одном ПК рабоатет нормально,а на другом "Не удаётся найти микрофон", хотя микрофоны стоят одинаковые, через run, C:\Windows\system32\SoundRecorder.exe также
переменная "pathToSaveRec" пустая перед сохранением
Перед сохранением в ней должен быть путь к файлу, если пустая — не сохранится.
на другом "Не удаётся найти микрофон"
Не могу сказать, у меня на разных работает без проблем.
teadrinker
msgbox % pathToSaveRec ; ( вот что выдаёт msgbox перед сохранением - D:\audio\~Смирнов А.А._05.10.2019.wav)
pathToSaveRec := fold "\~" var "._" timestring ".wav"
если убрать переменную var, то всё сохраняет!
Нет, «перед сохранением» означает «непосредственно перед сохранением», а у вас после MsgBox её содержание меняется, в такой проверке смысла нет.
У меня вот как-то попроще вышло:
pathToSaveRec := A_Desktop . "\record.wav" ; путь для сохранения записи CapsLock:: Record() KeyWait, CapsLock Record("stop", pathToSaveRec) Return Record(mode := "start", filePath := "") { commands := { start: ["open new type waveaudio alias recsound", "record recsound"] , stop: ["save recsound " . filePath, "close recsound"] } for k, v in commands[mode] DllCall("Winmm\mciSendString", Str, v, Str, "", UInt, 0, Ptr, 0) }
Добрый день! Перестал работать, создаётся файл в 1кб, win8.1x64, микро разные подключал.
Ну и бросьте, с микрофона лучше записывать специальным софтом, там обычно сразу фоновый шум убирается.
Тоже качество крайне низкое делает.
Format : Wave
File size : 412 KiB
Duration : 38s 277ms
Overall bit rate mode : Constant
Overall bit rate : 88.2 Kbps
Audio
Format : PCM
Format settings, Endianness : Little
Format settings, Sign : Unsigned
Codec ID : 1
Duration : 38s 277ms
Bit rate mode : Constant
Bit rate : 88.2 Kbps
Channel(s) : 1 channel
Sampling rate : 11.025 KHz
Bit depth : 8 bits
Stream size : 412 KiB (100%)
У меня нормальное качество выдает, если настроить вот этот пример: http://rosettacode.org/wiki/Record_sound#AutoHotkey.
svoboden, в смысле, качество лучше, чем с этой функцией? Тогда расскажите, как именно вы настраивали свой пример, чтобы повысить качество.
чем с этой функцией
Не то, чтобы лучше. Я тоже поначалу использовал эту функцию, но никому не удалось запустить пример. Хотя никто не жаловался, что пример плохой. А настраивал так эту функцию http://rosettacode.org/wiki/Record_sound#AutoHotkey.
MCI_SendString("set " . name . " time format ms wait")
MCI_SendString("set " . name . " bitspersample 44000 wait")
MCI_SendString("set " . name . " channels 2 wait")
MCI_SendString("set " . name . " samplespersec 22000 wait")
MCI_SendString("set " . name . " alignment 1 wait")
MCI_SendString("set " . name . " bytespersec 22000 wait")
Немного не правильно, но качество улучшилось с 88 до 176 кбит сек.
Я не очень понял, как закомментированные строки могут что-то настроить?
Их раскомментировать нужно. Поправил.
Немного улучшилось, но не принципиально.
Вот данные файла без этих настроек:
Bit rate : 88.2 kb/s
Channel(s) : 1 channel
Sampling rate : 11.025 kHz
Bit depth : 8 bits
Вот с настройками:
Bit rate : 88.2 kb/s
Channel(s) : 1 channel
Sampling rate : 16.0 kHz
Bit depth : 8 bits
Как видно, битрейт не изменился, изменился только Sampling rate. Но главная проблема — фоновый шум — осталась.
А где определили эти данные? У меня в проводнике определяется как 176 кбит. И просто на слух лучше качество. У меня формат wav. Mediainfo:
176.4 kb/s, 22.0 kHz, 8 bits, 1 channel
У меня вот как-то попроще вышло:
pathToSaveRec := A_Desktop . "\record.wav" ; путь для сохранения записи CapsLock:: Record() KeyWait, CapsLock Record("stop", pathToSaveRec) Return Record(mode := "start", filePath := "") { commands := { start: ["open new type waveaudio alias recsound", "record recsound"] , stop: ["save recsound " . filePath, "close recsound"] } for k, v in commands[mode] DllCall("Winmm\mciSendString", Str, v, Str, "", UInt, 0, Ptr, 0) }
Оказывается всё работает вне рабочего компьютера. Стоит Kapersky Security и Secret Net, но почему то софт, в котором используется микрофон, работает. Fmedia через cmd тоже блочит.
с микрофона лучше записывать специальным софтом, там обычно сразу фоновый шум убирается.
Можно и без специального софта шум убрать.
DeepNoiseSuppression 19
A noise suppression effect. This type differs from NoiseSuppression in that it is a more advanced AI / machine learning based noise suppression effect.
Спасибо, понятно, что есть какие-то api. Наверно, не только через UWP можно. Но к данному способу это не прикрутить.
А где определили эти данные?
Тоже через Mediainfo. Но я на семёрке пробовал, может на десятке как-то битрейт повыше выходит.
Я тоже на семерке пробовал, у меня высокий битрейд получается.
понятно, что есть какие-то api. Наверно, не только через UWP можно
Можно через Microsoft Media Foundation, но там не используется machine learning, как я понимаю.
https://docs.microsoft.com/en-us/window … capturedmo
Да, через Microsoft Media Foundation звук чистый получается. Но и вариант через MCI тоже подошел по качеству.
А вы уже код успели написать?
Нет, проверить только.
А в чем проверяли?
Так уже был на форуме скрипт, который через Microsoft Media Foundation записывает звук.
Если вы имеете в виду мой скрипт, то я в нем не использовал Voice Capture DSP, а только Audio Resampler DSP.
Так что неудивительно, что вы не заметили разницы. ))))))))))
Так я ничего не замечал, мне просто сказали, что звук чистый .
Может условия для записи и микрофон хорошие, а может "Кому и кобыла невеста" (c).
Может, точно не знаю.
У меня вот как-то попроще вышло:
pathToSaveRec := A_Desktop . "\record.wav" ; путь для сохранения записи CapsLock:: Record() KeyWait, CapsLock Record("stop", pathToSaveRec) Return Record(mode := "start", filePath := "") { commands := { start: ["open new type waveaudio alias recsound", "record recsound"] , stop: ["save recsound " . filePath, "close recsound"] } for k, v in commands[mode] DllCall("Winmm\mciSendString", Str, v, Str, "", UInt, 0, Ptr, 0) }
Добрый день! подскажите пожалуйста, как сделать так чтобы файл не перезаписывался, а создавался новый? Желательно чтобы имел время создания в названии.
Путь к файлу находится в переменной pathToSaveRec в самом начале скрипта. Замените на то, что вам удобно.
teadrinker Я пробовал менять путь и название, но у меня создаеться один файл с именем указынным в переменной pathToSaveRec, а как сделать так чтобы создавася каждый раз новый файл, например: record1.wav, record2.wav ...?
Попробуйте так:
num := 1
while FileExist(pathToSaveRec := A_Desktop . "\record" . num . ".wav")
num++
teadrinker Почти получилось! создаються файлы, но надо перезагружать скрипт, чтобы файлы создавались, иначе последний перезаписываеться.
CapsLock::
num := 1
while FileExist(pathToSaveRec := A_Desktop . "\record" . num . ".wav")
num++
Record()
KeyWait, CapsLock
Record("stop", pathToSaveRec)
Return
Record(mode := "start", filePath := "") {
commands := { start: ["open new type waveaudio alias recsound", "record recsound"]
, stop: ["save recsound " . filePath, "close recsound"] }
for k, v in commands[mode]
DllCall("Winmm\mciSendString", Str, v, Str, "", UInt, 0, Ptr, 0)
}
teadrinker Спасибо огромное, за помощь!
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться