2016-08-05 17 views
0

私はMicrosoft認知サービス - 音声認識をAndroidアプリケーションで使用しています。コードが主なアクティビティにあるときはすべてうまく動作しますが、音声認識に対応する部分を新しいクラスに移動したいときはエラーが発生します。別のクラスマイクロソフトコグニティブ音声サービス - Android

public class SpeechRecognition implements ISpeechRecognitionServerEvents 
{ 
int m_waitSeconds = 0; 
private MicrophoneRecognitionClient micClient = null; 
private FinalResponseStatus isReceivedResponse =FinalResponseStatus.NotReceived; 

private Boolean speechIntent = false; 
private SpeechRecognitionMode speechMode=SpeechRecognitionMode.ShortPhrase; 

public enum FinalResponseStatus { NotReceived, OK } 

/** 
* Gets the primary subscription key 
*/ 
public String getPrimaryKey() { 
    return Integer.toString(R.string.primaryKey); 
} 
/** 
* Gets the secondary subscription key 
*/ 
public String getSecondaryKey() { 
    return Integer.toString(R.string.secondaryKey); 
} 

/** 
* Gets the LUIS application identifier. 
* @return The LUIS application identifier. 
*/ 
private String getLuisAppId() { 
    return Integer.toString(R.string.luisAppID); 
} 

/** 
* Gets the LUIS subscription identifier. 
* @return The LUIS subscription identifier. 
*/ 
private String getLuisSubscriptionID() { 
    return Integer.toString(R.string.luisSubscriptionID); 
} 

/** 
* Gets the default locale. 
* @return The default locale. 
*/ 
private String getDefaultLocale() { 
    return "en-us"; 
} 

public void startSpeechRecognition() { 

    this.m_waitSeconds = this.speechMode == SpeechRecognitionMode.ShortPhrase ? 20 : 200; 

    if (this.micClient == null) { 
     if (this.speechIntent) { 
      this.micClient = SpeechRecognitionServiceFactory.createMicrophoneClientWithIntent(
          this.getDefaultLocale(), 
          this, 
          this.getPrimaryKey(), 
          this.getSecondaryKey(), 
          this.getLuisAppId(), 
          this.getLuisSubscriptionID()); 
     } 
     else 
     { 
      this.micClient = SpeechRecognitionServiceFactory.createMicrophoneClient(
        this.speechMode, 
        this.getDefaultLocale(), 
        this, 
        this.getPrimaryKey(), 
        this.getSecondaryKey()); 

     } 
    } 

    this.micClient.startMicAndRecognition(); 


} 

public void endSpeechRecognition(){ 
    this.micClient.endMicAndRecognition(); 
} 


public void onFinalResponseReceived(final RecognitionResult response) { 
    boolean isFinalDicationMessage = this.speechMode == SpeechRecognitionMode.LongDictation && 
      (response.RecognitionStatus == RecognitionStatus.EndOfDictation || 
        response.RecognitionStatus == RecognitionStatus.DictationEndSilenceTimeout); 
    if (null != this.micClient && ((this.speechMode == SpeechRecognitionMode.ShortPhrase) || isFinalDicationMessage)) { 
     // we got the final result, so it we can end the mic reco. No need to do this 
     // for dataReco, since we already called endAudio() on it as soon as we were done 
     // sending all the data. 
     this.micClient.endMicAndRecognition(); 
    } 

    if (isFinalDicationMessage) { 
     this.isReceivedResponse = FinalResponseStatus.OK; 
    } 

    Confidence cMax = Confidence.Low; 
    int iMax = 0; 
    if (!isFinalDicationMessage && response.Results.length != 0) { 
     for (int i = 0; i < response.Results.length; i++) { 
      //get the text with highest confidence: 
      if(response.Results[i].Confidence.getValue() > cMax.getValue()){ 
       cMax = response.Results[i].Confidence; 
       iMax = i; 
      } 
     } 
     System.out.println("Action to take: " + response.Results[iMax].DisplayText); 
    } 

} 

/** 
* Called when a final response is received and its intent is parsed 
*/ 
public void onIntentReceived(final String payload) { 
    System.out.println("--- Intent received by onIntentReceived() ---"); 
    System.out.println(payload); 
} 

public void onPartialResponseReceived(final String response) { 
    System.out.println("--- Partial result received by onPartialResponseReceived() ---"); 
    System.out.println(response); 
} 

public void onError(final int errorCode, final String response) { 
    System.err.println("--- Error received by onError() ---"); 
    System.err.println("Error code: " + SpeechClientStatus.fromInt(errorCode) + " " + errorCode); 
    System.err.println("Error text: " + response); 
} 

/** 
* Called when the microphone status has changed. 
* @param recording The current recording state 
*/ 
public void onAudioEvent(boolean recording) { 
    System.out.println("--- Microphone status change received by onAudioEvent() ---"); 
    System.out.println("********* Microphone status: " + recording + " *********"); 
    if (recording) { 
     System.out.println("Please start speaking."); 
    } 

    if (!recording) { 
     this.micClient.endMicAndRecognition(); 
    } 
} 

}

あなたはクリアすることができ、メイン活性

int m_waitSeconds = 0; 
MicrophoneRecognitionClient micClient = null; 
FinalResponseStatus isReceivedResponse = FinalResponseStatus.NotReceived; 
Boolean speechIntent = false; 
SpeechRecognitionMode speechMode = SpeechRecognitionMode.ShortPhrase; 

public enum FinalResponseStatus { NotReceived, OK } 

/** 
* Gets the primary subscription key 
*/ 
public String getPrimaryKey() { 
    return this.getString(R.string.primaryKey); 
} 

/** 
* Gets the secondary subscription key 
*/ 
public String getSecondaryKey() { 
    return this.getString(R.string.secondaryKey); 
} 

/** 
* Gets the LUIS application identifier. 
* @return The LUIS application identifier. 
*/ 
private String getLuisAppId() { 
    return this.getString(R.string.luisAppID); 
} 

/** 
* Gets the LUIS subscription identifier. 
* @return The LUIS subscription identifier. 
*/ 
private String getLuisSubscriptionID() { 
    return this.getString(R.string.luisSubscriptionID); 
} 

/** 
* Gets the default locale. 
* @return The default locale. 
*/ 
private String getDefaultLocale() { 
    return "en-us"; 
} 


/** 
* Handles the Click event of the _startButton control. 
*/ 
private void StartButton_Click(View v) { 

    this.m_waitSeconds = this.speechMode == SpeechRecognitionMode.ShortPhrase ? 20 : 200; 

    if (this.micClient == null) { 
     if (this.speechIntent) { 
      this.WriteLine("--- Start microphone dictation with Intent detection ----"); 

      this.micClient = SpeechRecognitionServiceFactory.createMicrophoneClientWithIntent(
          this, 
          this.getDefaultLocale(), 
          this, 
          this.getPrimaryKey(), 
          this.getSecondaryKey(), 
          this.getLuisAppId(), 
          this.getLuisSubscriptionID()); 
     } 
     else 
     { 
      this.micClient = SpeechRecognitionServiceFactory.createMicrophoneClient(
        this, 
        this.speechMode, 
        this.getDefaultLocale(), 
        this, 
        this.getPrimaryKey(), 
        this.getSecondaryKey()); 
     } 
    } 

    this.micClient.startMicAndRecognition(); 
} 

public void onFinalResponseReceived(final RecognitionResult response) { 
    boolean isFinalDicationMessage = this.speechMode == SpeechRecognitionMode.LongDictation && 
      (response.RecognitionStatus == RecognitionStatus.EndOfDictation || 
        response.RecognitionStatus == RecognitionStatus.DictationEndSilenceTimeout); 
    if (null != this.micClient && ((this.speechMode == SpeechRecognitionMode.ShortPhrase) || isFinalDicationMessage)) { 
     // we got the final result, so it we can end the mic reco. No need to do this 
     // for dataReco, since we already called endAudio() on it as soon as we were done 
     // sending all the data. 
     this.micClient.endMicAndRecognition(); 
    } 

    if (isFinalDicationMessage) { 
     this.isReceivedResponse = FinalResponseStatus.OK; 
    } 

    Confidence cMax = Confidence.Low; 
    int iMax = 0; 
    if (!isFinalDicationMessage && response.Results.length != 0) { 
     for (int i = 0; i < response.Results.length; i++) { 
      //get the text with highest confidence: 
      if(response.Results[i].Confidence.getValue() > cMax.getValue()){ 
       cMax = response.Results[i].Confidence; 
       iMax = i; 
      } 
     } 
     this.WriteLine(response.Results[iMax].DisplayText); 
    } 

} 



/** 
* Called when a final response is received and its intent is parsed 
*/ 

public void onIntentReceived(final String payload) { 
    this.WriteLine("--- Intent received by onIntentReceived() ---"); 
    this.WriteLine(payload); 
    this.WriteLine(); 
} 

public void onPartialResponseReceived(final String response) { 
    this.WriteLine("--- Partial result received by onPartialResponseReceived() ---"); 
    this.WriteLine(response); 
    this.WriteLine(); 
} 

public void onError(final int errorCode, final String response) { 
    this.WriteLine("--- Error received by onError() ---"); 
    this.WriteLine("Error code: " + SpeechClientStatus.fromInt(errorCode) + " " + errorCode); 
    this.WriteLine("Error text: " + response); 
    this.WriteLine(); 
} 

/** 
* Called when the microphone status has changed. 
* @param recording The current recording state 
*/ 
public void onAudioEvent(boolean recording) { 
    if (!recording) { 
     this.micClient.endMicAndRecognition(); 
    } 
} 

/** 
* Writes the line. 
*/ 
private void WriteLine() { 
    this.WriteLine(""); 
} 

/** 
* Writes the line. 
* @param text The line to write. 
*/ 
private void WriteLine(String text) { 
    System.out.println(text); 
} 

:ここ

は、コードサンプルでありますそれは基本的に同じコードですが、それは私がthis.micClient.startMicAndRecognition()を呼び出した後、onError関数でこのエラーが発生します。 :

Error code: LoginFailed -1910505470 
+0

新しいクラスで異なる 'createMicrophoneClient'コンストラクタを意図的に使用していますか?元のクラスのコンストラクタをテストしましたか? – brandall

+0

はい私は意図的に別のコンストラクタを使用しています。これは、アクティビティをパラメータとして必要としないためです。とにかく私は主なアクティビティで両方のコンストラクタを試してみましたが、うまく動作します。 MicClientを作成しようとしたときではなく、録音を開始したときにポップアップするエラーが発生した場合、コンストラクタはmicClientを返します。 @brandall – Najj

+0

その後、残っているのはスレッドの問題ですか? UIスレッドからコードを実行し、バックグラウンドスレッドをテストしてみてください。異なるスレッドからコンストラクタと 'startSpeechRecognition'を呼び出さないようにしてください。あなたの意図であれば 'MicrophoneRecognitionClient'を' volatile'に設定してテストしてください。 – brandall

答えて

0

私はこの問題を解決しました。 私はこのコード行で間違った主キーを取得した

public String getPrimaryKey() { 
    return Integer.toString(R.string.primaryKey); 
} 

主キーは[文字列に変換する整数として、プロセッサによって読み取ることが長すぎるので、それはあります。 getString(R.string.primaryKey)を介してメインアクティビティからプライマリキーを取得し、それをパラメータとしてSpeechRecognitionクラスのコンストラクタに渡す必要がありました。