是否有人知道Adobe AIR桌面的原生扩展程序与Google的Speech API有关?
经过几天的搜索,我遇到了2个ANE,但他们似乎都依赖于Android操作系统。即你必须定位并发布到基于Android的设备,让他们工作
http://myappsnippet.com/google-speech-api-air-native-extension/
http://blog.immanuelnoel.com/2011/12/07/new-actionscript-native-extension-speech-recognition/
这种方法也可以离线工作,但需要培训,只适用于预制的'反应
http://www.bytearray.org/?p=1151
以下是Google API的网络示例 https://www.google.com/intl/en/chrome/demos/speech.html
答案 0 :(得分:0)
我也为ios做过同样的事情。但最后我发现了一些仅与Google API集成的FLAC文件。在AIR中,这对我来说也有点好处。
http://8byte8.com/blog/2012/07/voice-recognition-ios/
just go through that URL, you will get some idea.
And the class which i made is .
package com.gmail.nxhoaf
{
import com.adobe.audio.format.WAVWriter;
import com.adobe.serialization.json.JSONDecoder;
import flash.events.ErrorEvent;
import flash.events.Event;
import flash.events.HTTPStatusEvent;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SampleDataEvent;
import flash.media.Microphone;
import flash.media.Sound;
import flash.net.FileReference;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.utils.ByteArray;
import flash.utils.Endian;
import cmodule.flac.CLibInit;
import fr.kikko.lab.ShineMP3Encoder;
//import mx.controls.Alert;
public class Recorder
{
public var CALL_BACK:Function;
private var bytes:ByteArray;
private var mic:Microphone;
private var mp3Encoder : ShineMP3Encoder;
private static const FLOAT_MAX_VALUE:Number = 1.0;
private static const SHORT_MAX_VALUE:int = 0x7fff;
public function Recorder()
{
}
public function setMicrophone (mic : Microphone) {
this.mic = mic;
}
public function getMicrophone () {
return mic;
}
public function startRecord() :void {
this.bytes = new ByteArray();
mic.gain = 100;
mic.rate = 44;
mic.setSilenceLevel(0,4000);
// Remove playback listener if any
mic.removeEventListener(SampleDataEvent.SAMPLE_DATA, onPlaying);
// Add record listener
mic.addEventListener(SampleDataEvent.SAMPLE_DATA, onRecording);
}
public function stopRecord() :void {
mic.removeEventListener(SampleDataEvent.SAMPLE_DATA,onRecording);
}
public function playback () :void {
if (bytes.length > 0) {
bytes.position = 0;
var sound:Sound = new Sound();
sound.addEventListener(SampleDataEvent.SAMPLE_DATA,onPlaying);
sound.play();
}
}
private function onRecording(event:SampleDataEvent):void {
while (event.data.bytesAvailable) {
var sample:Number = event.data.readFloat();
bytes.writeFloat(sample);
}
}
private function onPlaying(event:SampleDataEvent): void {
var sample:Number;
for (var i:int = 0; i < 8192; i++) {
if (!bytes.bytesAvailable) return;
sample = bytes.readFloat();
event.data.writeFloat(sample);
event.data.writeFloat(sample);
}
}
public function encodeToFlacAndSend() : void {
var flacCodec:Object;
flacCodec = (new cmodule.flac.CLibInit).init();
bytes.position = 0;
var rawData: ByteArray = new ByteArray();
var flacData : ByteArray = new ByteArray();
rawData = convert32to16(bytes);
flacData.endian = Endian.LITTLE_ENDIAN;
//flacData.endian = Endian.BIG_ENDIAN
flacCodec.encode( encodingCompleteHandler, encodingProgressHandler, rawData, flacData, rawData.length, 30);
function encodingCompleteHandler(event:*):void
{
trace(flacData.length.toString(),"FLACCodec.encodingCompleteHandler(event):", event);
//Alert.show(flacData.length.toString());
//var PATH:String = "https://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=en-IN";
var PATH:String = "https://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=en-IN";
var urlRequest:URLRequest = new URLRequest(PATH);
var urlLoader:URLLoader = new URLLoader();
//urlRequest.contentType = "audio/x-flac; rate=44000";
urlRequest.contentType = "audio/x-flac; rate=44000";
urlRequest.data = flacData;
urlRequest.method = URLRequestMethod.POST;
urlLoader.dataFormat = URLLoaderDataFormat.BINARY; // default
urlLoader.addEventListener(Event.COMPLETE, urlLoader_complete);
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, IOErrorOccured);
urlLoader.addEventListener(ErrorEvent.ERROR, urlLoader_error);
urlLoader.load(urlRequest);
function urlLoader_complete(evt:Event):void {
trace("MORTYYYYYYYY",urlLoader.data);
var dc:JSONDecoder = new JSONDecoder(String(urlLoader.data),true);
var ob:Object = dc.getValue();
var test:Array = ob["hypotheses"];
if(CALL_BACK != null){
if (test.length >=1){
CALL_BACK(test[0]["utterance"]);
}else {
CALL_BACK(null);
}
}
}
function urlLoader_error(evt:ErrorEvent): void {
trace("*** speech to text *** " + evt.toString());
if(CALL_BACK != null){
CALL_BACK(null);
}
}
function IOErrorOccured(evt:IOErrorEvent): void {
trace("*** IO Error Occured *** " + evt.toString());
if(CALL_BACK != null){
CALL_BACK(null);
}
}
function onHTTPResponse(eve:HTTPStatusEvent):void{
trace("*** HTTP Error Occured *** " + eve.toString());
}
}
function encodingProgressHandler(progress:int):void {
// trace("FLACCodec.encodingProgressHandler(event):", progress);;
}
}
/**
* Converts an (raw) audio stream from 32-bit (signed, floating point)
* to 16-bit (signed integer).
*
* @param source The audio stream to convert.
*/
private function convert32to16(source:ByteArray):ByteArray {
// trace("BitrateConvertor.convert32to16(source)", source.length);
var result:ByteArray = new ByteArray();
result.endian = Endian.LITTLE_ENDIAN;
while( source.bytesAvailable ) {
var sample:Number = source.readFloat() * SHORT_MAX_VALUE;
// Make sure we don't overflow.
if (sample < -SHORT_MAX_VALUE) sample = -SHORT_MAX_VALUE;
else if (sample > SHORT_MAX_VALUE) sample = SHORT_MAX_VALUE;
result.writeShort(sample);
}
// trace(" - result.length:", result.length);
result.position = 0;
return result;
}
/**
* Save recorded audio stream to a specific audio format
* @param soundFormat: expected sound format
*/
/* public function saveAs(soundFormat: String) {
switch(soundFormat) {
case SoundFormat.WAV:
encodeToWav(bytes);
break;
case SoundFormat.MP3:
encodeToMp3(bytes);
break;
default:
encodeToWav(bytes);
break;
}
}*/
/**
* Encode recorded audio to .wav
* @param inputStream stream which we want to encode
*
*/
private function encodeToWav(bytes:ByteArray) : void {
var wav:WAVWriter = new WAVWriter();
wav.numOfChannels = 1;
wav.sampleBitRate = 16;
wav.samplingRate = 44100;
bytes.position = 0;
var wavData : ByteArray = new ByteArray();
wavData.endian = Endian.BIG_ENDIAN;
wav.processSamples(wavData,bytes,44100,1);
//wavData.position = 0;
(new FileReference()).save(wavData, ".wav");
}
/**
* Encode recorded audio to .mp3
* @param inputStream stream which we want to encode
*
*/
private function encodeToMp3(bytes:ByteArray) : void {
var wav:WAVWriter = new WAVWriter();
wav.numOfChannels = 1;
wav.sampleBitRate = 16;
wav.samplingRate = 44100;
bytes.position = 0;
var wavData : ByteArray = new ByteArray();
wavData.endian = Endian.BIG_ENDIAN;
wav.processSamples(wavData,bytes,44100,1);
wavData.position = 0;
mp3Encoder = new ShineMP3Encoder(wavData);
mp3Encoder.addEventListener(Event.COMPLETE, mp3EncodeComplete);
mp3Encoder.addEventListener(ProgressEvent.PROGRESS, mp3EncodeProgress);
mp3Encoder.addEventListener(ErrorEvent.ERROR, mp3EncodeError);
mp3Encoder.start();
function mp3EncodeProgress(event : ProgressEvent) : void {
}
function mp3EncodeError(event : ErrorEvent) : void {
// Alert.show(event.toString());
}
function mp3EncodeComplete(event : Event) : void {
// mp3Encoder.saveAs();
}
}
}
}
//import com.gmail.nxhoaf;