IBM Cloud Docs
创建定制语言模型

创建定制语言模型

遵循以下步骤来创建 IBM Watson® Speech to Text 服务的定制语言模型,将内容添加到该服务并对其进行训练:

  1. 创建定制语言模型。 可以针对相同或不同的领域创建多个定制模型。 对于创建的任何模型,此过程都是相同的。 语言模型定制可用于所有大型语音模型,大多数上一代模型以及所有下一代模型。 有关更多信息,请参阅定制的语言支持
  2. 向定制语言模型添加语料库。 语料库是一个纯文本文档,在上下文中使用某个领域的术语。 可以向一个定制模型连续添加多个语料库,一次添加一个。 对于基于前代模型的定制模型, 服务通过从其基本词汇表中不存在的语料库中抽取术语来构建定制模型的词汇表。 对于基于下一代模型的定制模型, 服务从语料库中抽取字符序列而不是词。
  3. 向定制语言模型添加词。 您还可以单独向模型添加定制词。 您可以指定定制模型中的词在语音文字记录中的显示方式以及它们在音频中的发音方式。 对于基于上一代模型的定制模型, 您还可以修改从语料库中抽取的定制词。
  4. 训练定制语言模型。 将语料库和词添加到定制模型后,必须训练该模型。 通过训练,可准备定制模型以用于语音识别。 在训练之前,该模型不会使用新的或修改过的语料库或词汇。
  5. 使用定制语言模型进行语音识别。 训练完自定义模型后,您就可以用它来处理语音识别请求。 如果传递给转录的音频包含自定义模型语料库和自定义单词中定义的特定领域单词,则请求的结果将反映模型的增强词汇量。 在语音识别请求中一次只能使用一个模型。

创建定制语言模型的步骤是迭代的。 您可以根据需要,随时添加语料库,添加词,以及训练或重新训练模型。 您还可以为大多数自定义语言模型添加语法。 语法将服务的响应限制为仅语法识别到的那些词。

创建定制语言模型

使用 POST /v1/customizations 方法来创建新的定制语言模型。 此方法接受用于定义新定制模型属性的 JSON 对象作为请求主体。 拥有新定制模型的服务实例是其凭证用于创建该模型的实例。 有关更多信息,请参阅定制模型的所有权

对于每个拥有凭证,最多可以创建 1024 个定制语言模型。 有关更多信息,请参阅最大定制模型数

新的定制语言模型具有以下属性:

name (必需 字符串)

新定制模型的用户定义名称。 使用与定制模型语言匹配的本地化名称,并描述模型的域,例如 Medical custom modelLegal custom model

  • 名称最多包含256个字符。
  • Do not use backslashes, slashes, colons, equal signs, ampersands, or question marks in the name.
  • 使用的名称应在您拥有的所有定制语言模型中唯一。
base_model_name (必需 字符串)

新定制模型要定制的基础语言模型的名称。 必须使用由 GET /v1/models 方法返回的模型的名称。 新的定制模型只能用于它所定制的基本模型。

dialect (可选 字符串)

指定语言中要用于新定制模型的方言。 对于所有语言,省略此字段始终是安全的。 服务会自动使用基本模型名称中的语言标识。 例如,服务会自动将 en-US 用于所有美国英语模型。

如果为新的定制模型指定 dialect,请遵循以下准则:

  • 对于非西班牙语上一代模型和下一代模型,必须指定与基本模型名称中的五字符语言标识相匹配的值。
  • 对于西班牙语上一代模型,必须指定下列其中一个值:
    • es-ES,用于卡斯蒂利亚西班牙语(es-ES 模型)
    • es-LA,用于拉丁美洲西班牙语(es-ARes-CLes-COes-PE 模型)
    • es-US 用于墨西哥(北美)西班牙语(es-MX 模型)

您为 dialect 字段传递的所有值都不区分大小写。

description (可选 字符串)

推荐的新定制车型描述。

  • 请使用与定制模型的语言相匹配的本地化描述。
  • 描述中最多包含128个字符。

以下示例创建名为 Example model 的新定制语言模型。 此模型创建用于基本模型 en-US-BroadbandModel,并且描述为 Example custom language model。 所需的 Content-Type 标头指定了JSON数据正在传递给该方法。

IBM Cloud

curl -X POST -u "apikey:{apikey}" \
--header "Content-Type: application/json" \
--data "{\"name\": \"Example model\", \
  \"base_model_name\": \"en-US_BroadbandModel\", \
  \"description\": \"Example custom language model\"}" \
"{url}/v1/customizations"

IBM Cloud Pak for Data IBM Software Hub

curl -X POST \
--header "Authorization: Bearer {token}" \
--header "Content-Type: application/json" \
--data "{\"name\": \"Example model\", \
  \"base_model_name\": \"en-US_BroadbandModel\", \
  \"description\": \"Example custom language model\"}" \
"{url}/v1/customizations"

该示例将返回新模型的定制标识。 每个定制模型都通过唯一的定制标识进行标识,这是全局唯一标识 (GUID)。 使用与模型关联的调用的 customization_id 参数可指定定制模型的 GUID。

{
  "customization_id": "74f4807e-b5ff-4866-824e-6bba1a84fe96"
}

向定制语言模型添加语料库

创建自定义语言模型后,下一步就是向模型中添加特定领域数据。 推荐的方法是添加一个或多个语料库来填充自定义模型。 语料库是一个纯文本文件,理想情况下包含您领域中的样本句子。

  • 对于基于大型语音模型的定制模型, 服务会从一个或多个语料库文件中解析和抽取词序列。 这些字符可帮助服务从音频中学习和预测字符序列。 有关将语料库与基于大型语音模型的定制模型配合使用的更多信息,请参阅 使用大型语音模型和下一代模型的语料库

  • 对于基于先前生成模型的定制模型, 服务会解析语料库文件并抽取不在其基本词汇表中的任何词。 此类词称为未登录 (OOV) 词。 有关将语料库与基于前代模型的定制模型配合使用的更多信息,请参阅 使用前代模型的语料库

  • 对于基于下一代模型的定制模型, 服务会解析并从语料库文件中抽取字符序列。 这些字符可帮助服务从音频中学习和预测字符序列。 有关将语料库与基于下一代模型的定制模型配合使用的更多信息,请参阅 使用大型语音模型和下一代模型的语料库

语料库通过提供包含特定领域词汇的句子,让服务能够学习上下文中的词汇和字符序列。 您还可以单独扩充和修改模型的词。 相对于基于从语料库添加的词来训练模型,仅基于单个词对模型进行训练会耗时更长,并且可能会生成有效性更低的结果。

使用 POST /v1/customizations/{customization_id}/corpora/{corpus_name} 方法来向定制模型添加语料库:

customization_id (必需 字符串)
指定要向其添加语料库的定制模型的定制标识。
corpus_name (必需 字符串)
为语料库指定一个名称。 请使用与定制模型的语言相匹配并反映语料库内容的本地化名称。
  • 名称中最多可包含 128 个字符。
  • 不要使用需要进行 URL 编码的字符。 例如,不要在名称中使用空格、斜杠、反斜杠、冒号、& 符号、双引号、加号、等号和问号等。 (服务不会阻止使用这些字符。 但是,由于这些字符在使用的任何位置都必须进行 URL 编码,因此强烈建议不要使用。)
  • 不要使用已添加到定制模型的语料库或语法的名称。
  • 不要使用名称 user,此名称由服务保留用于表示用户添加或修改的定制词。
  • 不要使用名称 base_lmdefault_lm。 这两个名称都保留供服务未来使用。

将文本文件作为请求正文传递。 以下示例将语料库文本文件 healthcare.txt 添加到具有指定标识的定制模型。 示例将语料库命名为 healthcare

IBM Cloud

curl -X POST -u "apikey:{apikey}" \
--data-binary @healthcare.txt \
"{url}/v1/customizations/{customization_id}/corpora/healthcare"

IBM Cloud Pak for Data IBM Software Hub

curl -X POST \
--header "Authorization: Bearer {token}" \
--data-binary @healthcare.txt \
"{url}/v1/customizations/{customization_id}/corpora/healthcare"

此方法还接受可选的 allow_overwrite 查询参数,用于覆盖定制模型的现有语料库。 如果在将语料库文件添加到模型后需要更新该文件,请使用此参数。

这是异步方法。 可能需要大约几分钟时间才能完成。 操作持续时间取决于语料库中的总字数以及服务上的当前负载。 对于基于上一代模型的定制模型, 持续时间还取决于服务在语料库中找到的新词的数量。 有关检查语料库的状态的更多信息,请参阅监视添加语料库请求

通过对每个语料库文本文件调用此方法一次,可以将任意数量的语料库添加到定制模型。 一个语料库的添加操作必须完全完成后,才能添加其他语料库。 首次向模型添加语料库时,语料库的状态为 being_processed。 服务处理完语料库后,其状态会变为 analyzed

对于基于前代模型的定制模型, 在添加语料库完成后,请检查从中抽取的新定制词,以查找拼写错误和其他错误。 有关更多信息,请参阅 验证先前生成模型的词资源

监视添加语料库请求

如果语料库有效,服务会返回 201 响应代码。 然后,它以异步方式处理语料库的内容。 在服务对当前请求的语料库的分析完成之前,无法提交向定制模型添加数据或训练模型的请求。

要确定分析的状态,请使用 GET /v1/customizations/{customization_id}/corpora/{corpus_name} 方法来轮询语料库的状态。 此方法接受模型的标识和语料库的名称,如以下示例中所示:

IBM Cloud

curl -X GET -u "apikey:{apikey}" \
"{url}/v1/customizations/{customization_id}/corpora/corpus1"

IBM Cloud Pak for Data IBM Software Hub

curl -X GET \
--header "Authorization: Bearer {token}" \
"{url}/v1/customizations/{customization_id}/corpora/corpus1"

回答包括语料库的状态。 由于定制模型基于先前生成的模型,因此响应将显示 OOV 字数。

{
  "name": "corpus1",
  "total_words": 5037,
  "out_of_vocabulary_words": 401,
  "status": "analyzed"
}

status 字段具有下列其中一个值:

  • analyzed 指示服务已成功分析语料库。
  • being_processed 指示服务仍在分析语料库。
  • undetermined 指示服务在处理语料库时遇到错误。

使用循环每 10 秒检查一次语料库的状态,直到它变为 analyzed。 有关检查模型的语料库状态的更多信息,请参阅列出定制语言模型的语料库

向定制语言模型添加词

虽然向定制语言模型添加词的建议方法是添加语料库,但也可以将单个定制词直接添加到模型中。 服务会解析定制模型的定制词,就像它执行来自语料库的词的内容一样。

如果您只有一个或几个词要添加到模型中,使用语料库来添加词可能并不实用,甚至并不可行。 最简单的方法是添加仅包含其拼写的词。 但是,您还可以指示如何显示该词以及该词的一个或多个发音。

在自定义模型中添加文字后,请检查新的自定义文字,查看是否有拼写错误或其他错误。 当您一次添加多个单词时,此检查尤为重要。

使用 POST 方法添加词

POST /v1/customizations/{customization_id}/words 方法一次添加一个或多个单词。 通过请求主体或从文件传递要添加为 JSON 数据的词。 无论哪种情况,所需的 Content-Type 标头都指定了JSON数据正在传递给该方法。

以下示例在指定ID的自定义模型中添加了两个自定义单词:HHonorsIEEE

  • 第一个示例通过请求主体传递有关每个单词的信息:

    IBM Cloud

    curl -X POST -u "apikey:{apikey}" \
    --header "Content-Type: application/json" \
    --data "{\"words\": [ \
       {\"word\": \"HHonors\", \"sounds_like\": [\"hilton honors\", \"H. honors\"], \"display_as\": \"HHonors\"}, \
       {\"word\": \"IEEE\", \"sounds_like\": [\"I. triple E.\"]}]}" \
    "{url}/v1/customizations/{customization_id}/words"
    

    IBM Cloud Pak for Data IBM Software Hub

    curl -X POST \
    --header "Authorization: Bearer {token}" \
    --header "Content-Type: application/json" \
    --data "{\"words\": [ \
      {\"word\": \"HHonors\", \"sounds_like\": [\"hilton honors\", \"H. honors\"], \"display_as\": \"HHonors\"}, \
      {\"word\": \"IEEE\", \"sounds_like\": [\"I. triple E.\"]}]}" \
    "{url}/v1/customizations/{customization_id}/words"
    
  • 第二个示例从名为 words.json 的文件添加相同的词:

    {
      "words": [
        {"word": "HHonors", "sounds_like": ["hilton honors", "H. honors"], "display_as": "HHonors"},
        {"word": "IEEE", "sounds_like": ["I. triple E."]}
      ]
    }
    

    以下请求将文件中的文字添加进来:

    IBM Cloud

    curl -X POST -u "apikey:{apikey}" \
    --header "Content-Type: application/json" \
    --data-binary @words.json \
    "{url}/v1/customizations/{customization_id}/words"
    

    IBM Cloud Pak for Data IBM Software Hub

    curl -X POST \
    --header "Authorization: Bearer {token}" \
    --header "Content-Type: application/json" \
    --data-binary @words.json \
    "{url}/v1/customizations/{customization_id}/words"
    

POST 方法是非同步的。 可能需要大约几分钟时间才能完成。 完成所需的时间取决于添加的词数和服务上的当前负载。 有关检查该操作的状态的更多信息,请参阅监视添加词请求

使用 PUT 方法添加词

PUT /v1/customizations/{customization_id}/words/{word_name} 方法可添加单个词。 您传递一个JSON对象作为请求正文,其中包含单词的相关信息。

以下示例将词 NCAA 添加到具有指定标识的模型。 所需的 Content-Type 标头再次表明JSON数据正在传递给该方法。

IBM Cloud

curl -X PUT -u "apikey:{apikey}" \
--header "Content-Type: application/json" \
--data "{\"sounds_like\": [\"N. C. A. A.\", \"N. C. double A.\"]}" \
"{url}/v1/customizations/{customization_id}/words/NCAA"

IBM Cloud Pak for Data IBM Software Hub

curl -X PUT \
--header "Authorization: Bearer {token}" \
--header "Content-Type: application/json" \
--data "{\"sounds_like\": [\"N. C. A. A.\", \"N. C. double A.\"]}" \
"{url}/v1/customizations/{customization_id}/words/NCAA"

PUT 方法是同步的。 服务会返回响应代码,以立即报告请求是成功还是失败。

监视添加词请求

使用 POST /v1/customizations/{customization_id}/words 方法时,如果输入数据有效,服务会返回 201 响应代码。 然后,服务会异步处理这些词以将其添加到模型中。 在服务完成添加新词的请求之前,无法提交向定制模型添加数据或训练模型的请求。

要确定请求的状态,请使用 GET /v1/customizations/{customization_id} 方法来轮询模型的状态。 此方法接受模型的定制标识,如以下示例中所示:

IBM Cloud

curl -X GET -u "apikey:{apikey}" \
"{url}/v1/customizations/{customization_id}"

IBM Cloud Pak for Data IBM Software Hub

curl -X GET \
--header "Authorization: Bearer {token}" \
"{url}/v1/customizations/{customization_id}"

请求包含有关模型状态的信息:

{
  "customization_id": "74f4807e-b5ff-4866-824e-6bba1a84fe96",
  "created": "2016-06-01T18:42:25.324Z",
  "updated": "2016-06-01T18:45:11.737Z",
  "language": "en-US",
  "dialect": "en-US",
  "owner": "297cfd08-330a-22ba-93ce-1a73f454dd98",
  "name": "Example model",
  "description": "Example custom language model",
  "base_model_name": "en-US_BroadbandModel",
  "status": "pending",
  "progress": 0
}

status 字段报告模型的当前状态。 服务处理新词期间,状态会保持为 pending。 使用循环每 10 秒检查一次状态,直到它变为 ready,这指示操作完成。 有关可能的 status 值的更多信息,请参阅监视训练模型请求

修改定制模型中的词

您还可以使用 POST /v1/customizations/{customization_id}/wordsPUT /v1/customizations/{customization_id}/words/{word_name} 方法修改或扩充定制模型中的词。 您可能需要使用这两个方法来更正将词添加到模型时所犯的拼写错误或其他错误。 您可能还需要为现有词添加发音相似的读法定义。

使用这两个方法可修改现有词的定义,具体做法与添加词的完全一样。 为词提供的新数据将覆盖该词的现有定义。 对于基于上一代模型的定制模型, 您还可以修改从语料库添加的词。

训练定制语言模型

一旦您用新词填充了自定义语言模型(通过添加语料库、直接添加单词或添加语法),您必须用新数据训练模型。 通过训练,可准备定制模型以将这些数据用于语音识别。 对于通过任何方法添加的词,在基于这些数据训练模型之前,模型不会使用这些词。

使用 POST /v1/customizations/{customization_id}/train 方法来训练定制模型。 您将向此方法传递要训练的模型的定制标识,如以下示例中所示:

IBM Cloud

curl -X POST -u "apikey:{apikey}" \
"{url}/v1/customizations/{customization_id}/train"

IBM Cloud Pak for Data IBM Software Hub

curl -X POST \
--header "Authorization: Bearer {token}" \
"{url}/v1/customizations/{customization_id}/train"

这是异步方法。 根据训练模型所基于的新词数和服务上的当前负载,训练可能大约需要几分钟才能完成。 有关检查训练操作的状态的更多信息,请参阅监视训练模型请求

此方法包含以下可选的查询参数:

  • word_type_to_add 参数指定训练定制模型所要基于的词:

    • 指定 all 或省略此参数将基于模型的所有词(不管其来源是什么)来训练模型。
    • 指定 user 将仅基于用户添加或修改的词来训练模型,而忽略仅从语料库或语法中抽取的词。

    对于基于前代模型的定制模型, 如果添加包含干扰数据的语料库 (例如包含拼写错误的词),那么此选项非常有用。 在基于此类数据训练模型之前,可以使用 word_type 方法的 GET /v1/customizations/{customization_id}/words 查询参数来复查从语料库和语法中抽取的词。 更多信息,请参阅“自定义语言模型中的自定义单词列表”。

    对于基于大型语音模型和下一代模型的定制模型, 服务将忽略 word_type_to_add 参数。 词资源仅包含用户直接添加或修改的定制词,因此该参数是不必要的。

  • customization_weight 参数指定在将定制模型用于语音识别时,给予定制模型中词相对于基本词汇表中词的权重。 您还可以在使用定制模型的任何识别请求中指定定制权重。 有关更多信息,请参阅使用定制权重

  • strict 参数用于指示当自定义模型包含有效和无效资源(语料库、单词和语法)时是否继续训练。 缺省情况下,如果模型包含一个或多个无效资源,训练会失败。 将此参数设置为 false,以允许只要模型包含至少一个有效资源,就继续进行训练。 服务会从训练中排除无效的资源。 有关更多信息,请参阅定制语言模型训练失败

监视训练模型请求

如果服务成功启动训练过程,那么服务会返回 200 响应代码。 在现有请求完成之前,该服务不接受后续培训请求,也不接受添加新语料库、单词或语法的请求。

将定制词直接添加到基于大型语音模型或下一代模型的定制模型,如 将词添加到定制语言模型 中所述,这将导致模型的训练时间比其他模型长几分钟。 如果要使用使用 POST /v1/customizations/{customization_id}/wordsPUT /v1/customizations/{customization_id}/words/{word_name} 方法添加的定制词来训练模型,请为该模型留出一些分钟的额外训练时间。

要确定训练请求的状态,请使用 GET /v1/customizations/{customization_id} 方法来轮询模型的状态。 此方法接受模型的定制标识:

IBM Cloud

curl -X GET -u "apikey:{apikey}" \
"{url}/v1/customizations/{customization_id}"

IBM Cloud Pak for Data IBM Software Hub

curl -X GET \
--header "Authorization: Bearer {token}" \
"{url}/v1/customizations/{customization_id}"

响应包含有关模型状态的信息:

{
  "customization_id": "74f4807e-b5ff-4866-824e-6bba1a84fe96",
  "created": "2016-06-01T18:42:25.324Z",
  "updated": "2016-06-01T18:45:11.737Z",
  "language": "en-US",
  "dialect": "en-US",
  "owner": "297cfd08-330a-22ba-93ce-1a73f454dd98",
  "name": "Example model",
  "description": "Example custom language model",
  "base_model_name": "en-US_BroadbandModel",
  "status": "training",
  "progress": 0
}

响应包含用于报告定制模型状态的 statusprogress 字段。 progress 字段的含义取决于模型的状态。 status 字段可以具有下列其中一个值:

  • pending 指示模型已创建,但正在等待添加有效训练数据或等待服务完成对已添加的数据的分析。 progress 字段为 0

  • ready 指示模型包含有效数据,已准备好进行训练。 progress 字段为 0

    如果模型包含有效和无效资源的组合(例如,有效和无效的定制词),那么除非您将 strict 查询参数设置为 false,否则模型训练会失败。 有关更多信息,请参阅定制语言模型训练失败

  • training 指示正在训练模型。 progress 字段为 0。 当训练完成时,字段将从 0 更改为 100

  • available 指示模型已训练并已准备好供使用。 progress 字段为 100

  • upgrading 指示正在升级模型。 progress 字段为 0

  • failed 指示模型训练失败。 progress 字段为 0。 有关更多信息,请参阅定制语言模型训练失败

使用循环每 10 秒检查一次状态,直到它变为 available。 有关检查定制模型的状态的更多信息,请参阅列出定制语言模型

定制语言模型训练失败

如果服务正在处理定制语言模型的其他请求,那么训练无法启动。 例如,服务正在执行以下操作时,训练请求无法启动,状态码为 409:

  • 处理语料库或语法以生成 OOV 词的列表或抽取字符序列
  • 处理定制词以验证或自动生成发音相似的读法
  • 处理其他训练请求

如果定制模型存在以下情况,训练也无法启动,状态码为 400:

  • 自创建或上次训练以来,不包含任何新的有效训练数据(语料库、单词或语法)
  • 包含一个或多个无效语料库、单词或语法(例如,自定义单词的发音与某个单词相似,但发音无效)

如果训练请求失败且状态码为 400,那么服务会将定制模型的状态设置为 failed。 请执行下列其中一项操作:

  • 使用定制接口的方法来检查模型的资源,并修正发现的任何错误:

    • 对于无效的语料库,可以更正语料库文本文件,然后使用 allow_overwrite 方法的 POST /v1/customizations/{customization_id}/corpora/{corpus_name} 参数将更正后的文件添加到模型。 有关更多信息,请参阅向定制语言模型添加语料库
    • 对于无效的语法,可以更正语法文件,然后使用 allow_overwrite 方法的 POST /v1/customizations/{customization_id}/grammars/{grammar_name} 参数将更正后的文件添加到模型。 有关更多信息,请参阅向定制语言模型添加语法
    • 对于无效的定制词,可以使用 POST /v1/customizations/{customization_id}/wordsPUT /v1/customizations/{customization_id}/words/{word_name} 方法直接在模型的词资源中修改该词。 有关更多信息,请参阅修改定制模型中的词

    有关在自定义语言模型中验证单词的更多信息,请参阅

  • strict 方法的 POST /v1/customizations/{customization_id}/train 参数设置为 false,以从训练中排除无效的资源。 模型必须至少包含一个有效的资源(语料库、单词或语法),才能成功进行训练。 strict 参数对于训练包含有效和无效资源组合的定制模型非常有用。