最近,微软对Azure AI语音服务进行了升级,发布了9种更真实的AI语音,其中有多年历史的”小小“-低幼版少女语音终于长大啦,读起中文文章来情感丰富,阴阳顿挫,简直真假难辨。

能不能在苹果手机上调用小小,直接对长文章生成音频呢?当然可以。

需要两个原料 和 一个菜谱

  1. 在苹果手机(iPhone)上执行自动化任务时,最便捷的方法是通过“快捷指令”(Shortcuts)应用。它是一个非常强大的工具,可以让你轻松创建自动化工作流程,而不需要复杂的编程技能;

  2. 您需要申请 Azure cloud 账户。

  • 登录到Azure, https://portal.azure.com/
  • 在Azure云中,需要申请并部署 speech 资源
  • 注意:批量语音的 Endpoint 节点,亚洲地区目前只能选择 southeastaisa

有了原料,先看下微软官网提供的菜谱:用于文本转语音的批量合成 API - 语音服务 - Azure AI services | Microsoft Learn 吧啦吧啦都是介绍,关键两点:

  1. 用到两个 API :创建和获取
Operation 操作 Method 方法 REST API call REST API 调用
Create batch synthesis 创建批量合成 PUT texttospeech/batchsyntheses/YourSynthesisId
文本到语音/批量合成/您的合成 ID
Get batch synthesis 获取批量合成 GET texttospeech/batchsyntheses/YourSynthesisId
文本到语音/批量合成/您的合成 ID
List batch synthesis 批量合成列表 GET texttospeech/batchsyntheses
文本到语音/批量合成
Delete batch synthesis 删除批量合成 DELETE texttospeech/batchsyntheses/YourSynthesisId
文本到语音/批量合成/您的合成 ID

微软贴心提供了示例代码: cognitive-services-speech-sdk/samples/batch-avatar/python at master · Azure-Samples/cognitive-services-speech-sdk

  1. 自定义 Azure TTS 参数

核心 python 代码

调用创建 Api:

def submit_synthesis(job_id: str) -> bool:
    url = f'{SPEECH_ENDPOINT}/texttospeech/batchsyntheses/{job_id}?api-version={API_VERSION}'
    header = {
        'Content-Type': 'application/json'
        'Ocp-Apim-Subscription-Key': SUBSCRIPTION_KEY
    }

    payload = {
        "inputKind": "PlainText", 
        'synthesisConfig': {
            "voice": "en-US-AvaMultilingualNeural",
        },
        "inputs": [
            {
                "content": text
            },
        ],
        "properties": {
            "outputFormat": "audio-24khz-160kbitrate-mono-mp3",
        },
    }

    response = requests.put(url, json.dumps(payload), headers=header)
    if response.status_code < 400:
        logger.info('Batch synthesis job submitted successfully')
        return True

调用获取 Api:

def get_synthesis(job_id: str):
    url = f'{SPEECH_ENDPOINT}/texttospeech/batchsyntheses/{job_id}?api-version={API_VERSION}'
    header = _authenticate()
    response = requests.get(url, headers=header)
    if response.status_code < 400:
        logger.info('Get batch synthesis job successfully')
        logger.info(response.json())
        return response.json()['status']

主程序,轮询获得下载地址:

if __name__ == '__main__':
    job_id = _create_job_id()
    if submit_synthesis(job_id):
        while True:
            status = get_synthesis(job_id)
            if status == 'Succeeded':
                logger.info('batch synthesis job succeeded')
                break
            elif status == 'Failed':
                logger.error('batch synthesis job failed')
                break
            else:
                logger.info(f'batch synthesis job is still running, status [{status}]')
                time.sleep(5)

如何改写为 ios shortcuts?

核心是使用快捷指令的 ”获取 url 内容“模块,一一对应,下面是例子:

image.png

image.png

获取 api 返回更加简单:

image.png

有需要完整代码的伙伴,可以留言索取。