Что нового

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

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Arei [?]
у вас он работает?
Так нет.

Так у меня на XP работает:
Код:
#include 'WinHttp.au3'

$sResult = ''
$sHeader = ''
$iError = 1
$hFile = FileOpen(@ScriptDir & '\1.flac', 16)
$bRead = FileRead($hFile)
FileClose($hFile)
If Not $bRead Then Exit

For $i = 1 To 1
	$hOpen = _WinHttpOpen('Chrome/14.0.835.202')
	If @error Then ExitLoop
	$hConnect = _WinHttpConnect($hOpen, 'www.google.com')
	If @error Then ExitLoop
	$hRequest = _WinHttpOpenRequest($hConnect, 'POST', '/speech-api/v1/recognize?xjerr=1&client=chromium&lang=ru-RU')
	If @error Then ExitLoop
	_WinHttpAddRequestHeaders($hRequest, 'Content-Type: audio/x-flac; rate=8000')
	If @error Then ExitLoop
	_WinHttpSendRequest($hRequest, 'Accept: */*', $bRead, BinaryLen($bRead))
	If @error Then ExitLoop
	_WinHttpReceiveResponse($hRequest)
	If @error Then ExitLoop
	If _WinHttpQueryDataAvailable($hRequest) Then
		$sResult = _WinHttpReadData($hRequest, 1)
		$sHeader = _WinHttpQueryHeaders($hRequest)
		$iError = 0
	Else
		MsgBox(16, 'Error', 'Error')
	EndIf
Next
_WinHttpCloseHandle($hRequest)
_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)
If $iError Then
	ConsoleWrite('Error' & @LF)
Else
	ConsoleWrite('sHeader: ' & $sHeader & @LF)
	ConsoleWrite('------------------' & @LF)
	ConsoleWrite('sResult: ' & $sResult & @LF)
	ConsoleWrite('Word: ' & StringRegExpReplace($sResult, '.*utterance":"(.*?)","confidence.*', '$1') & @LF)
EndIf
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
Проверьте кто нибудь запись звука с микрофона.на windows 7.Заранее спасибо.
 

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Привет всем :smile:
Я не как не могу сделать POST запрос, помогите пожалуйста.
Код:
$sDomain = 'www.google.ru' ;домен или ip-адрес
$iPort = 80 ;порт

$Open = FileOpen(@ScriptDir & '\au3.flac',16)
$sParameters = FileRead($Open)

;Запрос, который будет отправлен серверу
$sRequest = 'POST /speech-api/v1/recognize?xjerr=1&client=chromium&lang=ru-RU HTTP/1.1' & @CRLF ;Request-строка
$sRequest &= 'Connection: close' & @CRLF ;Заголовки
$sRequest &= 'Accept: '& $sParameters &', */*' & @CRLF
$sRequest &= "User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1" & @CRLF
$sRequest &= 'Host: '& $sDomain & @CRLF
$sRequest &= 'Content-Type: audio/x-flac; rate=16000' & @CRLF ;Указываем заголовок Content-Type (необходимо для POST-запроса)
$sRequest &= 'Content-Length: ' & StringLen($sParameters) & @CRLF ;Указываем заголовок Content-Length (необходимо для POST-запроса)
$sRequest &= @CRLF ;Заголовки от параметров отделяет пустая строка
$sRequest &= $sParameters ;Параметры в запросе

If TCPStartup() = 0 Then ;запускаем TCP/UDP-службы
    MsgBox(16, 'Ошибка', 'Не удалось запустить TCP/UDP-службы.')
    Exit 1
EndIf

$sIP = TCPNameToIP($sDomain) ;получаем ip-адрес

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

$iSocket = TCPConnect($sIP, $iPort) ;соединяемся с сервером

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

TCPSend($iSocket, $sRequest) ;отправляем сообщение

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

$sData = ''
$iTimer = TimerInit() ;запускаем таймер

Do
    $sBuffer = TCPRecv($iSocket, 1024*4) ;получаем часть сообщения сервера
    $iError = @error
    If Not $sBuffer = '' Then ;если удалось получить сообщение
        $sData &= $sBuffer ;сохраняем полученное сообщение
        $iTimer = TimerInit() ;обнуляем таймер
    EndIf
Until $iError <> 0 Or TimerDiff($iTimer) > 50000 ;если при получении сообщения произошла ошибка (данные получены, соединение закрыто) или в течении 5 секунд ничего не было получено, выход из цикла

TCPCloseSocket($iSocket)
TCPShutdown()

$aData = StringRegExp($sData, '(?s)(.*?)\r\n\r\n(.*)', 3) ;отделяем http-заголовки от тела сообщения ('заголовки' & @CRLF & @CRLF & 'тело')

If @error Then
    MsgBox(16, 'Ошибка', 'Полученные данные неверны.'&@CRLF&$sData)
    Exit 5
EndIf
ConsoleWrite($sData&@CRLF)
MsgBox(0, 'Data', $aData[1])




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

Все, я сделал.
 

swyatogor

Новичок
Сообщения
1
Репутация
0
так и не понятно.. сделал кто-нить полностью весь пакет или нет.. от захвата звука до получения текста..??
 

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
swyatogor
Я делал, но на форум не выкладывал... Оставил в тайне ото всех. :smile:
Но сейчас почему-то этот способ не работает.
 
Автор
A

Arei

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

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Ganibal95 [?]
Я делал, но на форум не выкладывал... Оставил в тайне ото всех.
smiley.gif
Arei [?]
да сделали, но оставили каждый у себя.
что тогда делаете на этом форуме?
 

Dark-Side

Знающий
Сообщения
72
Репутация
17
OffTopic:
В тех же python/c++/c#/java написать то что хочет автор топика можно в сто раз удобнее и быстрее. Там есть библиотеки для формирования json, библиотеки для flac и т.п. Требования как бы уже выходят за пределы скриптового языка типа AutoIt, по крайней мере пока подобных библиотек нет.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Makc
python тоже скриптовый :smile:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Makc [?]
Вам лишь бы к слову придраться
grin.gif
нет, это не так. я лишь сказал, что python это такой же скриптовый и интерпретируемый язык с тем же уровнем абстракции, что и AutoIt. но реализация данной задачи не выходит за ее пределы. на самом деле реализации данной задачи не выходит и за пределы самого AutoIt.
вот JSON UDF Library (fully RFC4627-compliant) ну или на крайняк регулярные выражения.
по поводу flac, то тут надо разбираться с программой записи речи в файл и выставлять там нужные опции типа запись во flac и так далее. для post и get запросов можно воспользоваться стандартным WinHTTPRequest.
 

Andrey145

Новичок
Сообщения
25
Репутация
0
Выложите пожалуйста готовое решение ( запись - конвертирование во .flac - отправка запроса на google.com) или хотябы рабочее по частям. заранее спасибо.
 

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Солидарен с Andrey145, пожалуйста, выложите готовое решение, все же как-никак полезная тема! :smile:



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

Уважаемые, протестировал Ваши коды по отправке, все не работают, но остановился на этом:
Код:
#include 'WinHttp.au3'

$sResult = ''
$sHeader = ''
$iError = 1
$hFile = FileOpen(@ScriptDir & '\1.flac', 16)
$bRead = FileRead($hFile)
FileClose($hFile)
If Not $bRead Then Exit

For $i = 1 To 1
    $hOpen = _WinHttpOpen('Chrome/14.0.835.202')
    If @error Then ExitLoop
    $hConnect = _WinHttpConnect($hOpen, 'www.google.com')
    If @error Then ExitLoop
    $hRequest = _WinHttpOpenRequest($hConnect, 'POST', '/speech-api/v1/recognize?xjerr=1&client=chromium&lang=ru-RU')
    If @error Then ExitLoop
    _WinHttpAddRequestHeaders($hRequest, 'Content-Type: audio/x-flac; rate=8000')
    If @error Then ExitLoop
    _WinHttpSendRequest($hRequest, 'Accept: */*', $bRead, BinaryLen($bRead))
    If @error Then ExitLoop
    _WinHttpReceiveResponse($hRequest)
    If @error Then ExitLoop
    If _WinHttpQueryDataAvailable($hRequest) Then
        $sResult = _WinHttpReadData($hRequest, 1)
        $sHeader = _WinHttpQueryHeaders($hRequest)
        $iError = 0
    Else
        MsgBox(16, 'Error', 'Error')
    EndIf
Next
_WinHttpCloseHandle($hRequest)
_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)
If $iError Then
    ConsoleWrite('Error' & @LF)
Else
    ConsoleWrite('sHeader: ' & $sHeader & @LF)
    ConsoleWrite('------------------' & @LF)
    ConsoleWrite('sResult: ' & $sResult & @LF)
    ConsoleWrite('Word: ' & StringRegExpReplace($sResult, '.*utterance":"(.*?)","confidence.*', '$1') & @LF)
EndIf


Вывод в консоль таков:
Код:
sHeader: HTTP/1.1 400 Bad Request
Date: Wed, 22 Oct 2014 04:37:34 GMT
Content-Type: text/html; charset=UTF-8
Server: S3 v1.0
Content-Length: 1441
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Alternate-Protocol: 80:quic,p=0.01
Connection: close


------------------
sResult:
Word:

Исходя из этого, предполагаю, что код уже не работает... Пожалуйста, подскажите, почему? :(
Может Google что-то изменил?
WinXP SP3
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Astel064 [?]
Может Google что-то изменил?
Ну так зайдите на Google и почитайте документацию! :smile:
APIv1 закрыт, теперь есть APIv2.
Однако, вы должны зарегистрироваться как Chromium Developer, чтобы получить ключик для доступа к API.
 

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Garrett [?]
Ну так зайдите на Google и почитайте документацию!
smiley.gif
APIv1 закрыт, теперь есть APIv2.Однако, вы должны зарегистрироваться как Chromium Developer, чтобы получить ключик для доступа к API.
Если Вас не затруднит, можно ссылку на документацию? :smile:
 

Andrey145

Новичок
Сообщения
25
Репутация
0
Драсте, зарегился я в google api, получил ключик , указано якобы не более 50 запросов в день.
И так начнем с начала:
нам нужно что бы скрипт записывал звук.
Код:
#include <Media.au3>
$hFile = @ScriptDir & '\1.wav'
$hMedia=_MediaCreate(6)
_MediaRecord($hMedia)
Sleep('5000')
_MediaStop($hMedia)
_MediaSave($hMedia, $hFile)
_MediaClose($hMedia)
Ура работает, записывается в wave формате. но Googl"у нужен формат Flac !

скажите пжста можно ли записать сразу во flac посредством Autoit ? ели нет то как кодировать с помощью autoita?

следующий шаг отправка файла с запросом на сервер google и получение ответа от него:
не работает ни этот:
Код:
#include 'WinHttp.au3'

$sResult = ''
$sHeader = ''
$iError = 1
$hFile = FileOpen(@ScriptDir & '\1.flac', 16)
$bRead = FileRead($hFile)
FileClose($hFile)
If Not $bRead Then Exit

For $i = 1 To 1
    $hOpen = _WinHttpOpen('Chrome/38.0.2125.104')
    If @error Then ExitLoop
    $hConnect = _WinHttpConnect($hOpen, 'www.google.com')
    If @error Then ExitLoop
    $hRequest = _WinHttpOpenRequest($hConnect, '/speech-api/v2/recognize?output=json&lang=ru-ru&key=мой ключ')
    If @error Then ExitLoop
    _WinHttpAddRequestHeaders($hRequest, 'Content-Type: audio/x-flac; rate=44100')
    If @error Then ExitLoop
    _WinHttpSendRequest($hRequest, 'Accept: */*', $bRead, BinaryLen($bRead))
    If @error Then ExitLoop
    _WinHttpReceiveResponse($hRequest)
    If @error Then ExitLoop
    If _WinHttpQueryDataAvailable($hRequest) Then
        $sResult = _WinHttpReadData($hRequest, 1)
        $sHeader = _WinHttpQueryHeaders($hRequest)
        $iError = 0
    Else
        MsgBox(16, 'Error', 'Error')
    EndIf
Next
_WinHttpCloseHandle($hRequest)
_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)
If $iError Then
    ConsoleWrite('Error' & @LF)
Else
    ConsoleWrite('sHeader: ' & $sHeader & @LF)
    ConsoleWrite('------------------' & @LF)
    ConsoleWrite('sResult: ' & $sResult & @LF)
    ConsoleWrite('Word: ' & StringRegExpReplace($sResult, '.*utterance":"(.*?)","confidence.*', '$1') & @LF)
EndIf

ни этот:
Код:
#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','/speech-api/v2/recognize?output=json&lang=ru_RU&key=мой ключ', Default, $we) ;отправляем запрос, указываем его метод, адрес страницы без домена и параметры

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

_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)
MsgBox(0, 'Data', $sData)

https://github.com/gillesdemey/google-speech-v2 здесь написано это :
Код:
--data-binary @audio/good-morning-google.flac \
--header 'Content-Type: audio/x-flac; rate=44100;' \
'https://www.google.com/speech-api/v2/recognize?output=json&lang=en-us&key=yourkey'
вроде правильно делаю.
...цель задачи совместить 3скрипта ( распознование , flac кодирование (если потребуется) и отправка - прием запроса google ) в один целый скрипт.
ps не судите строго.autoit плохо знаю..
 

Andrey145

Новичок
Сообщения
25
Репутация
0
не работает выдает первую строку всего лишь типа "result":[
вот мой ключик api
Код:
AIzaSyDB5ZL8Kv_zC2GOIGG70PWwTyfikOK8y04


Код:
#include <winhttp.au3>
#include <FileConstants.au3>

Global Const $API_KEY = 'AIzaSyDB5ZL8Kv_zC2GOIGG70PWwTyfikOK8y04'
Global Const $USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36'

main()
Exit

Func main()
   ; Local $file_path = FileOpenDialog('Укажите файл flac', @ScriptDir, 'All (*.*)', $FD_FILEMUSTEXIST)
    ;If @error Or Not FileExists($file_path) Then
        ;Return SetError(1, 'Нет файла', False)
    ;EndIf
Local $file_path = FileOpen(@ScriptDir & '\my.flac',16)

    Local $request_response = speech_api_file_recognize($file_path)

    MsgBox(0, 'Ответ', $request_response )
	ToolTip($request_response, 0, 0)
sleep (1000)
MsgBox(0, 'Ответ', $request_response )
EndFunc   ;==>main

Func speech_api_file_recognize($file_path)

    Local $h = FileOpen($file_path, $FO_READ + $FO_BINARY)
    Local $file_content = FileRead($h)
    FileClose($h)

    Local $hOpen = _WinHttpOpen($USER_AGENT)
    Local $hConnect = _WinHttpConnect($hOpen, 'www.google.com', $INTERNET_DEFAULT_HTTPS_PORT)

    Local $path = '/speech-api/v2/recognize?output=json&lang=ru-ru&key=' & $API_KEY
    Local $headers = 'Content-Type: audio/x-flac; rate=44100;' & @CRLF

    Local $request_response = _WinHttpSimpleSSLRequest($hConnect, 'POST', $path, Default, $file_content, $headers)


    _WinHttpCloseHandle($hConnect)
    _WinHttpCloseHandle($hOpen)

    Return $request_response
EndFunc   ;==>speech_api_recognize
 

Andrey145

Новичок
Сообщения
25
Репутация
0
Приложу вечером наверное,тк щаас уже не дома и через телефон


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

Вы же про my.flac файл с аудиозаписью ?


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

Windows 8 64 помоему - на ноуте,
На windows 7 32 на ПК еще не пробывал....


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

Не пробывал запускать скрипт на компе win 7 32bit. Может в разрядности разница есть?
 
Верх