Конечная точка для моих API Azure (Translator Text, Computer Vision) недоступна (код ошибки 404) - PullRequest
2 голосов
/ 22 мая 2019

Я следовал учебным пособиям 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 невозможно связаться, и я не получаю взамен никаких аналитических данных (вероятно, вы заметили, что я совершенно новичок во всей теме, поэтому, возможно, мое предположение неверно) .

...