你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
快速入门:通话后听录和分析
语言服务文档 | Language Studio | 语音服务文档 | Speech Studio
本 C# 快速入门中会对呼叫中心、听录执行情绪分析和对话摘要操作。 该示例将自动识别敏感信息并对其进行分类和编辑。 本快速入门会实现使用 Azure 认知语音和 Azure 认知语言服务功能的跨服务方案。
提示
请尝试访问 Language Studio 或 Speech Studio,通过演示了解如何使用语言和语音服务分析呼叫中心对话。
若要使用无代码方法将呼叫中心听录解决方案部署到 Azure,请尝试引入客户端。
此快速入门使用以下适用于语音的 Azure AI 服务:
语言服务提供我们使用的以下功能:
- 个人身份信息 (PII) 提取和编修:识别、分类和编修对话口述文本中的敏感信息。
- 对话摘要:以摘要文本总结每位对话参与者对问题和解决方案的看法。 例如,呼叫中心可以对大量的产品问题进行分组。
- 情绪分析和观点挖掘:分析口述文本并在语句和对话级别关联正面、中性或负面情绪。
先决条件
- Azure 订阅 - 免费创建订阅
- 在 Azure 门户中创建多服务资源。 本快速入门仅需要一项 Azure AI 服务多服务资源。 使用示例代码即可指定单独的语言和语音资源键。
- 获取资源密钥和区域。 部署 Azure AI 服务资源后,选择“转到资源”以查看和管理密钥。
重要
本快速入门需要对对话摘要的访问权限。 若要获得访问权限,必须提交在线请求并获得批准。
本快速入门中的 --languageKey
和 --languageEndpoint
值必须与相关区域中的资源相对应,这些区域为对话摘要 API 支持的区域之一:eastus
、northeurope
和 uksouth
。
使用 C# 运行通话后听录分析
按照以下步骤生成并运行通话后听录分析快速入门代码示例。
从 GitHub 复制 scenarios/csharp/dotnetcore/call-center/ 示例文件。 如果已安装 Git,请打开命令提示符并运行
git clone
该命令,以下载语音 SDK 示例存储库。git clone https://github.com/Azure-Samples/cognitive-services-speech-sdk.git
打开命令提示符,并更改为项目目录。
cd <your-local-path>/scenarios/csharp/dotnetcore/call-center/call-center/
使用 .NET CLI 生成项目。
dotnet build
使用首选命令行参数运行应用程序。 请参阅用法和参数以了解可用选项。
下面是从 GitHub 上的示例音频文件进行听录的示例:
dotnet run --languageKey YourResourceKey --languageEndpoint YourResourceEndpoint --speechKey YourResourceKey --speechRegion YourResourceRegion --input "https://github.com/Azure-Samples/cognitive-services-speech-sdk/raw/master/scenarios/call-center/sampledata/Call1_separated_16k_health_insurance.wav" --stereo --output summary.json
如果已有用作输入的听录,下面是仅需要语言资源的示例:
dotnet run --languageKey YourResourceKey --languageEndpoint YourResourceEndpoint --jsonInput "YourTranscriptionFile.json" --stereo --output summary.json
将
YourResourceKey
替换为 Azure AI 服务资源密钥,将YourResourceRegion
替换为 Azure AI 服务资源区域(如eastus
),并将YourResourceEndpoint
替换为 Azure AI 服务终结点。 确保--input
和--output
指定的路径有效。 否则,必须更改路径。重要
完成后,请记住将密钥从代码中删除,并且永远不要公开发布该密钥。 对于生产来说,请使用安全的方式存储和访问凭据,例如 Azure Key Vault。 有关详细信息,请参阅 Azure AI 服务安全性一文。
检查结果
控制台输出显示了完整的对话和摘要。 下面是总体摘要的示例,为了简洁而进行了编修:
Conversation summary:
issue: Customer wants to sign up for insurance.
resolution: Customer was advised that customer would be contacted by the insurance company.
如果指定 --output FILE
可选 参数,则结果的 JSON 版本会写入文件。 文件输出是批量听录(语音)、情绪(语言)和对话摘要(语言)API 的 JSON 响应的组合。
transcription
属性包含一个 JSON 对象,其中包含与批量听录合并的情绪分析结果。 下面是一个示例,为了简洁而进行了编修:
{
"source": "https://github.com/Azure-Samples/cognitive-services-speech-sdk/raw/master/scenarios/call-center/sampledata/Call1_separated_16k_health_insurance.wav",
// Example results redacted for brevity
"nBest": [
{
"confidence": 0.77464247,
"lexical": "hello thank you for calling contoso who am i speaking with today",
"itn": "hello thank you for calling contoso who am i speaking with today",
"maskedITN": "hello thank you for calling contoso who am i speaking with today",
"display": "Hello, thank you for calling Contoso. Who am I speaking with today?",
"sentiment": {
"positive": 0.78,
"neutral": 0.21,
"negative": 0.01
}
},
]
// Example results redacted for brevity
}
conversationAnalyticsResults
属性包含一个 JSON 对象,其中包含对话 PII 和会话摘要分析的结果。 下面是一个示例,为了简洁而进行了编修:
{
"conversationAnalyticsResults": {
"conversationSummaryResults": {
"conversations": [
{
"id": "conversation1",
"summaries": [
{
"aspect": "issue",
"text": "Customer wants to sign up for insurance"
},
{
"aspect": "resolution",
"text": "Customer was advised that customer would be contacted by the insurance company"
}
],
"warnings": []
}
],
"errors": [],
"modelVersion": "2022-05-15-preview"
},
"conversationPiiResults": {
"combinedRedactedContent": [
{
"channel": "0",
"display": "Hello, thank you for calling Contoso. Who am I speaking with today? Hi, ****. Uh, are you calling because you need health insurance?", // Example results redacted for brevity
"itn": "hello thank you for calling contoso who am i speaking with today hi **** uh are you calling because you need health insurance", // Example results redacted for brevity
"lexical": "hello thank you for calling contoso who am i speaking with today hi **** uh are you calling because you need health insurance" // Example results redacted for brevity
},
{
"channel": "1",
"display": "Hi, my name is **********. I'm trying to enroll myself with Contoso. Yes. Yeah, I'm calling to sign up for insurance.", // Example results redacted for brevity
"itn": "hi my name is ********** i'm trying to enroll myself with contoso yes yeah i'm calling to sign up for insurance", // Example results redacted for brevity
"lexical": "hi my name is ********** i'm trying to enroll myself with contoso yes yeah i'm calling to sign up for insurance" // Example results redacted for brevity
}
],
"conversations": [
{
"id": "conversation1",
"conversationItems": [
{
"id": "0",
"redactedContent": {
"itn": "hello thank you for calling contoso who am i speaking with today",
"lexical": "hello thank you for calling contoso who am i speaking with today",
"text": "Hello, thank you for calling Contoso. Who am I speaking with today?"
},
"entities": [],
"channel": "0",
"offset": "PT0.77S"
},
{
"id": "1",
"redactedContent": {
"itn": "hi my name is ********** i'm trying to enroll myself with contoso",
"lexical": "hi my name is ********** i'm trying to enroll myself with contoso",
"text": "Hi, my name is **********. I'm trying to enroll myself with Contoso."
},
"entities": [
{
"text": "Mary Rondo",
"category": "Name",
"offset": 15,
"length": 10,
"confidenceScore": 0.97
}
],
"channel": "1",
"offset": "PT4.55S"
},
{
"id": "2",
"redactedContent": {
"itn": "hi **** uh are you calling because you need health insurance",
"lexical": "hi **** uh are you calling because you need health insurance",
"text": "Hi, ****. Uh, are you calling because you need health insurance?"
},
"entities": [
{
"text": "Mary",
"category": "Name",
"offset": 4,
"length": 4,
"confidenceScore": 0.93
}
],
"channel": "0",
"offset": "PT9.55S"
},
{
"id": "3",
"redactedContent": {
"itn": "yes yeah i'm calling to sign up for insurance",
"lexical": "yes yeah i'm calling to sign up for insurance",
"text": "Yes. Yeah, I'm calling to sign up for insurance."
},
"entities": [],
"channel": "1",
"offset": "PT13.09S"
},
// Example results redacted for brevity
],
"warnings": []
}
]
}
}
}
用法和参数
用法:call-center -- [...]
重要
可以使用多服务资源或单独的语言和语音资源。 对于两种情况,--languageKey
和 --languageEndpoint
值都必须与相关区域中的资源相对应,这些区域为对话摘要 API 支持的区域之一:eastus
、northeurope
和 uksouth
。
连接选项包括:
--speechKey KEY
:Azure AI 服务或语音资源密钥。 URL 选项中的--input
音频听录所必需。--speechRegion REGION
:Azure AI 服务或语音资源区域。 URL 选项中的--input
音频听录所必需。 示例:eastus
、northeurope
--languageKey KEY
:Azure AI 服务或语言资源密钥。 必需。--languageEndpoint ENDPOINT
:Azure AI 服务或语言资源终结点。 必需。 示例:https://YourResourceName.cognitiveservices.azure.com
输入选项包括:
--input URL
:URL 中的输入音频。 必须设置--input
或--jsonInput
选项。--jsonInput FILE
:输入来自 FILE 的现有批量听录 JSON 结果。 对于此选项,仅需语言资源即可处理已有的听录。 对于此选项时,不需要音频文件或语音资源。 重写--input
。 必须设置--input
或--jsonInput
选项。--stereo
:指示通过 ```input URL` 的音频应采用立体声格式。 如果未指定立体声,则假定为单声道 16khz 16 位 PCM wav 文件。 单声道文件分割用于分离多名说话人。 立体声文件分割不受支持,因为双声道立体声文件应该每个声道都已有一名说话人。--certificate
:PEM 证书文件。 C++ 所需。
语言选项包括:
--language LANGUAGE
:用于情绪分析和对话分析的语言。 此值应为双字母 ISO 639-1 代码。 默认值为en
。--locale LOCALE
:用于音频批量听录的区域设置。 默认值为en-US
。
输出选项包括:
--help
:显示使用情况帮助和停止--output FILE
:将 JSON 格式的听录、情绪、对话 PII 和对话摘要输出为文本文件。 有关详细信息,请参阅输出示例。
清理资源
可以使用 Azure 门户或 Azure 命令行接口 (CLI) 移除创建的 Azure AI 服务资源。