Model Studio の音声認識では、カスタムホットワードとコンテキスト強化を利用して、ドメイン固有の用語、製品名、専門用語の認識精度を向上させることができます。このトピックでは、これら 2 つのアプローチの対応モデル、リージョン、および使用方法について説明します。
ホットワード機能はプライマリワークスペースでのみサポートされており、サブワークスペースではサポートされていません。
概要
製品名、固有名詞、業界用語などの業務固有の語彙は、モデルの汎用語彙に含まれていない場合があり、誤認識されることがよくあります。Model Studio の音声認識では、これらの用語の認識精度を向上させるために、カスタムホットワードとコンテキスト強化を提供しています。
カスタムホットワードとコンテキスト強化の比較
Model Studio の音声認識では、専門用語を扱うための 2 つのアプローチを提供しています。対応するモデルとインターフェイスがそれぞれ異なります:
|
ディメンション |
カスタムホットワード |
コンテキスト強化 |
|
仕組み |
重み付けされた語彙リストを提供します。モデルはデコード時に、リスト内の用語に対するマッチ確率を高めます。 |
会話の履歴またはドメインテキストをコンテキストとして渡します。モデルはこれを使用して認識結果を補正します。 |
|
対応モデル |
Fun-ASR および Paraformer ファミリー (リアルタイム + 非リアルタイム) |
fun-asr-flash-2026-06-15 (非リアルタイムのみ) |
|
最適な用途 |
リクエスト間で再利用する、既知で比較的安定した用語 (製品名や医療用語など) |
会話ごとに動的に変化する用語、またはコンテキストのヒントによって認識精度が向上する固有名詞 (会議の参加者名、サポートコールでのドメイン用語など) |
|
設定 |
事前に語彙リストを作成し、認識時にその ID を渡します。 |
リクエストごとに、 |
前提条件
-
DashScope SDK を介して呼び出す場合は、最新の SDK バージョンをインストールしておく必要があります。
カスタムホットワード
対応モデルとリージョン
シンガポール
以下のモデルを呼び出すには、シンガポールリージョンの API キー を選択してください。
Fun-ASR:
-
リアルタイム音声認識: fun-asr-realtime、fun-asr-realtime-2025-11-07
-
非リアルタイム音声認識: fun-asr、fun-asr-2025-11-07、fun-asr-2025-08-25、fun-asr-mtl、fun-asr-mtl-2025-08-25
中国 (北京)
以下のモデルを呼び出すには、北京リージョンの API キー を選択してください。
-
Fun-ASR:
-
リアルタイム音声認識: fun-asr-realtime、fun-asr-realtime-2025-11-07、fun-asr-realtime-2025-09-15、fun-asr-flash-8k-realtime、fun-asr-flash-8k-realtime-2026-01-28
-
非リアルタイム音声認識: fun-asr、fun-asr-2025-11-07、fun-asr-2025-08-25、fun-asr-mtl、fun-asr-mtl-2025-08-25
-
-
Paraformer:
-
リアルタイム音声認識: paraformer-realtime-v2、paraformer-realtime-8k-v2
-
非リアルタイム音声認識: paraformer-v2、paraformer-8k-v2
-
クイックスタート
仕組み
まず語彙リストを作成し、音声認識を呼び出す際にその ID を参照します。
-
語彙リストを作成する
語彙リスト作成 API を呼び出します。target_model (Java では targetModel) を指定して、リストが適用される音声認識モデルを示します。
語彙リストが既に存在する場合は、このステップをスキップしてください。作成した語彙リストの状態は、語彙リスト照会 API を使用して確認できます。
-
語彙リスト ID を指定して音声認識 API を呼び出す
音声認識モデルは、リスト作成時に設定した target_model (Java では targetModel) と一致する必要があります。一致しない場合、ホットワードは有効になりません。
サンプルコード
エンドツーエンドの例:語彙リストを作成し、音声認識を呼び出し、リストを削除します。サンプル音声ファイル:asr_example.wav。
ホットワード管理 API と音声認識 API は、同じアカウントを使用する必要があります。そうでない場合、認識 API は語彙リストにアクセスできません。
Python
import dashscope
from dashscope.audio.asr import *
import os
# 北京とシンガポールのリージョンでは API キーが異なります。API キーの取得:https://www.alibabacloud.com/help/model-studio/get-api-key
# 環境変数が設定されていない場合は、次の行を dashscope.api_key = "sk-xxx" に置き換えてください
dashscope.api_key = os.environ.get('DASHSCOPE_API_KEY')
# 以下はシンガポールリージョンの設定です。"{WorkspaceId}" を実際のワークスペース ID に置き換えてください。設定はリージョンによって異なります。
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'
# 以下はシンガポールリージョンの設定です。"{WorkspaceId}" を実際のワークスペース ID に置き換えてください。設定はリージョンによって異なります。
dashscope.base_websocket_api_url = 'wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/inference'
prefix = 'testpfx'
target_model = "fun-asr-realtime"
my_vocabulary = [
{"text": "Speech Laboratory", "weight": 4}
]
service = VocabularyService()
vocabulary_id = service.create_vocabulary(
prefix=prefix,
target_model=target_model,
vocabulary=my_vocabulary)
try:
if service.query_vocabulary(vocabulary_id)['status'] == 'OK':
recognition = Recognition(model=target_model,
format='wav',
sample_rate=16000,
callback=None,
vocabulary_id=vocabulary_id)
result = recognition.call('asr_example.wav')
print(result.output)
finally:
# 認識が成功したかどうかに関わらず、クォータを占有しないようにホットワードリストを削除します
service.delete_vocabulary(vocabulary_id)
Java
import com.alibaba.dashscope.audio.asr.recognition.Recognition;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionParam;
import com.alibaba.dashscope.audio.asr.vocabulary.Vocabulary;
import com.alibaba.dashscope.audio.asr.vocabulary.VocabularyService;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.utils.Constants;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class Main {
// 北京とシンガポールのリージョンでは API キーが異なります。API キーの取得:https://www.alibabacloud.com/help/model-studio/get-api-key
// 環境変数が設定されていない場合は、次の行を public static String apiKey = "sk-xxx" に置き換えてください
public static String apiKey = System.getenv("DASHSCOPE_API_KEY");
public static void main(String[] args) throws NoApiKeyException, InputRequiredException {
// 以下はシンガポールリージョンの設定です。"{WorkspaceId}" を実際のワークスペース ID に置き換えてください。設定はリージョンによって異なります。
Constants.baseHttpApiUrl = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
// 以下はシンガポールリージョンの設定です。"{WorkspaceId}" を実際のワークスペース ID に置き換えてください。設定はリージョンによって異なります。
Constants.baseWebsocketApiUrl = "wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/inference";
String targetModel = "fun-asr-realtime";
JsonArray vocabularyJson = new JsonArray();
List<Hotword> wordList = new ArrayList<>();
wordList.add(new Hotword("Speech Laboratory", 4));
for (Hotword word : wordList) {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("text", word.text);
jsonObject.addProperty("weight", word.weight);
vocabularyJson.add(jsonObject);
}
VocabularyService service = new VocabularyService(apiKey);
Vocabulary vocabulary = service.createVocabulary(targetModel, "testpfx", vocabularyJson);
try {
if ("OK".equals(service.queryVocabulary(vocabulary.getVocabularyId()).getStatus())) {
Recognition recognizer = new Recognition();
RecognitionParam param =
RecognitionParam.builder()
.model(targetModel)
.apiKey(apiKey)
.format("wav")
.sampleRate(16000)
.vocabularyId(vocabulary.getVocabularyId())
.build();
try {
System.out.println("Recognition result: " + recognizer.call(param, new File("asr_example.wav")));
} catch (Exception e) {
e.printStackTrace();
} finally {
// WebSocket 接続を閉じます
recognizer.getDuplexApi().close(1000, "bye");
}
}
} finally {
// 認識が成功したかどうかに関わらず、クォータを占有しないようにホットワードリストを削除します
service.deleteVocabulary(vocabulary.getVocabularyId());
}
System.exit(0);
}
}
class Hotword {
String text;
int weight;
public Hotword(String text, int weight) {
this.text = text;
this.weight = weight;
}
}
ホットワードのフォーマット
ホットワードは JSON 配列として送信します。各要素は単一のホットワードとそのプロパティを定義します。語彙リスト (API では vocabulary と呼ばれます) は、これらのホットワードを特定のモデルで使用するためにグループ化します。
例:映画のタイトルの認識精度を向上させます。
[
{"text": "Seediq Bale", "weight": 4, "lang": "en"},
{"text": "Goodbye Mr. Loser", "weight": 4, "lang": "en"},
{"text": "Confucius' Family", "weight": 4, "lang": "en"}
]
フィールドの説明:
|
フィールド |
タイプ |
必須 |
説明 |
|
text |
string |
はい |
ホットワードのテキスト。任意の文字列の組み合わせではなく、実際の単語またはフレーズである必要があります。言語は選択したモデルでサポートされている必要があります。長さの制限については、「ホットワードのテキストルール」をご参照ください。 |
|
weight |
int |
はい |
ホットワードの重み。有効値:[1, 5]。推奨値:4。重みが大きいほど、モデルがその用語を出力する可能性が高くなります。チューニングのガイドラインについては、「ホットワードの重み調整」をご参照ください。 |
|
lang |
string |
いいえ |
ホットワードを特定の言語に制限する言語コード。言語が不明な場合は、このフィールドを省略します。 注: |
ホットワードのテキストルール
ホットワードのテキストは、実際の単語またはフレーズである必要があります。長さの制限は次のとおりです。
-
非 ASCII 文字を含む場合:非 ASCII 文字 (中国語、日本語のかな、韓国のハングル、キリル文字など) と ASCII 文字を合わせた合計文字数が 15 文字を超えてはなりません。
例:
-
✅
"厄洛替尼盐酸盐"(7 文字) -
✅
"EGFR抑制剂"(7 文字、うち EGFR は 4 文字の ASCII 文字) -
✅
"こんにちは"(5 文字) -
✅
"Фенибут Белфарм"(15 文字、スペースを含む) -
❌
"Клофелин Белмедпрепараты"(24 文字)
-
-
ASCII 文字のみの場合:スペースで区切られたセグメントの数が 7 を超えてはなりません。
例:
-
✅
"Exothermic reaction"= 2 セグメント -
✅
"Human immunodeficiency virus type 1"= 5 セグメント -
❌
"The effect of temperature variations on enzyme activity in biochemical reactions"= 11 セグメント
-
ホットワードのパフォーマンスチューニング
ホットワードの重み調整
重みは、モデルがホットワードをどの程度強く優先するかを制御します。誤認識を発生させずにターゲット単語の精度を向上させるために、適切に設定してください。
|
重み |
効果 |
最適な用途 |
|
1-2 |
わずかな優先 |
一般的な単語と発音が似ており、過剰な補正を避ける必要があるホットワード |
|
3-4 |
明確な優先 (推奨) |
ほとんどのシナリオで最適な出発点 |
|
5 |
強制的な優先 |
音声中にその用語が頻繁に出現し、他の単語と混同する可能性が低い場合にのみ使用します。注:重みが過度に高いと、音声的に類似した単語がホットワードとして誤認識される可能性があります。 |
weight=4 から開始し、認識結果に基づいて段階的に調整します。
ホットワードリストの設計
-
シナリオごとにグループ化:異なるビジネスシナリオ (例:医療用語向けと製品名向け) ごとに別々の語彙リストを作成すると、メンテナンスと再利用が簡素化されます。
-
複数言語の混在:単一の語彙リストに異なる言語の用語を含めることができます。
langフィールドを使用してそれらを区別します。音声認識中にlanguage_hintsが指定されると、指定された言語に一致するホットワードのみが有効になります。 -
定期的なクリーンアップ:未使用の語彙リストを削除してクォータを解放します。各アカウントは最大 10 個のリストをサポートします。
制限と課金
|
制限 |
説明 |
|
語彙リストの数 |
アカウントごとに 10 個、すべてのモデルで共通です。 |
|
リストあたりのホットワード数 |
語彙リストごとに最大 500 個のホットワードです。 |
|
課金 |
無料です。 |
コンテキスト強化
対応モデルとリージョン
Singapore
以下のモデルを呼び出すには、シンガポールリージョンの API キー を選択します。
Fun-ASR:
-
非リアルタイム音声認識: fun-asr-flash-2026-06-15
China (Beijing)
以下のモデルを呼び出すには、北京リージョンの API キー を選択します。
Fun-ASR:
-
非リアルタイム音声認識: fun-asr-flash-2026-06-15
クイックスタート
コンテキスト強化では、事前に作成するリソースは不要です。音声認識リクエストでコンテキストパラメーターを渡すだけで利用できます。
-
非リアルタイム音声認識: HTTP リクエストの
input.messagesにコンテキストメッセージを渡します。音声メッセージの前に配置します。
ユースケース: 会話の履歴やドメイン用語をコンテキストとして渡すことで、人名、地名、製品用語などの専門用語の文字起こし精度を大幅に向上できます。この機能は、次のシナリオに対応しています。
-
単語リストによる強化:
user(input_text) を介してドメイン固有の単語リストや用語を渡し、モデルが専門用語を正確に認識できるようにします。 -
マルチターン会話コンテキスト: ASR と大規模言語モデルを組み合わせた音声対話シナリオでは、以前の認識結果 (
user/input_text) とモデルの応答 (assistant/text) を渡すことで、現在のターンの認識精度を向上できます。
-
メッセージ数の制限: エンジンは直近 5 ターンまでのコンテキストを保持します。単語リストによる強化は通常メッセージ 1 件で十分なため、この制限の影響を受けません。上限を超えた場合でもエラーは返されず、古いメッセージが自動的に無視されます。
-
テキスト長の制限: コンテキストの 1 ターンあたりの総テキスト長 (同一ターン内のすべての
userとassistantのtextフィールドの合計長) は 400 文字を超えてはなりません (文字単位でカウントします。英字、漢字、数字、スペース、句読点など、すべて 1 文字としてカウントします)。超過分はエラーを返さず末尾から自動的に切り捨てられます。マルチターンのコンテキストでは、各ターンを個別にカウントします。 -
コンテキストの仕組み: コンテキストは主に単語のマッチングによって機能します。
textフィールドには、音声内で認識させたい単語を正確に含める必要があります (例:Kubernetes、Bulge Bracket)。対象単語を含まない、意味的に関連する説明だけを渡しても効果は限定的です。
非リアルタイム音声認識
input.messages を介してコンテキストを渡します。 以前の音声認識結果またはドメイン固有の単語リストには、input_text タイプの user ロールを使用します。 以前のモデルの応答には、assistant ロールを使用します (オプション)。 コンテキストメッセージはオーディオメッセージの前に配置します。 詳細については、「DashScope 同期呼び出し (Fun-ASR-Flash)」をご参照ください。
単語リストによる強化
user (input_text) を介してドメイン固有の用語を渡します。assistant メッセージは不要です。
{
"model": "fun-asr-flash-2026-06-15",
"input": {
"messages": [
{
"role": "user",
"content": [
{
"type": "input_text",
"text": "Kubernetes Istio Envoy サービスメッシュ サイドカープロキシ"
}
]
},
{
"role": "user",
"content": [
{
"type": "input_audio",
"input_audio": {
"data": "認識対象の現在の音声のオーディオ URL または Base64"
}
}
]
}
]
},
"parameters": {}
}
マルチターン会話コンテキスト
以前の認識結果 (user / input_text) とモデルの応答 (assistant / text) を渡します。
{
"model": "fun-asr-flash-2026-06-15",
"input": {
"messages": [
{
"role": "user",
"content": [
{
"type": "input_text",
"text": "以前のユーザーの発話認識結果"
}
]
},
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "以前のモデルの応答内容"
}
]
},
{
"role": "user",
"content": [
{
"type": "input_audio",
"input_audio": {
"data": "認識対象の現在の音声のオーディオ URL または Base64"
}
}
]
}
]
},
"parameters": {}
}
効果例
text フィールドのフォーマットは柔軟で、単語リスト、自然言語の段落、またはその混在を指定できます。無関係なテキストが含まれていても許容範囲が広いです。
音声クリップは、次のように正しく認識される必要があります。
|
コンテキスト強化なし コンテキスト強化がない場合、一部の投資銀行名が誤って認識されます。例えば、「Bulge Bracket」は「Bird Rock」と認識されることがあります。 認識結果:「The jargon within investment banking circles, how much do you know? First, the nine major foreign investment banks, Bird Rock, BB ...」 |
コンテキスト強化あり コンテキスト強化がある場合、投資銀行名が正しく認識されます。 認識結果:「The jargon within investment banking circles, how much do you know? First, the nine major foreign investment banks, Bulge Bracket, BB ...」 |
上記の例では、「Bulge Bracket」などの用語を含む単語リストまたは自然言語の段落を text フィールドに追加することで、強化の効果が得られます。
API リファレンス
よくある質問
Q:ホットワードを使用しても認識精度が向上しないのはなぜですか?
以下の項目を順に確認してください:
-
モデルのミスマッチ:リストの作成時に指定した
target_modelは、音声認識 API で使用されるモデルと一致する必要があります。不一致があってもエラーは発生せず、認識結果は返されますが、ホットワードは有効になりません。結果に期待されるホットワードが含まれていない場合は、まずこの点を確認してください。 -
非対応モデル:モデルは Fun-ASR または Paraformer ファミリーに属している必要があります。他のファミリーはホットワードをサポートしていません。非対応のモデルで API を呼び出してもエラーは返されませんが、結果が空になるか、ホットワードが適用されない可能性があります。SenseVoice などのモデルを使用している場合は、まずこの点を確認してください。
-
不適切な重み:重みを 4 から 5 に増やし、結果を確認してください。音声的に類似した単語がホットワードとして誤認識され始めた場合は、4 に戻してください。
-
ホットワードリストのステータス:Query API を使用して、
statusがOKであることを確認してください。
Q:ホットワードは、リアルタイム音声認識とファイルベースの音声認識で使い方が異なりますか?
ホットワードリストの作成方法は同じですが、呼び出し方法が異なります:
-
リアルタイム音声認識:Recognition または WebSocket 接続のパラメーターで
vocabulary_idを渡します。 -
ファイルベースの音声認識:文字起こしリクエストのパラメーターで
vocabulary_idを渡します。
どちらの場合も、target_model は API 呼び出しで使用される音声認識モデルと一致する必要があります。
Q:ホットワード以外で認識精度を向上させるにはどうすればよいですか?
ホットワードとコンテキスト強化に加えて、以下を検討してください:
-
音質:サンプリングレートをモデルの要件 (16 kHz または 8 kHz) に合わせ、バックグラウンドノイズを低減してください。
-
適切なモデルの選択:シナリオによって、適したモデルは異なります。詳細については、音声テキスト変換モデル選択ガイドをご参照ください。
-
言語の指定:
language_hintsを通じて音声言語を宣言することで、単一言語のシナリオでの精度が向上します。