你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:通话后听录和分析

语言服务文档 | Language Studio | 语音服务文档 | Speech Studio

本 C# 快速入门中会对呼叫中心、听录执行情绪分析和对话摘要操作。 该示例将自动识别敏感信息并对其进行分类和编辑。 本快速入门会实现使用 Azure 认知语音Azure 认知语言服务功能的跨服务方案。

提示

请尝试访问 Language StudioSpeech Studio,通过演示了解如何使用语言和语音服务分析呼叫中心对话。

若要使用无代码方法将呼叫中心听录解决方案部署到 Azure,请尝试引入客户端

此快速入门使用以下适用于语音的 Azure AI 服务:

  • 批量听录:提交一批音频文件以进行听录。
  • 说话人分离:通过单声道 16khz 16 位 PCM wav 文件分离多名说话人。

语言服务提供我们使用的以下功能:

先决条件

重要

本快速入门需要对对话摘要的访问权限。 若要获得访问权限,必须提交在线请求并获得批准。

本快速入门中的 --languageKey--languageEndpoint 值必须与相关区域中的资源相对应,这些区域为对话摘要 API 支持的区域之一:eastusnortheuropeuksouth

使用 C# 运行通话后听录分析

按照以下步骤生成并运行通话后听录分析快速入门代码示例。

  1. 从 GitHub 复制 scenarios/csharp/dotnetcore/call-center/ 示例文件。 如果已安装 Git,请打开命令提示符并运行 git clone 该命令,以下载语音 SDK 示例存储库。

    git clone https://github.com/Azure-Samples/cognitive-services-speech-sdk.git
    
  2. 打开命令提示符,并更改为项目目录。

    cd <your-local-path>/scenarios/csharp/dotnetcore/call-center/call-center/
    
  3. 使用 .NET CLI 生成项目。

    dotnet build
    
  4. 使用首选命令行参数运行应用程序。 请参阅用法和参数以了解可用选项。

    下面是从 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 支持的区域之一:eastusnortheuropeuksouth

连接选项包括:

  • --speechKey KEYAzure AI 服务语音资源密钥。 URL 选项中的 --input 音频听录所必需。

  • --speechRegion REGIONAzure AI 服务语音资源区域。 URL 选项中的 --input 音频听录所必需。 示例:eastusnortheurope

  • --languageKey KEYAzure AI 服务语言资源密钥。 必需。

  • --languageEndpoint ENDPOINTAzure 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 服务资源。

后续步骤