元峰AI笔记 · AI数字人

微软数字人来了

大家好,我是元峰。13 颗 AI 之心持有者。目前对数字人领域探索比较多,所以昨天看到微软推出了自己的数字人之后,立刻发布了一条风向标,今天就赶紧体验试下效果。体验还是相当 Nice,文末会有展示视频。

微软数字人来了

大家好,我是元峰。13 颗 AI 之心持有者。目前对数字人领域探索比较多,所以昨天看到微软推出了自己的数字人之后,立刻发布了一条风向标,今天就赶紧体验试下效果。体验还是相当 Nice,文末会有展示视频。

微软的叫法是:文本转语音头像!这项创新功能不仅允许用户通过文本输入来创建能够说话的头像视频,还能使用人类图像训练来制作实时互动的智能机器人。

今天这篇文章中,我会详细介绍这个功能的特性、优势和技术细节,并通过一系列实例展示它在不同场合的应用方法。

什么是文本转语音头像?

文本转语音头像是一项结合了视觉技术的文本转语音功能,它可以让用户制作出 2D 逼真头像的合成说话视频(让图片开口讲话)。这些头像模型是通过深度神经网络训练而成的,训练材料来自于真人视频录制样本(声音克隆)。

头像的声音则是由先进的文本转语音声音模型所提供(TTS),使其更加生动真实。

微软说构建头像的主要有两个原因:

  • 一是因为传统的视频内容制作不仅耗时而且成本高昂,涉及到搭建拍摄环境、录制和剪辑等多个环节。文本转语音头像使用户可以更高效、更简便地创建视频内容,只需输入文本,就能制作出培训视频、产品介绍、客户评价等。
  • 二是随着 Azure OpenAI 服务及神经文本转语音技术的推出,数字互动变得更加自然和流畅。文本转语音头像让用户可以创造出更生动、更引人入胜的数字交互体验,例如可以利用头像开发对话型代理、虚拟助手、聊天机器人等。

在头像内容生成的流程中,有三个核心环节:文本分析器、文本转语音音频合成器和文本转语音头像视频合成器。 首先,文本被输入到文本分析器中,并被转化为音素序列。接着,文本转语音音频合成器根据文本的声学特征来预测并合成声音,这两个步骤都由文本转语音的声音模型完成。最后,神经文本转语音头像模型根据这些声学特征预测唇形同步的图像,从而生成逼真的合成视频。

这张图片展示了文本转语音头像的内容生成流程,该流程共有五个关键环节。流程从TEXT/SSML INPUT(文本/语音标记语言输入)开始,第一步是TEXT ANALYSIS(文本分析),生成音素序列。接下来是由TTS/CNV MODEL(文本转语音/语音转换模型)支持的TTS AUDIO SYNTHESIS(文本转语音音频合成),随后是由AVATAR MODEL(头像模型)支持的TTS AVATAR VIDEO SYNTHESIS(文本转语音头像视频合成),最终生成PHOTO REALISTIC AVATAR VIDEO FILE/STREAM(逼真的头像视频文件或流),完整呈现了从文本输入到生成逼真数字人视频的核心环节,与文档中介绍的文本转语音头像生成三个核心流程及对应模型的内容相匹配。

这次发布包括哪些内容?

我们目前提供两种文本转语音头像功能:内制版和定制版。

内制版文本转语音头像

微软在 Azure 平台上为订阅用户提供了预制的文本转语音头像产品,可以即插即用。这些头像能够根据文本输入用不同的语言和声音进行交流。客户可以从多种选项中选择一个头像,用来创造视频内容或开发具有实时头像反应的互动应用程序。

这张图片展示的是微软数字人相关的内容,呈现了名为lisa的数字人不同虚拟形象选项,分别为casual-sitting(休闲坐姿)、graceful-sitting(优雅坐姿)、graceful-standing(优雅站姿)、technical-sitting(技术坐姿)、technical-standing(技术站姿)的多种虚拟形象,还可选择对应这些形象的背景,用于创建视频内容或开发相关互动应用程序,其中选中的casual-sitting形象为穿黑色T恤与牛仔裤的坐姿女性,契合定制版文本转语音头像的相关功能展示。

定制版文本转语音头像(需要申请)

定制版功能使客户能够为他们的产品或品牌创建个性化头像。客户可以上传自己的头像视频录制,系统将利用这些视频训练一个定制头像的合成视频。客户可以为他们的头像选择预制或定制的神经语音(声音克隆)。如果同时使用同一人的声音和形象创建定制的神经语音和文本转语音头像,该头像将非常接近于该人。(数字人克隆)

作为微软对负责任 AI 的承诺,文本转语音头像功能旨在保护个人和社会的权利,促进透明的人机交互,并防止有害的深度伪造和误导性内容的传播。因此,定制头像是一个限制访问功能,仅限注册用户使用,并且只适用于特定用例。要在你的商业应用中使用此功能,请在此处注册你的应用案例并申请访问权限。

文本转语音头像可以做什么?

使用文本转语音头像,无论是利用预制头像还是定制头像,你都可以创造出各种引人入胜的视频,如培训视频、演示视频等。

它还可以帮助你为客户、员工和其他受众提供富有互动性的应用程序体验。

Azure AI 语音宣布了文本转语音头像的公开预览,其中涵盖了多种应用场景,例如:

批量视频内容创作

  • 企业培训视频
  • 产品介绍或广告材料
  • 让 CEO 的数字分身在会议中发表演讲

实时互动应用

  • 旅游网站的聊天机器人
  • 直播商业活动中的虚拟销售
  • AI 老师在线授课,可答疑解惑
  • 回答员工疑问的虚拟 HR

如何使用?

微软本次发布的版本,同时支持 Azure AI Speech Studio 的 UI 工具和 API 访问

Azure AI Speech Studio

图片展示的是Azure AI | Speech Studio的界面,标题为“开始使用Azure认知服务语音”。界面中介绍可借助语音进行文本和文本转语音等功能,理解甚至与客户交谈。下方有“使用语音进行文本生成”“传达轻松的分析”“实现聊天体验”三个功能板块,分别配有对应场景的图片。底部提示快速开始使用超过100种语言和方言,通过模型处理特定术语、每篇演讲侧重重要的自定义语音模型等。该图与上下文介绍的Azure AI Speech Studio相关,是对开始使用该服务的界面及功能的展示。

图片展示的是Azure AI Speech Studio的界面,重点突出“文本转语音”功能。界面上方有“文本转语音”标题及介绍,下方有四个功能模块,其中“文本转语音”模块被红色框线突出显示,其下方有图标、文字说明及“试用”按钮。该图片与上下文紧密相关,上下文介绍了微软数字人发布版本支持Azure AI Speech Studio的UI工具和API访问,此图直观呈现了UI工具中“文本转语音”功能的位置和样式,帮助用户了解如何使用该功能。

https://speech.microsoft.com/portal

会说话的虚拟形象

这张图片是Azure AI Speech Studio的使用界面,属于微软虚拟数字人的相关操作页面。页面上方展示了可选择的虚拟形象,当前选中的是一位身穿黑衣牛仔裙的女性虚拟形象,还提供了其他不同款式的虚拟形象选项;页面设有“转到Azure 帐户”等功能按钮,以及“说话”“音频输入”等操作选项。页面下方标注了后续的操作步骤,包括选择语音资源、创建自己的视频等内容,清晰呈现了使用该工具创建会说话虚拟形象的操作相关界面细节,与文档中介绍的微软数字人使用流程的内容相呼应,展示了Azure AI Speech Studio工具的实际操作页面样貌。

注册 Azure 账户

但是不管界面还是 API 版本,都需要注册 Azure 账户。如果新用户可以享受 12 个月的免费服务。

https://azure.microsoft.com/zh-cn/free/ai-services/

图片展示的是Azure免费账户注册页面。左侧红框内有文字“通过Azure免费账户创建定制的AI支持的搜索”,下方有“免费开始使用”和“新用户报价”按钮,左侧箭头指向“免费开始使用”按钮。右侧是笔记本电脑,屏幕上显示Azure AI服务界面。下方有三块内容板块,分别介绍热门服务免费使用12个月、超过55项其他服务始终免费、从200美元的Azure额度开始等内容。该图片与文档中注册Azure账户的上下文相关,直观呈现了注册流程中的免费账户页面。

  1. 创建新的语音资源

图片展示的是微软数字人创建语音资源的后续步骤界面。在“开始使用”选项下,有“相关服务”“查看定价”“负责任地使用AI”等选项。当前处于“创建新的语音资源”步骤,需选择语音资源,已选“Feng (SpeechServices, 美国西部 2, S0)”,区域为westus2,资源密钥显示部分信息。下方提示创建自己的视频,需输入文本脚本并选择头像生成视频,满意后下载到本地。图片与上下文紧密相关,直观呈现了创建语音资源的操作界面及步骤。

  1. 在填写新的资源名称之前,需要先点击 转到 Azure 门户以使用高级设置进行创建 一个语音服务。

这张图片展示的是微软语音服务创建语音资源的操作界面,界面标注为“创建语音资源”,该界面用于完成语音服务所需资源的配置,以获取Speech Studio的完全访问权限。界面中需填写新资源名称、选择订阅类型、区域、定价层、资源组等基础信息,还设有“创建新资源组”选项,界面下方有蓝色文字标注的核心内容为“转到Azure门户以使用高级设置进行创建”,用户可选择点击该内容前往Azure门户完成语音资源的高级创建,界面右下角设有“创建资源”和“取消”按钮,用于确认创建或取消操作。

图片展示的是在Microsoft Azure平台创建语音服务的界面。界面中“资源组”下拉框已选择“语音头像”,“区域”推荐选择“West US 2”,“名称”处输入“Metafeng”,“定价层”选择“Standard S0”。界面底部有“上一步”“下一页”“创建并创建”按钮。图片与上下文紧密相关,上下文提到创建语音服务后需重新创建语音资源,此图即为创建语音服务的步骤操作界面,直观呈现了创建语音服务时的配置信息及操作选项。

图片展示的是Microsoft.CognitiveServices.SpeechServices的部署界面。界面中显示部署完成,部署名、订阅、资源等信息。部署详细信息部分,资源为“Metaling”,类型是Azure AI service,状态为Created。界面右上角有“删除”“重新部署”“下载”“刷新”等操作选项。该图片与文档中“语音服务”部分上下文相关,用于说明语音服务部署完成后的状态情况。

  1. 语音服务创建完成,重新创建语音资源。

图片展示的是在Microsoft Azure中创建语音资源的界面。界面中“新资源的名称”处显示为“metafeng”,并用红色框突出显示。下方有“即用即付”“美国东部”“标准 S0”等设置选项,以及“语音头像”“创建新资源组”“转到 Azure 门户以使用高级设置进行创建”等按钮。该图片与文档中“基础的信息全部配置完成,就可以体验语音头像”上下文对应,是创建语音资源步骤中的一个环节。

图片展示了微软数字人语音头像的后续步骤中“选择语音资源”的界面。界面中有一个红色圆圈突出显示的语音资源输入框,提示选择资源以查看语音配置的密钥和区域,当前显示“Feng (SpeechServices, 美国西部 2, S0)” 。下方有区域“westus2 韦斯图2”和资源密钥的输入框,以及语音终结点的链接。该图片与上下文紧密相关,是用户在使用微软数字人语音头像时,进行语音资源选择操作的指引。

基础的信息全部配置完成,就可以体验语音头像了。

内置形象

内置形象 Lisa,提供几种不同的姿势:休闲坐姿,优雅的坐姿,优雅的站姿,技术坐姿,技术站姿。

图片展示了微软数字人Lisa的内置形象。左侧是Lisa的休闲坐姿形象,她穿着黑色上衣和蓝色牛仔裤,双手交叉放在腿上。右侧是Lisa的多种 addCriterion图片

选择语言和语音

这张图片展示了微软数字人使用时选择语言和语音的操作界面,左侧“语言”下拉菜单当前选中“中文(普通话,简体)”,菜单内还列出了中文的多种口音选项,右侧“语音”下拉菜单已高亮选中名为“Xiaochen”的语音选项,菜单内还罗列了多种可选的语音名称及对应的播放按钮,该界面功能是为数字人设置对应的语言与配音语音。

插入分隔

这张图片展示了微软数字人工具的“插入分隔”功能设置界面,界面内有标准、高级、自定义三种分隔模式选项,当前选中“标准”模式。界面标注了三处核心内容:一处是“【超强】文本转语音类”、一处是“【无停顿】训练材料类”,还有一处箭头指向标注着“400毫秒”的文字,说明此处为设置的分隔时长参数。该界面属于微软数字人使用流程中的一个操作步骤,对应文档中“插入分隔”的相关设置环节。

自定义插入手势

图片展示的是微软数字人Lisa的自定义插入手势功能界面。画面中“插入手势”选项被突出显示。下方有多个手势示例,如“wave - left - 1”“wave - left - 2”等,每个示例配有对应的手势动作图片。该图片与文档中“自定义插入手势”部分内容对应,直观呈现了可选择的手势样式,帮助用户了解如何为数字人添加手势。

调整语速

图片展示了微软数字人视频生成界面中“语速”设置部分。画面中有一个蓝色滑块,可调节语速,当前设置为x1.2倍速。下方有“SSML mode”开关,处于关闭状态。该图片与上下文紧密相关,上下文提到可调整语速,此图直观呈现了语速调节的具体位置和操作方式,帮助用户了解如何在微软数字人视频生成中调整语速。

预览视频&下载视频

这张图片展示了微软Speech Studio工具的操作界面,对应文档中关于微软数字人使用的相关内容。界面左侧有一位名为Lisa的虚拟形象,呈现技术坐姿,属于文档提及的内置形象的一种姿势,该虚拟形象旁标注有“技术坐姿”字样,界面右侧还展示了Lisa的其他五种不同虚拟形象及对应姿势,分别是休闲坐姿、优雅的坐姿、优雅的站姿、技术站姿。界面左下角有被红框标注的“预览视频”按钮,底部区域支持选择中文普通话作为语言及相关语音设置,界面内还显示了该文本转语音头像的相关说明信息。

但是,测试下来,这个预览中,最终的视频只能生成一句,文本太长就会失败。

所以,接下来我就测试 API 版本试试。

API 版本测试

GitHub 链接

可直接使用 官方提供的 Notebook 来制作头像视频:https://github.com/Azure/gen-cv/tree/main/avatar/video

这张图片展示了GitHub平台上微软gen-cv项目的avatar/video目录页面,左侧文件列表中,名为create-avatar-video.ipynb的文件被红色圆圈标注;页面右侧显示该目录下多个文件的更新时间,这些时间都被红色圆圈圈出,均为5天前、4天前或3天前的近期更新记录。该页面对应文档中提到的GitHub链接,是微软数字人制作头像视频可直接使用的官方Notebook所在的页面。

图片展示的是GitHub上“create - avatar - video . ipynb”文件内容。上方标题为“Use the TTS Avatar Service to Create Engaging Videos”,介绍使用Azure TTS Avatar API和自定义脚本创建头像视频。下方列出使用此服务的步骤,包括准备Azure订阅、创建语音资源、获取资源密钥等。图片与文档中介绍如何使用微软数字人制作头像视频的上下文相关,为用户提供具体操作指南。

https://github.com/Azure/gen-cv/tree/main/avatar/video

谷歌 Colab 链接

下面是我下载之后在谷歌 Colab 中修改后的版本:

https://colab.research.google.com/drive/1r-MmWYHqf53qHTbjVkfD73WwKn-QVlmD?usp=sharing

这张图片展示的是制作微软TTS数字人头像视频的代码编辑界面,具体内容为创建头像视频相关操作的在线代码文件。界面里包含明确的操作步骤说明,需先完成Azure语音服务的配置工作,同时提供了语音服务相关文档链接、PPT导出说明及免费视频编辑工具链接等额外资源,下方的代码区域呈现了配置语音服务相关的代码片段,用于实现调用TTS Avatar服务生成头像视频的功能。

运行代码及解释

下面写一下我跑这个代码过程中的详细步骤,遇到很多问题以及我是如何解决的。

代码框1

import requests
import json
import time
import os
from dotenv import load_dotenv

这段代码是一个 Python 脚本的一部分,其中包含了一些模块导入语句。每个导入的模块都有其特定的用途:

  1. import requests:

    • requests 是一个流行的 Python 库,用于发送 HTTP 请求。这意味着代码中可能会涉及到与网络资源的交互,如 API 调用、网页内容获取等。
  2. import json:

  • json 模块用于处理 JSON 数据。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于网络通信。这表明脚本可能会处理 JSON 格式的数据,如解析来自网络请求的响应或将数据转换为 JSON 格式发送。
  1. import time:
  • time 模块提供了与时间相关的函数。这可能用于处理时间相关的操作,如延迟(等待)、记录时间戳、测量代码执行时间等。
  1. import os:
  • os 模块提供了一系列与操作系统交互的功能,包括但不限于文件和目录的管理、环境变量的读取、执行操作系统命令等。这可能表明脚本需要与文件系统交互,或者需要读取操作系统层面的配置。
  1. from dotenv import load_dotenv:
  • dotenv 是一个用于管理环境变量的 Python 库。load_dotenv 函数用于加载 .env 文件中的环境变量。.env 文件通常用于存储配置信息,如数据库连接字符串、API 密钥等,以避免将这些敏感信息硬编码在代码中。 综合来看,这段代码可能是一个涉及网络请求、数据处理、时间操作和环境配置管理的应用程序或脚本的一部分。它表明开发者可能在处理网络数据,同时关注代码的安全性和配置的灵活性。

图片展示的是Python代码运行界面,代码导入requests、json、time、os等模块,以及dotenv库。执行代码时出现ModuleNotFoundError,提示“'dotenv'”模块未找到。界面下方有“OPEN EXAMPLES”和“在STACK OVERFLOW中搜索”按钮。该图片与文档中“API版本测试”部分相关,用于说明在运行代码时遇到的“dotenv”模块未找到的报错情况,是解决办法中“缺啥补啥”步骤的代码示例。

好家伙,第一段就开始报错,但是不慌,这是跑 Python 代码时最常见的问题。

解决办法:缺啥补啥,此环境缺少 dotenv 库,于是执行 pip 进行安装。

!pip install python-dotenv

这张图片展示了一段Colab运行代码时产生的错误信息,对应文档中提及的Python包安装问题场景。图片中执行的是!pip install dotenv命令,运行后出现多项错误提示,包括“subprocess-exited-with-error”“python setup.py egg_info did not run successfully”“metadata-generation-failed”等,同时附带相关说明与提示内容,这些错误内容对应了文档里提到的初始包名错误,为将python-dotenv误写为dotenv时出现的报错情况,验证了文档中关于错误原因的说明。

出师继续不利,这个错误没遇到过,直接把错误丢给 GPT,这不一下就知道什么原因了。原来是 Python 包名的问题。

图片展示的是ChatGPT关于安装包错误的解答。解答中提到错误的包名可能是“dotenv”,正确包名是“python-dotenv”,并建议使用“pip install python-dotenv”进行安装。此外,还列举了Python环境问题、依赖性问题、网络问题等可能导致此类错误的原因。该图片与文档中安装Python包时出现错误的上下文相关,为解决包安装问题提供了参考。

!pip install python-dotenv

图片展示的是在Colab中安装python-dotenv的代码及安装结果。代码为!pip install python-dotenv,执行后显示从https://files.pythonhosted.org/...下载python_dotenv-1.0.0-py3-none-any.whl文件,安装成功,已成功安装python-dotenv-1.0.0。该图片与文档中介绍如何使用微软数字人相关,用于说明在Colab环境下安装python-dotenv以解决环境变量获取问题,为后续代码运行做准备。

成功解决,继续下一段代码。

代码框2

# if not load_dotenv('./.env-avatar-video'): raise Exception("env file not found")
os.environ["SPEECH_SERVICE_REGION"] = "your_service_region" #替换为你的资源区域
os.environ["SPEECH_SERVICE_API_KEY"] = "your_api_key" #替换为你的资源秘钥

service_region = os.getenv("SPEECH_SERVICE_REGION")
subscription_key = os.getenv("SPEECH_SERVICE_API_KEY")

# print(service_region,subscription_key)

url_base = f"https://{service_region}.customvoice.api.speech.microsoft.com/api"

project_folder = '/content/my-project'
if not os.path.exists(project_folder):
    os.makedirs(project_folder)
# project_folder = './my-project' # your project folder
# # os.makedirs(project_folder, exist_ok=True)

texttype = 'ssml' # ssml or PlainText
# texttype = 'Plaintext'

ssml_path = os.path.join(project_folder, '/content/ssml.txt') # if your avatar text input is in SSML format
plaintext_path = os.path.join(project_folder, '/content/plaintext.txt') # if your avatar text input is plaintext format

原代码中是需要通过内置环境变量来获取变量,但因为 Colab 环境问题,直接获取环境变量有很多限制。

图片展示了在Google Colab中运行代码时遇到问题的解决步骤。首先上传.env文件,确认文件路径与load_dotenv函数中指定的路径匹配。接着检查环境变量文件格式,确保以KEY=VALUE格式存储。最后重新运行代码,上传文件并确认路径无误后,可继续使用环境变量。图片还呈现了代码示例,包括导入os模块,设置SPEECH_SERVICE_REGION和SPEECH_SERVICE_API_KEY环境变量,以及获取这些变量值的代码。

所以这边我直接在代码中设置环境变量,但请注意,这样做可能会暴露敏感信息。

例如:

os.environ["SPEECH_SERVICE_REGION"] = "your_service_region" #资源区域 os.environ["SPEECH_SERVICE_API_KEY"] = "your_api_key" #资源秘钥

这里有两个 API 需要从前面的语音资源中获取。

这张图是微软数字人API版本测试里语音资源配置的页面,用于指导获取所需的两个API参数。页面明确呈现语音资源的相关信息,其中“区域”字段被红色圆圈标注,对应需要填入的参数名为“your_service_region”,“资源密钥”字段也被红色圆圈标注,对应参数名为“your_api_key”,页面还给出了语音终结点的链接示例。该页面是文档中说明需从语音资源获取API内容的直观图示,能帮助使用者对应找到所需配置的两个关键参数位置。

代码框3

# Helper functions

def download_file(url, local_path):
    """
    Download a file from a given URL to a local path. This function streams the file from the URL and writes it in chunks to the local
    file system. This allows it to handle large files that might not fit in memory.

    Parameters:
    url (str): The URL of the file to download.
    local_path (str): The local path where the file should be saved.

    Returns:
    str: The local path to the downloaded file.
    """
    with requests.get(url, stream=True) as r:
        r.raise_for_status()

        # Extract filename from URL
        filename = url.split("/")[-1].split("?")[0]

        local_filename = os.path.join(local_path, filename)

        with open(local_filename, 'wb') as f:
            for chunk in r.iter_content(chunk_size=8192):
                if chunk:
                    f.write(chunk)

    return local_filename

上面这段代码是写了一个函数,待会我们生成视频之后,下载视频用的,暂时不用管。

代码框4

# load speaking script
if texttype == 'ssml':
    with open(ssml_path, 'r') as file:
        content = file.read()
elif texttype == 'Plaintext':
    with open(plaintext_path, 'r') as file:
        content = file.read()
else:
    print(f'Error: Texttype needs to be either "ssml" or "Plaintext". Got {texttype} instead.')

print(content)

这段代码是选择给头像的文案的文本方式:简单的纯文本文件 plaintext 或者 更高级的语音合成标记语言 SSML格式。

简单的纯文本格式

图片展示的是微软数字人生成视频时选择给头像的文案文本方式界面。界面中有“语言”和“语音”两个下拉选择框,分别可选择中文(普通话,简体)和Xiaochen。下方文字介绍了如何用SSML让头像用不同语言讲话,可添加效果,提及小辰能用多种语言讲话,声音易识别,可用15种风格讲话,还介绍了暂停、断句标签、音素等使用方法。该图与上下文关于数字人生成视频中选择文案文本方式的内容相关。

这个例子展示了你可以用 SSML 让你的头像用不同的语言讲话,并且如何添加效果。我们使用的是小辰的声音,它能用几种语言讲话。这里是多语言才华横溢的小辰用法语说话。我的声音很容易被识别。
我可以用 15 种不同的风格讲话。如果你想要一个喊叫的头像,对我来说没问题!或者怎么样,来点耳语对话?你可以在我的语言中插入一个暂停,使用一个断句标签。使用音素来正确发音特定的单词,如 OpenAI 的 DALLE 模型。没有音素,神经语音会错误地说 DALLE。调整说话速度,所以如果你想,我可以说得非常快,或者说得相当慢。随意调整音调以提高声音,或者相反,如果你更喜欢那样。最后,这是你如何降低音量,或者让我说话更大声。我们希望这些示例能帮助你定制你的头像的沟通,以获得更引人入胜的体验。玩得开心!

更高级的语音合成标记语言(SSML)格式(推荐使用)

那么问题来了,什么是 SSML 格式?(文章最后会有视频解释)

SSML(Speech Synthesis Markup Language)格式是一种基于 XML 的标记语言,专门用于控制和定制文本转语音(TTS)系统的输出。它允许用户精确地指定语音合成的各种方面,包括发音、音调、音量、语速、停顿等。通过 SSML,用户可以让合成语音更加自然、表情丰富,并能够适应特定的语境和应用需求。SSML 格式常用于开发高度个性化的语音应用,如虚拟助手、自动语音响应系统、有声读物等。

图片展示的是微软数字人使用中SSML模式的设置界面。界面右上角有一个蓝色的开关按钮,被红色圆圈圈出,旁边标注“SSML模式”。下方是SSML格式代码示例,包括语音名称、语种、风格等信息,还展示了不同语言的语音效果示例。该图片与上下文紧密相关,直观呈现了上下文中提到的SSML模式设置及代码示例,帮助用户了解如何使用SSML进行语音合成。

This example shows what you can do with SSML to let your avatar speak in various languages and how to add effects. We are using the voice Jenny Multilangual which is able to speak in several languages. Voici le talent linguistique Jenny parlant français. Ma voix est bien reconnaissable. I can speak in 15 different styles. If you want a shouting Avatar, no problem for me!Or what about some whispered dialog?DALLEso I can talk really fast if that's what you want or talk quite slowly.Feel free to adjust the pitch for more highness of the sound. Or the opposite if you like that better.Finally, here is how you reduce the volume.Or make me speak louder.Have fun!

上面英文版本是官方给的示例。使用 GPT 直接转换为中文版本的,切记要保持格式不变。

图片展示的是ChatGPT对SSML标签的中文翻译示例。上方是XML代码,包含speak、voice、lang、name、mstts:express-as等标签,用于设置语音合成参数。下方是翻译后的中文内容,解释了各标签的作用,如speak标签用于开始语音合成,voice标签指定语音类型,mstts:express-as标签用于设置语音表达方式。该图片与上下文紧密相关,直观呈现了SSML标签的中文翻译格式,帮助用户了解如何使用这些标签进行语音合成。

这个例子展示了你可以用 SSML 让你的头像用不同的语言讲话,并且如何添加效果。 我们使用的是小辰的声音,它能用几种语言讲话。 这里是多语言才华横溢的小辰用法语说话。我的声音很容易被识别。 我可以用 15 种不同的风格讲话。 如果你想要一个喊叫的头像,对我来说没问题! 或者怎么样,来点耳语对话? 你可以在我的语言中插入一个暂停 使用一个断句标签。 使用音素来正确发音特定的单词,如 OpenAI 的 DALLE 模型。没有音素,神经语音会错误地说 DALLE。 调整说话速度 所以如果你想,我可以说得非常快 或者说得相当慢。 随意调整音调以提高声音。 或者相反,如果你更喜欢那样。 最后,这是你如何降低音量。 或者让我说话更大声。 我们希望这些示例能帮助你定制你的头像的沟通,以获得更引人入胜的体验。 玩得开心!

然后我们需要创建 2 个文件,分别把两种格式的内容写进去。

图片展示了代码编辑界面,左侧为文件目录,包含config、jpynb_checkpoints、my - project等文件夹,其中plaintext.txt和ssml.txt文件被红色箭头指向。右侧代码部分定义了url_base、project_folder等变量,以及plaintext_path和ssml_path的路径。该图片与文档中“运行代码及解释”部分相关,直观呈现了代码中涉及的文件及变量设置情况,辅助理解代码功能。

代码框5

# generate avatar video
payload = json.dumps({
    "displayName": "my avatar",
    "description": "Vision AI Solution Accelerator Demo",
    "textType": texttype, # PlainText, ssml
    "inputs": [
        {
            "text": content
        }
    ],
    "synthesisConfig": {
        "voice": "zh-CN-XiaochenNeural",  # set voice name for plain text; ignored for ssml
    },
    "properties": {
        "talkingAvatarCharacter": "lisa",  # custom avatar. pre-built avatar: lisa
        "talkingAvatarStyle": "technical-standing",  # supported lisa styles: casual-sitting, graceful-sitting, graceful-standing, technical-sitting, technical-standing
        "videoFormat": "webm",  # mp4 or webm, webm is required for transparent background
        "videoCodec": "vp9",  # hevc, h264 or vp9, vp9 is required for transparent background; default is hevc
        "subtitleType": "soft_embedded",
        "backgroundColor": "transparent",
    },
})

session = requests.Session()
session.headers.update({
    'Accept': 'application/json',
    'Ocp-Apim-Subscription-Key': subscription_key,
    'Content-Type': 'application/json'
})

url_com = f'{url_base}/texttospeech/3.1-preview1/batchsynthesis/talkingavatar'

response = session.post(url_com, data=payload)

print(f'Status code: {response.status_code}')
if response.status_code >= 400:
    print('Job submission failed. Please verify your subscription key and try again.')
    print(response.text)
else:
    print('Job submitted successfully. Processing', end=' ')
    r = response.json()

    while True:
        result = session.get(f'{url_base}/texttospeech/3.1-preview1/batchsynthesis/talkingavatar/{r["id"]}')
        if result.json()['status'] == 'Succeeded':
            print('\n\nReady. Synthesized video:\n' + result.json()['outputs']['result'])
            break
        if result.json()['status'] == 'Failed':
            print('synthesis failed')
            print(result.json()['properties']['error'])
            break
        print('.', end = '')
        time.sleep(10)

这里主要配置几个参数:

语言和音色:"voice": "zh-CN-XiaochenNeural", 从语音库中选择合适的,中文,晓辰。

图片展示的是Microsoft Azure语音库界面,用于选择语音库中的语音。画面中以红色框突出显示了名为“晓晨”的中文普通话(女)语音,其语音库为“zh-CN”,音色为“Neural”。界面右侧有代码示例,其中第16行代码“voice: 'zh-CN-XiaochenNeural'”与上文“语言和音色”配置参数对应,用于在代码中指定晓晨作为中文普通话的语音库。

选择头像形象:"talkingAvatarCharacter": "lisa", 内置的目前只有 Lisa。

图片展示的是微软数字人使用时选择虚拟形象的界面。左侧是已选择的虚拟形象,为Lisa,身着黑色服装,双手自然下垂。右侧有“虚拟形象”和“背景”两个选项卡,当前选中“虚拟形象”。下方展示了多种Lisa的虚拟形象,包括casual-sitting、graceful-sitting、graceful-standing、technical-sitting、technical-standing等姿势。该图片与文档中配置参数时选择头像形象的内容相关,直观呈现了可选的虚拟形象样式。

选择姿势:"talkingAvatarStyle": "technical-standing",休闲坐姿,优雅的坐姿,优雅的站姿,技术坐姿,技术站姿。

这张图片是微软数字人使用相关的虚拟形象选择界面,左侧选中“虚拟形象”选项,呈现出内置的Lisa虚拟形象的不同展示选项,对应了文档中提及的头像形象和姿势选择内容。其中Lisa的形象带有不同的姿势,分别为casual-sitting、graceful-sitting、graceful-standing、technical-sitting,还有被蓝色边框突出选中的technical-standing,与文档里“talkingAvatarStyle”的技术站姿等配置项对应,可供在配置微软数字人参数时挑选对应的虚拟形象与站姿样式。

视频背景:backgroundColor": "transparent", 透明或者白色。

图片展示了微软数字人视频背景设置选项。左侧为“White”白色背景,右侧为“Transparent”透明背景,背景以灰白格子图案呈现。该图片与文档中“视频背景”设置内容相关,对应文档中“backgroundColor":"transparent",说明可选择透明或白色背景,直观呈现了两种背景样式,帮助用户了解设置效果。

视频格式:"videoFormat": "webm", 可以选择 MP4 和 webm 格式。如果视频背景选择了透明,这里就选择 webm 格式。

这张图片展示了微软数字人生成的代码配置界面,核心是合成语音及数字人形象的参数设置区域。界面里的代码中,标注了选择的音色参数为“zh-CN-XiaochenNeural”,同时明确选定的数字人形象是“lisa”;另外还标注了其他相关配置项,界面中的注释说明了这些参数的含义,比如音色对应设置普通文本的语音名称,数字人形象为预设的形象选项,整体呈现了代码中生成数字人视频的关键配置内容,与文档中使用微软数字人生成头像视频的操作步骤相呼应,体现了代码配置过程中的核心参数选择。

到这一步也就意味着配置全部结束了,然后执行这个代码框,就可以生成头像视频了。

这张图片展示的是名为create-avatar-video.ipynb的Python代码运行界面,对应微软数字人生成头像视频的代码运行环节。画面中代码框7内的代码处于运行状态,代码编辑区顶部有一个被红圈和箭头标注的运行按钮,该按钮可触发代码执行。界面中还显示了相关代码逻辑,包括生成视频的请求发送、等待过程以及下载视频的操作代码,右侧的说明文字标注了该代码的相关功能提示,配合文档步骤可实现生成头像视频并下载的操作。

代码框7

# download video to project folder. Note: An existing video file will be overwritten.
url = result.json()['outputs']['result']
local_filename = download_file(url, project_folder)
print(f'{local_filename} downloaded.')

经过 6 分钟的等待之后,视频就制作好,程序会返回给我们的是一个下载链接。

使用之前的视频下载函数,即可将视频下载到本地。

现在结合这个视频,在看这个 SSML 格式,就能懂这些标签是做什么的了。(这个例子中讲法语的部分是没有生效的。)

这个例子展示了你可以用 SSML 让你的头像用不同的语言讲话,并且如何添加效果。 我们使用的是小辰的声音,它能用几种语言讲话。 这里是多语言才华横溢的小辰用法语说话。我的声音很容易被识别。 我可以用 15 种不同的风格讲话。 如果你想要一个喊叫的头像,对我来说没问题! 或者怎么样,来点耳语对话? 你可以在我的语言中插入一个暂停 使用一个断句标签。 使用音素来正确发音特定的单词,如 OpenAI 的 DALLE 模型。没有音素,神经语音会错误地说 DALLE。 调整说话速度 所以如果你想,我可以说得非常快 或者说得相当慢。 随意调整音调以提高声音。 或者相反,如果你更喜欢那样。 最后,这是你如何降低音量。 或者让我说话更大声。 我们希望这些示例能帮助你定制你的头像的沟通,以获得更引人入胜的体验。 玩得开心!

再看英文原版的,效果会更明显。

This example shows what you can do with SSML to let your avatar speak in various languages and how to add effects. We are using the voice Jenny Multilangual which is able to speak in several languages. Voici le talent linguistique Jenny parlant français. Ma voix est bien reconnaissable. I can speak in 15 different styles. If you want a shouting Avatar, no problem for me!Or what about some whispered dialog?DALLEso I can talk really fast if that's what you want or talk quite slowly.Feel free to adjust the pitch for more highness of the sound. Or the opposite if you like that better.Finally, here is how you reduce the volume.Or make me speak louder.Have fun!

最后,意外的收获。玩了一天,就生成了 3 条视频,竟然倒欠微软爸爸 464 美刀,可是后面又显示无需付费。不得不感慨,数字人这玩意,成本是真的高!!!

这张是微软Azure成本管理页面的截图,属于“成本管理+计费|发票”板块。页面展示了三条Azure相关的计费记录,其中第三条记录的“总金额”处被红色圆圈标注,显示为-US$464.00,其余两条记录总金额均为0美元。该截图对应文档中“最后,意外的收获”部分,是用户使用微软数字人相关功能后产生的账单界面,对应文档提到的“倒欠微软爸爸464美刀”的内容,直观呈现了此次使用产生的高成本信息。

最后的话

体验完微软数字人技术后,这也是用了这么多数字人平台后,第一次从底层用代码去制作出一个数字人。诚然,这次的尝试对于像我这样的普通用户来说,确实有些技术性和挑战性,从注册账号到操作界面,都让人觉得步步为营。

今天在实现的过程中,大家也看到了,遇到了各种各样的问题,但是有 GPT 的加持,也就迎刃而解了。正如爬山一般,虽然路途崎岖,却也充满了探索的乐趣和成就感。

微软的这项服务,虽然现阶段似乎更适合那些编程高手和技术达人,但我相信,随着技术的发展和改进,未来一定会有更多适合我们这些普通用户的产品和服务出现。我期待有一天,我们都能轻松地打造和定制属于自己的数字头像,就像在科幻电影中那样激动人心。

以上就是微软数字人的初体验。如有收获,请给元峰点个赞。

参考文章:https://techcommunity.microsoft.com/t5/ai-azure-ai-services-blog/azure-ai-speech-announces-public-preview-of-text-to-speech/ba-p/3981448