Я следовал учебным пособиям Hololens, предоставленным Microsoft, и столкнулся с некоторыми проблемами, связанными со службами Azure в 301 (https://docs.microsoft.com/en-us/windows/mixed-reality/mr-azure-301#chapter-4--setup-debug-canvas) и 302 (https://docs.microsoft.com/en-us/windows/mixed-reality/mr-azure-302).). Я думаю, что проблема связана с конечной точкой, потому что код ошибки 404 появляется при проверке https://westeurope.api.cognitive.microsoft.com/.
Я использую Hololens первого поколения, Unity 2017.4.27f1, HoloToolkit-Unity-examples-2017.4.3.0 и Visual Studio Community 2017. Я пробовал некоторые учебные пособия Hololens, которые прекрасно работали с этими версиями. Мой код предоставлен Microsoft для учебных пособий 301 и 302. Я изменил расположение в Azure с
«от глобальной» до «Западной Европы», создав новую группу ресурсов и теперь в качестве конечной точки теперь https://westeurope.api.cognitive.microsoft.com/, я также создал новые ключи аутентификации для API и обновил их в своем коде.
Вместо myKey я вставил первый ключ соответствующего API (Translator Text, Computer Vision). Код ниже взят из Tutorial 302 и класса «VisionManager.cs» (который, по-видимому, является ответственным за связь со службами API Computer Vision).
public static VisionManager instance;
// you must insert your service key here!
private string authorizationKey = "myKey";
private const string ocpApimSubscriptionKeyHeader = "Ocp-Apim-Subscription-Key";
private string visionAnalysisEndpoint = "https://westcentralus.api.cognitive.microsoft.com/vision/v2.0"; // This is where you need to update your endpoint, if you set your location to something other than west-us.
internal byte[] imageBytes;
internal string imagePath;
/// <summary>
/// Call the Computer Vision Service to submit the image.
/// </summary>
public IEnumerator AnalyseLastImageCaptured()
{
WWWForm webForm = new WWWForm();
using (UnityWebRequest unityWebRequest = UnityWebRequest.Post(visionAnalysisEndpoint, webForm))
{
// gets a byte array out of the saved image
imageBytes = GetImageAsByteArray(imagePath);
unityWebRequest.SetRequestHeader("Content-Type", "application/octet-stream");
unityWebRequest.SetRequestHeader(ocpApimSubscriptionKeyHeader, authorizationKey);
// the download handler will help receiving the analysis from Azure
unityWebRequest.downloadHandler = new DownloadHandlerBuffer();
// the upload handler will help uploading the byte array with the request
unityWebRequest.uploadHandler = new UploadHandlerRaw(imageBytes);
unityWebRequest.uploadHandler.contentType = "application/octet-stream";
yield return unityWebRequest.SendWebRequest();
long responseCode = unityWebRequest.responseCode;
try
{
string jsonResponse = null;
jsonResponse = unityWebRequest.downloadHandler.text;
// The response will be in Json format
// therefore it needs to be deserialized into the classes AnalysedObject and TagData
AnalysedObject analysedObject = new AnalysedObject();
analysedObject = JsonUtility.FromJson<AnalysedObject>(jsonResponse);
if (analysedObject.tags == null)
{
Debug.Log("analysedObject.tagData is null");
}
else
{
Dictionary<string, float> tagsDictionary = new Dictionary<string, float>();
foreach (TagData td in analysedObject.tags)
{
TagData tag = td as TagData;
tagsDictionary.Add(tag.name, tag.confidence);
}
ResultsLabel.instance.SetTagsToLastLabel(tagsDictionary);
}
}
catch (Exception exception)
{
Debug.Log("Json exception.Message: " + exception.Message);
}
yield return null;
}
}
[System.Serializable]
public class TagData
{
public string name;
public float confidence;
}
[System.Serializable]
public class AnalysedObject
{
public TagData[] tags;
public string requestId;
public object metadata;
}
// Use this for initialization
void Start () {
}
private void Awake()
{
// allows this instance to behave like a singleton
instance = this;
}
// Update is called once per frame
void Update () {
}
/// <summary>
/// Returns the contents of the specified file as a byte array.
/// </summary>
private static byte[] GetImageAsByteArray(string imageFilePath)
{
FileStream fileStream = new FileStream(imageFilePath, FileMode.Open, FileAccess.Read);
BinaryReader binaryReader = new BinaryReader(fileStream);
return binaryReader.ReadBytes((int)fileStream.Length);
}
Я ожидал, что результат будет похож на примеры из учебных пособий, но вместо этого я получил те же результаты графического интерфейса без каких-либо обновлений. В 301 году я мог видеть тот же экран, но текстовое поле «Вы только что сказали» и «Перевод» никогда не обновлялись, когда я говорил. В 302 году я мог снимать с экрана и делать скриншот и сначала мог видеть «Анализ», а затем «Я вижу:», но без каких-либо результатов обнаруженных объектов. Поэтому мне кажется, что со службами API Azure невозможно связаться, и я не получаю взамен никаких аналитических данных (вероятно, вы заметили, что я совершенно новичок во всей теме, поэтому, возможно, мое предположение неверно) .