Кодек Flash SPEEX для Google Speech API - сложная задача - PullRequest
0 голосов
/ 01 сентября 2011

Люди разобрались, как использовать Google Speech API (Speech-To-Text). Я пытаюсь заставить его работать с кодеком Flash Speex, и я просто не могу понять это. Я пытался вставить байт размера кадра перед каждыми 160 байтами (как говорят некоторые источники), но это не работает.

Итак, я отправляю запрос на то, чтобы как-то перевести флэш-speex-байты для понимания Google Speech API.

Вот основной гибкий код:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           creationComplete="init();">
<fx:Script>
    <![CDATA[
        // Speech API info
        // Reference: http://mikepultz.com/2011/03/accessing-google-speech-api-chrome-11/,
        // Reference: /3397797/est-li-v-chrome-vstroennoe-raspoznavanie-rechi-dlya-elementov-vvoda-x-webkit-speech
        private static const speechApiUrl:String = "http://www.google.com/speech-api/v1/recognize";
        private static const speechLanguage:String = "en";
        private static const mimeType:String = "audio/x-speex-with-header-byte";
        private static const sampleRate:uint = 8;

        // Sound bytes & mic
        private var soundBytes:ByteArray;
        private var microphone:Microphone;

        // Initial setup        
        private function init():void {
            // Set up the microphone
            microphone = Microphone.getMicrophone();
            // Speech API supports 8khz and 16khz rates
            microphone.rate = sampleRate;
            // Select the SPEEX codec
            microphone.codec = SoundCodec.SPEEX;
            // I don't know what effect this has...
            microphone.framesPerPacket = 1;
        }

        // THIS IS THE CHALLENGE
        // We have the flash speex bytes and we need to translate them so Google API understands
        private function process():void{
            soundBytes.position = 0;

            var processed:ByteArray = new ByteArray();
            processed.endian = Endian.BIG_ENDIAN;
            var frameSize:uint = 160;

            for(var n:uint = 0; n < soundBytes.bytesAvailable / frameSize; n++){
                processed.writeByte(frameSize);

                processed.writeBytes(soundBytes, frameSize * n, frameSize);
            }

            processed.position = 0;

            soundBytes = processed;
        }

        // Sending to Google Speech server
        private function send():void {
            var loader:URLLoader = new URLLoader();

            var request:URLRequest = new URLRequest(speechApiUrl + "?lang=" + speechLanguage);
            request.method = URLRequestMethod.POST;
            request.data = soundBytes;
            request.contentType = mimeType + "; rate=" + (1000 * sampleRate);

            loader.addEventListener(Event.COMPLETE, onComplete);
            loader.addEventListener(IOErrorEvent.IO_ERROR, onError);
            loader.load(request);

            trace("Connecting to Speech API server");
        }

        private function onError(event:IOErrorEvent):void{
            trace("Error: " + event.toString());
        }

        private function onComplete(event:Event):void{
            trace("Done: " + event.target.data);
        }

        private function record(event:Event):void{
            soundBytes = new ByteArray();
            soundBytes.endian = Endian.BIG_ENDIAN;

            microphone.addEventListener(SampleDataEvent.SAMPLE_DATA, sampleData);
        }

        private function sampleData(event:SampleDataEvent):void {               
            soundBytes.writeBytes(event.data, 0, event.data.bytesAvailable);
        }

        private function stop(e:Event):void {
            microphone.removeEventListener(SampleDataEvent.SAMPLE_DATA, sampleData);

            if(soundBytes != null){
                process();
                send();
            }
        }       
    ]]>
</fx:Script>

<s:HGroup>
    <s:Button label="Record"
              click="record(event)"/>
    <s:Button label="Stop and Send"
              click="stop(event)"/>
</s:HGroup>
</s:Application>

Для получения дополнительной информации проверьте следующие ссылки: http://mikepultz.com/2011/03/accessing-google-speech-api-chrome-11/ и Есть ли в Chrome встроенное распознавание речи для элементов ввода "x-webkit-speech"?

1 Ответ

0 голосов
/ 17 сентября 2011

Код, который вы ищете, находится по адресу http://src.chromium.org/viewvc/chrome/trunk/src/content/browser/speech/speech_recognizer.cc?view=diff&r1=79556&r2=79557 вокруг строк 100-160, которые в свою очередь #include ... / viewvc / chrome / trunk / deps / third_party / speex /

Однако Chrome переключился с Speex на FLAC в конце марта без какого-либо реального объяснения в журнале изменений - http://src.chromium.org/viewvc/chrome/trunk/src/content/browser/speech/speech_recognizer.cc?view=diff&r1=79556&r2=79557 - поэтому я бы не советовал использовать Speex. С другой стороны, кто-то посмотрел на источник Android и сказал, что они по-прежнему используют Speex там, так что, скорее всего, они его сохранят (это менее одной пятой количества байтов в секунду).

...