我目前正在尝试使用Asset Store中的Mobile Speech Recognizer插件在Unity项目中实现android语音识别。一般来说,这是我第一次使用语音识别。
当前问题是我不断收到Android Speech Recognizer错误代码2,这意味着还有其他与网络相关的错误。搜索解决方案2天后,我无法解决此错误。我还尝试阅读资产文档并联系开发人员。
我使用Unity开发项目,并使用Android Studio仿真器测试和运行该项目,因为Unity本身无法运行Speech Recognizer插件。以下是分别在SetLanguage场景和ExampleScene场景上使用的两个脚本。请不要介意手动设置检测语言,因为我希望该项目始终使用英语。
如果对“其他与网络相关的错误”有更清晰的定义,请说清楚,因为它有点含糊。
SetLanguage场景
using UnityEngine;
using UnityEngine.SceneManagement;
using System.Collections.Generic;
using UnityEngine.UI;
using KKSpeech;
namespace KKSpeech {
public class SpeechRecognitionLanguageDropdown : MonoBehaviour {
private Dropdown dropdown;
private List<LanguageOption> languageOptions;
void Start () {
dropdown = GetComponent<Dropdown>();
dropdown.onValueChanged.AddListener(OnDropdownValueChanged);
//dropdown.ClearOptions();lo
dropdown.options[0].text = "en-US";
GameObject.FindObjectOfType<SpeechRecognizerListener>().
onSupportedLanguagesFetched.
AddListener(OnSupportedLanguagesFetched);
SpeechRecognizer.GetSupportedLanguages();
SpeechRecognizer.SetDetectionLanguage("en-US");
}
// remember to add ExampleScene to Build Settings!
public void GoToRecordingScene() {
SceneManager.LoadScene("ExampleScene");
}
void OnDropdownValueChanged(int index) {
LanguageOption languageOption = languageOptions[index];
//SpeechRecognizer.SetDetectionLanguage(languageOption.id);
SpeechRecognizer.SetDetectionLanguage("en-US");
}
void OnSupportedLanguagesFetched(List<LanguageOption> languages) {
List<Dropdown.OptionData> dropdownOptions = new List<Dropdown.OptionData>();
foreach (LanguageOption langOption in languages) {
dropdownOptions.Add(new Dropdown.OptionData(langOption.displayName));
}
//dropdownOptions.Add(new Dropdown.OptionData("English (United States)"));
dropdown.AddOptions(dropdownOptions);
languageOptions = languages;
}
}
}
ExampleScene
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using KKSpeech;
public class RecordingCanvas : MonoBehaviour {
public Button startRecordingButton;
public Text resultText;
void Start() {
if (SpeechRecognizer.ExistsOnDevice()) {
SpeechRecognizerListener listener = GameObject.FindObjectOfType<SpeechRecognizerListener>();
listener.onAuthorizationStatusFetched.AddListener(OnAuthorizationStatusFetched);
listener.onAvailabilityChanged.AddListener(OnAvailabilityChange);
listener.onErrorDuringRecording.AddListener(OnError);
listener.onErrorOnStartRecording.AddListener(OnError);
listener.onFinalResults.AddListener(OnFinalResult);
listener.onPartialResults.AddListener(OnPartialResult);
listener.onEndOfSpeech.AddListener(OnEndOfSpeech);
startRecordingButton.enabled = false;
SpeechRecognizer.RequestAccess();
} else {
resultText.text = "Sorry, but this device doesn't support speech recognition";
startRecordingButton.enabled = false;
}
}
public void OnFinalResult(string result) {
resultText.text = result;
}
public void OnPartialResult(string result) {
resultText.text = result;
}
public void OnAvailabilityChange(bool available) {
startRecordingButton.enabled = available;
if (!available) {
resultText.text = "Speech Recognition not available";
} else {
resultText.text = "Say something :-)";
}
}
public void OnAuthorizationStatusFetched(AuthorizationStatus status) {
switch (status) {
case AuthorizationStatus.Authorized:
startRecordingButton.enabled = true;
break;
default:
startRecordingButton.enabled = false;
resultText.text = "Cannot use Speech Recognition, authorization status is " + status;
break;
}
}
public void OnEndOfSpeech() {
startRecordingButton.GetComponentInChildren<Text>().text = "Start Recording";
}
public void OnError(string error) {
Debug.LogError(error);
resultText.text = "Something went wrong... Try again! \n [" + error + "]";
startRecordingButton.GetComponentInChildren<Text>().text = "Start Recording";
}
public void OnStartRecordingPressed() {
if (SpeechRecognizer.IsRecording()) {
SpeechRecognizer.StopIfRecording();
startRecordingButton.GetComponentInChildren<Text>().text = "Start Recording";
} else {
SpeechRecognizer.StartRecording(true);
startRecordingButton.GetComponentInChildren<Text>().text = "Stop Recording";
resultText.text = "Say something :-)";
}
}
}