Что нового

Распознание голоса(Google)

Arei

Скриптер
Сообщения
938
Репутация
115
Как я уже писал в первой статье, для синтеза и распознавания голоса мы воспользуемся сервисами компании Google. Я думаю, многие сталкивались на мобильных устройствах под управлением ОС Android с голосовым поиском. Как дополнительная функцию, этот самый голосовой поиск был добавлен в браузер Google Chrome. Следует заметить, что официального API для этого сервиса компания еще не анонсировала, но благодаря открытым исходникам Chrome, народные умельцы нашли, что и куда посылается и что и как отдается в ответ. Выглядит это так:

Записываем wav-файл с частотой дискретизации звука 16000 Гц, моно
Перекодируем получившийся файл в формат flac
Отсылаем файл по адресу https://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=ru-RU, представлясь гуглу клиентом Chrome
Получаем ответ в формате JSON


Ответ представляет собой нечто вида:

{"status":0,"id":"84e03bf4efe17fa7856333560d6faba4-1","hypotheses":[{"utterance":"раз два три","confidence":0.85437811}]}
Нас интересуют в ответе лишь два последних поля — utterance и confidence. Первое является искомой распознанной словом/фразой, второе — достоверностью распознавания. Если confidence будет более 0.5, можно считать, что распознавание достоверно.

Текст был взят с сайт habrahabr.ru
Вопрос заключается в следующем,как это реализовать на autoit?



Добавлено:
Сообщение автоматически объединено:

Могу прикрепить проекты на Perl и на C#.Если требуется.
P.s Код PErl под линукс.Т.к для Windows нет библиотек.
файл С# http://rghost.ru/25223881
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
вот мини версия отправки файлов на сервер.
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
меня сильнее всего интересует вопрос как
Отсылаем файл по адресу https://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=ru-RU, представлясь гуглу клиентом Chrome
Получаем ответ в формате JSON
Подскажите пожалуйста
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
сделал на Perl.Скажите,а есть теория про конвертацию wave в flac?Но вопрос остаётся, что бы полностью сделать на Autoit.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Arei [?]
представлясь гуглу клиентом Chrome
Я этим сервисом не пользовался, но можно так попробовать представиться Chrome при отправке запроса:
Код:
;...
$oHTTP.SetRequestHeader('User-Agent', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1')
;...
У меня эту строку показывает HttpAnalyzer при открытии страниц в Chrome.
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
Мне бы полный запрос, подскажите пожалуйста.
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
axlworСпасибо почитаю.
madmasles нет обычный файл flac(не бинарник),а точно я не знаю.


Добавлено:
Сообщение автоматически объединено:

Спасибо madmasles я сделал=)
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
madmasles ,а у вас случаем не 7?


Добавлено:
Сообщение автоматически объединено:

просто на 7 работает,а на xp нет.


Добавлено:
Сообщение автоматически объединено:

вот код запроса.

Код:
$west = _SendGogle("1.flac")
ConsoleWrite( $west)

func _SendGogle($otvet)

$oRequest = ObjCreate('WinHttp.WinHttpRequest.5.1') ;Создаём COM-объект
$w = FileOpen($otvet,16)

$we = FileRead($w)

If @error Then
    MsgBox(16, 'Ошибка', 'Ошибка при создании объекта "WinHttp.WinHttpRequest.5.1".')
    Exit 1
EndIf

$oErrorHandler = ObjEvent('AutoIt.Error', 'ErrorFunc') ;Создаём обработчик ошибок (COM Error Handling http://www.autoitscript.com/autoit3/docs/intro/ComRef.htm)



$oRequest.Open('POST', 'https://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=ru-RU', 0) ;Создаём соеденение, указываем адрес страницы
$oRequest.SetRequestHeader('User-Agent', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1')
$oRequest.SetRequestHeader('Content-Type', 'audio/x-flac; rate=8000') ;Указываем заголовок Content-Type (необходимо для POST-запроса (Content-Length указывается автоматически))
$oRequest.Send($we) ;отправляем запрос
$sData = $oRequest.ResponseText

$oErrorHandler = 0 ;выключаем обработчик ошибок
Return $sData
EndFunc



Добавлено:
Сообщение автоматически объединено:




Добавлено:
Сообщение автоматически объединено:

я выкладывал звук кто может проверить на Xp.Заранее спасибо.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Arei [?]
просто на 7 работает,а на xp нет.
У меня на XP SP3 ответ пришел:
Код:
{"status":0,"id":"36c97674b567bd297464db712ebc2ffb-1","hypotheses":[{"utterance":"1 2 раз","confidence":0.48597667}]}
с файлом my.flac.
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
можете проверить новый файл, для проверки convert'ёра.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Arei [?]
можете проверить новый файл, для проверки convert'ёра.
Сам я не понял, что за слово :smile:, но Google говорит, что это:
Код:
{"status":0,"id":"74d88fd35d884e72daa236f7460c1b80-1","hypotheses":[{"utterance":"ппц","confidence":0.20360023}]}
А что за конвертер, если не секрет?
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
конвертёр написан на C# с wav на flac перегоняет,вот хочу способ найти для Autoit.Т.к Google только flac принимает.


Добавлено:
Сообщение автоматически объединено:

Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/A.B (KHTML, like Gecko) Chrome/X.Y.Z.W Safari/A.B.
нашёл такое обозначение User-Agent.Вроде работает.
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
Спасибо,ещё 1 вопрос. запись звука на xp нашёл,переделал под свою частоту и работает, а на 7 нет.
Код:
#include <BassEnc.au3>

Opt("GUIOnEventMode", 1)

Global $device, $input, $EncHandle, $RecHandle, $Bitrate = 128, $KHZ = 22050 , $levels, $levelL = 0, $levelR = 0, $temp, $EncState = False

$bass_dll = DllOpen("bass.dll")
$bassenc_dll = DllOpen("bassenc.dll")


_BASS_SetConfig($bass_dll, $BASS_CONFIG_REC_BUFFER, 1000)

$device = _GetDevices()
_BASS_RecordInit($bass_dll, $device)
$input = _GetInputs()
$RecHandle = _BASS_RecordStart($bass_dll, $KHZ, 1, _makelong($BASS_SAMPLE_FX, 500), "_RecCallBack")

MsgBox("","",1)

_Start()
sleep(5000)
_Stop()
MsgBox("","",1)
Func _Start()

$EncHandle = _BASS_Encode_Start($bass_dll, $bassenc_dll, $RecHandle, @ScriptDir & "\6.wav", $BASS_ENCODE_PCM)

EndFunc

Func _Stop()

	_BASS_Encode_Stop($bass_dll, $bassenc_dll, $EncHandle)

EndFunc

Func _RecCallBack($handle, $buffer, $length, $user)
	Return 1
EndFunc



Func _GetDevices()
	Local $count = 0, $info, $name = "", $sdef = "", $idef = 0
	While 1
		$info = _BASS_RecordGetDeviceInfo($bass_dll, $count)
		If @error Then ExitLoop
		$count += 1
		If BitAND($info[2], $BASS_DEVICE_ENABLED) Then $name &= $info[0] & "|"
		If BitAND($info[2], $BASS_DEVICE_DEFAULT) Then
			$sdef = $info[0]
			$idef = $count
		EndIf
	WEnd

	Return $idef - 1
EndFunc

Func _GetInputs()
	Local $count = 0, $info, $name = "", $flags, $sdef = "", $idef = 0
	$info = _BASS_RecordGetInputName($bass_dll, $count)
	While $info <> ""
		$flags = _BASS_RecordGetInput($bass_dll, $count)
		$count += 1
		$name &= $info & "|"
		If BitAND($flags[0], $BASS_INPUT_OFF) = 0 Then
			$sdef = $info
			$idef = $count
		EndIf
		$info = _BASS_RecordGetInputName($bass_dll, $count)
	WEnd

	Return $idef - 1
EndFunc

Func _Exit()
	If _BASS_Encode_IsActive($bass_dll, $bassenc_dll, $EncHandle) Then _BASS_Encode_Stop($bass_dll, $bassenc_dll, $EncHandle)
	_BASS_RecordFree($bass_dll)
	Exit
EndFunc




Добавлено:
Сообщение автоматически объединено:

madmasles,спасибо, но наверное оставлю свой на C# т.к быстрый и уже стабильно работает.Осталось с звуком разобраться, почему на 7 не пашёт.
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
жалко,думаю кто нибудь протестирует.что бы всё вместе собрать и не было проблем,с версией Windows.


Добавлено:
Сообщение автоматически объединено:

Пробую разные способы запросов для xp
Код:
#include "WinHttp.au3"
$w = FileOpen("1.flac",16)

$we = FileRead($w)
$hOpen = _WinHttpOpen('Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/A.B (KHTML, like Gecko) Chrome/X.Y.Z.W Safari/A.B') ;инициализируем использование WinHTTP-функций, указываем заголовок User-Agent

If @error Then
    MsgBox(16, 'Ошибка', 'Не удалось инициализировать использование WinHttp-функций.')
    Exit 1
EndIf

$hConnect = _WinHttpConnect($hOpen, 'www.google.com') ;создаём соеденение, указываем только домен/ip-адрес

If @error Then
    MsgBox(16, 'Ошибка', 'Не удалось создать соеденение.')
    Exit 2
EndIf

$sData = _WinHttpSimpleRequest($hConnect, 'POST', 'https://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=ru-RU', Default, $we) ;отправляем запрос, указываем его метод, адрес страницы без домена и параметры

If @error Then
    MsgBox(16, 'Ошибка', 'Не удалось отправить сообщение.')
    Exit 3
EndIf

_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)

MsgBox(0, 'Data', $sData)

у вас он работает?
 
Верх