【问题标题】:Iinvalid subscription key when using Microsoft Emotion API for Video in API Testing Console and in Python 2.7在 API 测试控制台和 Python 2.7 中使用 Microsoft Emotion API for Video 时订阅密钥无效
【发布时间】:2017-10-15 22:21:22
【问题描述】:

我只设法将 Emotion API 订阅密钥用于图片,但从不用于视频。无论我是使用 API 测试控制台还是尝试通过 Pathon 2.7 调用 Emotion API 都没有区别。在这两种情况下,我都会收到响应状态 202 Accepted,但是在打开 Operation-Location 时会显示

{ "error": { "code": "Unauthorized", "message": "Access denied due to 
invalid subscription key. Make sure you are subscribed to an API you are 
trying to call and provide the right key." } }

在 Emotion API 解释页面上,它说 Response 202 意味着

服务已接受请求,稍后将启动该过程。 在响应中,有一个“Operation-Location”标头。客户端应该进一步从这个header中指定的URL查询操作状态。

然后是Response 401,这正是我的 Operation-Location 包含的内容。我不明白为什么我收到的响应 202 看起来像响应 401。

我尝试使用我在 Internet 上找到的至少三个代码版本使用 Python 调用 API 都一样,我在这里找到了代码: Microsoft Emotion API for Python - upload video from memory python-upload-video-from-memory

   import httplib
   import urllib
   import base64
   import json
   import pandas as pd
   import numpy as np
   import requests

   _url = 'https://api.projectoxford.ai/emotion/v1.0/recognizeInVideo'
   _key = '**********************'
   _maxNumRetries = 10

   paramsPost = urllib.urlencode({'outputStyle' : 'perFrame', \
                           'file':'C:/path/to/file/file.mp4'})
   headersPost = dict()
   headersPost['Ocp-Apim-Subscription-Key'] = _key
   headersPost['content-type'] = 'application/octet-stream'
   jsonGet = {}
   headersGet = dict()
   headersGet['Ocp-Apim-Subscription-Key'] = _key
   paramsGet = urllib.urlencode({})

   responsePost = requests.request('post', _url + "?" + paramsPost, \
   data=open('C:/path/to/file/file.mp4','rb').read(), \
   headers = headersPost)

   print responsePost.status_code

   videoIDLocation = responsePost.headers['Operation-Location']
   print videoIDLocation

请注意,将 _url = 'https://api.projectoxford.ai/emotion/v1.0/recognizeInVideo' 更改为 _url = 'https://westus.api.cognitive.microsoft.com/emotion/v1.0/recognizeInVideo' 没有帮助。

但是,之后我每隔半小时等待并运行一次:

   getResponse = requests.request('get', videoIDLocation, json = jsonGet,\
   data = None, headers = headersGet, params = paramsGet)

   print json.loads(getResponse.text)['status']

结果是“运行”了几个小时,而我的视频只有半个小时左右。

这是我的测试控制台的样子Testing Console for Emotion API, Emotion Recognition in Video 在这里,我使用了另一个大约 5 分钟长的视频,可以在互联网上找到。我在不同的用法示例中找到了该视频

 https://benheubl.github.io/data%20analysis/fr/

使用非常相似的代码,这再次让我得到响应状态 202 Accepted 并且在打开操作位置时订阅密钥错误

代码如下:

import httplib
import urllib
import base64
import json
import pandas as pd
import numpy as np
import requests



# you have to sign up for an API key, which has some allowances. Check the 
API documentation for further details:
_url = 'https://api.projectoxford.ai/emotion/v1.0/recognizeinvideo'
_key = '*********************' #Here you have to paste your 
primary key
_maxNumRetries = 10

# URL direction: I hosted this on my domain
urlVideo = 'http://datacandy.co.uk/blog2.mp4'

# Computer Vision parameters
paramsPost = { 'outputStyle' : 'perFrame'}

headersPost = dict()
headersPost['Ocp-Apim-Subscription-Key'] = _key
headersPost['Content-Type'] = 'application/json'

jsonPost = { 'url': urlVideo }

responsePost = requests.request( 'post', _url, json = jsonPost, data = None, 
headers = headersPost, params = paramsPost )
if responsePost.status_code == 202: # everything went well!
  videoIDLocation = responsePost.headers['Operation-Location']
  print videoIDLocation

互联网上还有更多示例,它们似乎都有效,但复制其中任何一个都对我不起作用。有谁知道可能出了什么问题?

【问题讨论】:

    标签: python api key subscription microsoft-cognitive


    【解决方案1】:

    Emotion API 的视频功能将于 10 月 30 日停用,所以也许您还是应该将程序更改为屏幕截图。

    但是对于您的问题:API 会返回一个 URL,您可以在该 URL 中访问您的结果。您无法在浏览器中打开此 URL,这会给您“无效密钥”的通知,相反您需要再次通过 python 调用此 URL,包括您的密钥。 我将向您发布我的代码如何获得分数,我使用的是 Python 3,因此可能需要进行一些调整。只有“棘手”的一点是获取操作 ID,它只是 URL 中的 ID(在我的例子中是 =location),它会导致您的请求。其余参数如订阅密钥等。

    #extract operation ID from location-string
    OID = location[67:]
    bod = ""
    
    try:
        conn = 
        http.client.HTTPSConnection('westus.api.cognitive.microsoft.com')
    conn.request("GET", "/emotion/v1.0/operations/"+OID+"?%s" %params, bod, headers)
        response = conn.getresponse()
        data = response.read()
        print(data)
        conn.close()
    except Exception as e:
    print("[Errno {0}] {1}".format(e.errno, e.strerror))
    

    【讨论】:

    • “Emotion API 的视频功能将于 10 月 30 日停用,所以也许你还是应该将程序更改为屏幕截图。” -> 这是个坏消息。您能否说明您从哪里获得这些信息?
    • 我找不到任何公开信息。我正在使用 Azure 服务,他们发送了几封电子邮件,内容如下:“Microsoft Cognitive Services Emotion API Preview 可让您分析面部以检测一系列感受。随着我们在客户最看重的功能和服务方面简化工作, 识别视频中人物的面部表情并返回其情绪摘要的视频功能将于 2017 年 10 月 30 日弃用。就可以了。
    【解决方案2】:

    您是否确认您的 API 调用正在使用 curl?始终首先使用curl 进行原型调用。如果在 curl 中有效,但在 Python 中无效,请使用 Fiddler 观察 API 请求和响应。

    【讨论】:

      【解决方案3】:

      我还在下面的链接中找到了答案,所有步骤都有解释: https://gigaom.com/2017/04/10/discover-your-customers-deepest-feelings-using-microsoft-facial-recognition/

      【讨论】:

        猜你喜欢
        • 2017-12-21
        • 1970-01-01
        • 1970-01-01
        • 2019-07-05
        • 2016-08-26
        • 2022-06-30
        • 2023-03-27
        • 2023-01-09
        • 1970-01-01
        相关资源
        最近更新 更多