无法获取Azure认知服务的访问令牌(用于tts)

2024-06-08 17:45:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我似乎无法获得Azure认知服务访问令牌的授权。我使用的是azure团队发布到github的示例代码(修改后取我的密钥)。在

我已经看过文件,据我所知,我做的一切都是对的。我也用过“统一语音服务免费试用”,但那也不管用。在

class TextToSpeech(object):
    def __init__(self, subscription_key):
        self.subscription_key = subscription_key
        self.tts = "testing the TTS abilities of Azure using python"
        #self.tts = input("What would you like to convert to speech: ")
        self.timestr = time.strftime("%Y%m%d-%H%M")
        self.access_token = None

    '''
    The TTS endpoint requires an access token. This method exchanges your
    subscription key for an access token that is valid for ten minutes.
    '''
    def get_token(self):
        fetch_token_url = "https://eastus.api.cognitive.microsoft.com/sts/v1.0/issuetoken"
        headers = {
            'Ocp-Apim-Subscription-Key': self.subscription_key
        }
        response = requests.post(fetch_token_url, headers=headers)
        self.access_token = str(response.text)

if __name__ == "__main__":
    app = TextToSpeech(subscription_key)
    app.get_token()

下面是访问令牌的输出

^{pr2}$

我应该得到的是临时访问令牌,但由于某种原因,我得到了上面的错误,我不知道为什么。在


Tags: tokeyselftokenanforgetaccess
1条回答
网友
1楼 · 发布于 2024-06-08 17:45:00

此错误是由于您调用了错误的终结点。请尝试下面的代码开始在main方法中使用您自己的订阅参数:

import os, requests, time
from xml.etree import ElementTree


try: input = raw_input
except NameError: pass



class TextToSpeech(object):
    def __init__(self, subscription_key,region):
        self.subscription_key = subscription_key
        self.region =region
        self.tts = input("What would you like to convert to speech: ")
        self.timestr = time.strftime("%Y%m%d-%H%M")
        self.access_token = None

    def get_token(self):
        fetch_token_url = 'https://'+self.region+'.api.cognitive.microsoft.com/sts/v1.0/issuetoken'
        headers = {
            'Ocp-Apim-Subscription-Key': self.subscription_key
        }
        response = requests.post(fetch_token_url, headers=headers)
        self.access_token = str(response.text)

    def save_audio(self):
        base_url = 'https://'+self.region+'.tts.speech.microsoft.com/'
        path = 'cognitiveservices/v1'
        constructed_url = base_url + path
        headers = {
            'Authorization': 'Bearer ' + self.access_token,
            'Content-Type': 'application/ssml+xml',
            'X-Microsoft-OutputFormat': 'riff-24khz-16bit-mono-pcm',
            'User-Agent': 'YOUR_RESOURCE_NAME'
        }
        xml_body = ElementTree.Element('speak', version='1.0')
        xml_body.set('{http://www.w3.org/XML/1998/namespace}lang', 'en-us')
        voice = ElementTree.SubElement(xml_body, 'voice')
        voice.set('{http://www.w3.org/XML/1998/namespace}lang', 'en-US')
        voice.set('name', 'en-US-Guy24kRUS') # Short name for 'Microsoft Server Speech Text to Speech Voice (en-US, Guy24KRUS)'
        voice.text = self.tts
        body = ElementTree.tostring(xml_body)

        response = requests.post(constructed_url, headers=headers, data=body)
        '''
        If a success response is returned, then the binary audio is written
        to file in your working directory. It is prefaced by sample and
        includes the date.
        '''
        if response.status_code == 200:
            with open('sample-' + self.timestr + '.wav', 'wb') as audio:
                audio.write(response.content)
                print("\nStatus code: " + str(response.status_code) + "\nYour TTS is ready for playback.\n")
        else:
            print("\nStatus code: " + str(response.status_code) + "\nSomething went wrong. Check your subscription key and headers.\n")

    def get_voices_list(self):
        base_url = 'https://'+self.region+'.tts.speech.microsoft.com/'
        path = 'cognitiveservices/voices/list'
        constructed_url = base_url + path
        headers = {
            'Authorization': 'Bearer ' + self.access_token,
        }
        response = requests.get(constructed_url, headers=headers)
        if response.status_code == 200:
            print("\nAvailable voices: \n" + response.text)
        else:
            print("\nStatus code: " + str(response.status_code) + "\nSomething went wrong. Check your subscription key and headers.\n")

if __name__ == "__main__":
    region = '<your region here , in your case , the value should be eastus>'
    subscription_key = '<your subscription key here>'
    app = TextToSpeech(subscription_key,region)
    app.get_token()
    app.save_audio()

您可以在Azure门户网站上找到您的区域和订阅密钥值: enter image description here

我已经在我这边测试过了,它对我有用。一旦你检查代码,就会创建一个wav文件,这是你需要的: enter image description here

相关问题 更多 >