Skip to main content

Qwen-Audio-ASR-Message Python SDK

このトピックでは、Qwen-Audio-ASR-Message リアルタイム音声認識モデル用の Python SDK のパラメータとインターフェイスについて説明します。

前提条件

サービスが有効化されており、「API キーの取得」が完了していること。コード漏洩によるセキュリティリスクを防ぐため、コードにハードコーディングするのではなく、「API キーを環境変数として設定」してください。

クイックスタート

コアリソース(client.audio.asr)は、非ストリーミング呼び出しと双方向ストリーミング呼び出しの両方のインターフェイスを提供します。ニーズに合わせて呼び出し方法を選択してください:
  • 非ストリーミング呼び出し(recognize_file):ローカルファイルを認識します。SDK が自動的に音声をブロック単位で送信し、タスクを完了まで駆動します。録音済みの音声を処理する場合に適しています。
  • 双方向ストリーミング呼び出し(recognize セッション):音声ストリームを直接認識し、結果をリアルタイムで出力します。音声ストリームは、マイクなどの外部デバイスから取得することも、ローカルファイルから読み取ることもできます。即時のフィードバックが必要なシナリオに適しています。
  • 非ストリーミング呼び出し
  • 双方向ストリーミング呼び出し
単一のリアルタイム音声認識タスクを送信し、ローカルファイルを渡すことで認識結果を同期的に取得します。コアリソース(client.audio.asr)の recognize_file メソッドを呼び出してリクエストパラメーターをバインドし、ローカルファイルのパスを渡し、サービス側のイベントを反復処理して認識結果を取得します。
import os
import dashscope

# API キーは、シンガポールリージョンと北京リージョンで異なります。 API キーの取得: https://www.alibabacloud.com/help/model-studio/get-api-key
# 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください: api_key="sk-xxx"
client = dashscope.Client(
    api_key=os.environ.get('DASHSCOPE_API_KEY'),
    # 以下はシンガポール (ap-southeast-1) リージョンの設定です。 呼び出す際に、"{WorkspaceId}" を実際のワークスペース ID に置き換えてください。 設定はリージョンによって異なります。
    workspace="{WorkspaceId}",
    region="ap-southeast-1",
)

# ローカル音声ファイルを認識します:recognize_file は音声を自動的にブロック単位で送信し、タスクを完了まで駆動します
for event in client.audio.asr.recognize_file(
        '{YOUR_AUDIO_FILE}',
        model='qwen-audio-3.1-asr-flash-message',
        format='wav',
        sample_rate=16000):
    payload = event.get('payload') or {}
    sentence = (payload.get('output') or {}).get('sentence') or {}
    if sentence.get('text') and not sentence.get('heartbeat'):
        print('Recognition result: ', sentence['text'])

リクエストパラメーター

リクエストパラメーターは、コアリソース(client.audio.asr)の recognize/recognize_file メソッドで設定します:model、format、sample_rate、vocabulary_id は具名パラメーター、その他のパラメーター(language_hints など)は parameters 辞書で渡します。
パラメータータイプ必須説明
modelstrはいモデル名。
sample_rateintはいサンプリングレート(Hz)。16000 のみをサポートします。
formatstrはいオーディオフォーマット。有効な値:
  • pcm
  • wav
  • mp3
  • opus
  • speex
  • aac
  • amr
opus/speex: Ogg カプセル化を使用する必要があります。wav: PCM エンコーディングを使用する必要があります。amr: AMR-NB タイプのみをサポートしています。
keep_dialectboolいいえデフォルトは false で、方言を標準中国語に変換します。true に設定すると、方言表現を保持します。 同名のキーワード引数で指定します。最終結果(sentence_end=true)にのみ適用され、中間結果(sentence_end=false)ではサポートされません。
vad_modelstrいいえVAD モデル。near_meeting_16k(近距離)または far_field_meeting_16k(遠距離、デフォルト)を指定します。 同名のキーワード引数で指定します。
disfluency_removal_enabledboolいいえつなぎ言葉を除去し、出力を整えるかどうか。デフォルトは false。有効にするには true に設定します。 同名のキーワード引数で指定します。
intermediate_result_enabledboolいいえストリーミング中間結果を返すかどうか。デフォルトは false。中間結果を返すには true に設定します。 同名のキーワード引数で指定します。
vocabulary_idstrいいえ事前コンパイル済みのホットワードリストのID。ホットワードリスト作成 API を呼び出して、この ID を事前に生成します。認識時に ID を渡して、リスト内のホットワードを使用します。語彙が既知で比較的安定しており、リクエスト間で同じ単語リストを再利用する必要があるシナリオに適しています。使用法の詳細については、「事前コンパイル済みホットワード」をご参照ください。
vocabularydictいいえインスタントホットワード。キーと値のペアとして渡します。キーはホットワードのテキスト (文字列)、値はホットワードの重み (整数) です。事前にホットワードリストを作成する必要はありません。重みの範囲は [1, 5] または 50 に設定します。値が [1, 5] の範囲内である場合、値が大きくなるほどモデルがその単語を出力する可能性が高くなります。値が 50 の場合はスーパーホットワードを指定し、再現率が大幅に向上しますが、スーパーホットワードの数は 50 を超えることはできません。一時的なセッションレベルのホットワードの最適化に適しています。事前コンパイル済みのホットワードと一緒に設定した場合、インスタントホットワードのみが有効になります。使用法の詳細については、「インスタントホットワード」をご参照ください。
qwen-audio-3.1-asr-flash-message のみがインスタントホットワードをサポートします。
例:
import os
import dashscope

client = dashscope.Client(api_key=os.getenv("DASHSCOPE_API_KEY"))

# インスタント語彙は parameters を通じて渡します
vocab = {"John Smith": 5, "Jane Doe": 5}
recognition = client.audio.asr.recognize(
    model='qwen-audio-3.1-asr-flash-message',
    format='wav',
    sample_rate=16000,
    parameters={"vocabulary": vocab},
)
language_hintslist[str]いいえ認識する音声の言語。デフォルト値はありません。設定しない場合、モデルは自動的に言語を検出します。最大 4 つの値を設定できます。それ以上設定した場合は、最初の 4 つのみが有効です。
  • zh: 中国語
  • en: 英語
  • ja: 日本語
  • ko: 韓国語
  • vi: ベトナム語
  • th: タイ語
  • id: インドネシア語
  • ms: マレー語
  • tl: フィリピノ語
  • hi: ヒンディー語
  • ar: アラビア語
  • fr: フランス語
  • de: ドイツ語
  • es: スペイン語
  • pt: ポルトガル語
  • ru: ロシア語
  • it: イタリア語
  • nl: オランダ語
  • sv: スウェーデン語
  • da: デンマーク語
  • fi: フィンランド語
  • no: ノルウェー語
  • el: ギリシャ語
  • pl: ポーランド語
  • cs: チェコ語
  • hu: ハンガリー語
  • ro: ルーマニア語
  • bg: ブルガリア語
  • hr: クロアチア語
  • sk: スロバキア語
同名のキーワード引数として渡します。最終結果(sentence_end=true)にのみ適用され、中間結果(sentence_end=false)ではサポートされません。
max_sentence_silenceintいいえVAD の文分割の無音しきい値(ミリ秒)。発話後の無音時間がこの値を超えると、文の終了と判断します。デフォルト:800。有効範囲:[200, 6000]。
heartbeatboolいいえハートビートパケットを有効にするかどうか。デフォルト:False。
  • True:無音音声が継続的に送信されている間、サーバーへの接続を維持します。
  • False (デフォルト):無音音声が継続的に送信されていても、接続は一定時間後にタイムアウトして切断されます。
無音オーディオとは、オーディオファイルまたはデータストリーム内で音声信号を含まないコンテンツを指します。 Audacity や Adobe Audition のような音声編集ソフトウェアを使用したり、FFmpeg のようなコマンドラインツールを使用したりするなど、いくつかの方法で無音のオーディオを生成できます。このフィールドには SDK バージョン 1.23.1 以降が必要です。
speech_noise_thresholdfloatいいえ音声とノイズを区別するためのしきい値であり、VAD (音声アクティビティ検出) の感度調整に使用します。有効な値: [-1.0, 1.0]。値の説明:
  • 値が -1 に近いほど: ノイズしきい値が低下するため、ノイズが音声として認識されやすくなり、より多くのノイズが文字起こしされる可能性があります。
  • 値が +1 に近いほど: ノイズしきい値が上昇するため、音声がノイズとして誤って判断されやすくなり、一部の音声がフィルタリングされる可能性があります。
これは高度な設定パラメーターです。調整すると認識結果に大きな影響を与える可能性があります。推奨事項:
  • 調整する前に、結果を十分にテストおよび検証してください。
  • 実際の音声環境に基づいて、少しずつ調整してください (0.1 のステップを推奨します)。
以下のパラメーターは、recognize/recognize_file メソッドの input キーワード引数で渡します。
パラメータータイプ必須説明
inputdictいいえ会話コンテキストを渡すために使用される入力オブジェクト。コンテキスト強化により、ドメイン固有の用語の認識精度が向上します。使用方法については、「クイックスタート」をご参照ください。
コンテキストパラメーターは、qwen-audio-3.1-asr-flash-message モデルでのみサポートされています。
dict には、値がメッセージのリスト (list[dict]) である context キーを含める必要があります。各メッセージには、次のフィールドが含まれます:
  • role (str, 必須):メッセージのロール。user は、以前のユーザーの会話ターンからの認識結果またはドメイン固有の単語リストを表します。assistant は、以前のターンからの大規模言語モデルのレスポンスを表します。
  • content (list[dict], 必須):メッセージコンテンツのリスト。各要素には type (str; ロールが user の場合は input_text、ロールが assistant の場合は text に設定) と text (str, テキストコンテンツ) が含まれます。
制限:input_text および text タイプのコンテキストメッセージは、それぞれ 5 メッセージに制限されます。制限を超えた場合、最新の 5 メッセージのみが保持されます。コンテキストターンあたりの合計テキスト長は 400 文字を超えることはできず、超過分は末尾から切り捨てられます。
コンテキストを渡す際、context 内のメッセージは特定の順序に従う必要があります。コンテキストメッセージは会話ターンごとに配置する必要があり、各ターン内で user メッセージ (input_text タイプ) は、対応する assistant メッセージ (text タイプ) の前に置く必要があります。
このフィールドは SDK 1.25.23 で導入されたもので、2.0.1 以降のバージョンには含まれています。
# 渡すための入力を構築します
input_context = {
    "context": [
        {
            "role": "user",
            "content": [
                {
                    "type": "input_text",
                    "text": "Hello there"
                }
            ]
        },
        {
            "role": "assistant",
            "content": [
                {
                    "type": "text",
                    "text": "Hello, I am Qwen. How can I help you?"
                }
            ]
        }
    ]
}

# input パラメーターで渡します
recognition = client.audio.asr.recognize(
    model='qwen-audio-3.1-asr-flash-message',
    format='wav',
    sample_rate=16000,
    input=input_context,
)

主要なインターフェイス

コアリソース(client.audio.asr)

リアルタイム音声認識能力は client.audio.asr リソースにマウントされています:recognize は双方向ストリーミング認識セッション(Recognition)を作成し、recognize_file はローカルファイルに対して一回の認識を行います。
メンバーメソッドメソッドシグネチャ説明
recognize
def recognize(self,
              *,
              model: str,
              format: str = "pcm",
              sample_rate: int = 16000,
              vocabulary_id: str = None,
              disfluency_removal_enabled: bool = None,
              diarization_enabled: bool = None,
              parameters: Dict = None,
              input: Dict = None,
              phrase_id: str = None,
              ...) -> Recognition
双方向ストリーミング認識セッションを作成します。with コンテキストに入ると start が自動的に呼び出され、接続を確立してタスクを送信します。音声の送信とイベントの消費は並行して実行する必要があります(send_audio_frame、events()/results()、stop と併用してください)。
recognize_file
def recognize_file(self,
                   path: str,
                   *,
                   model: str,
                   format: str = "pcm",
                   sample_rate: int = 16000,
                   ...) -> Iterator[Dict]
ローカルファイルに基づく非ストリーミング呼び出しです:音声を自動的にブロック単位で送信し、タスクを完了まで駆動して、サービス側イベントを 1 つずつ返します。このメソッドにはファイルに対する読み取り権限が必要です。
start
def start(self)
音声認識を開始します:接続を確立し、タスクを送信して、task-started イベントを待機します。with コンテキストに入ると自動的に呼び出され、成功した後にのみ音声を送信できます。
send_audio_frame
def send_audio_frame(self, buffer: bytes)
音声を送信します。送信するオーディオフレームは大きすぎず小さすぎないようにしてください。目安はフレームあたり約 100 ms、サイズは 1 KB ~ 16 KB です。認識結果は、イベント反復(events()/results())で取得します。
stop
def stop(self)
音声認識を停止します:サーバーに入力が完了したことを通知するだけです。受信スレッドは task-finished イベントまで events() を消費し続ける必要があります。
events / results
def events(self) -> Iterator[Dict]
def results(self) -> Iterator[RecognitionResult]
サービス側のイベントを反復処理します:events() は生の dict イベントを返し(認識テキストは payload.output.sentence にあります)、results() は認識結果フレームのみを返し、型付きの認識結果 (RecognitionResult) オブジェクトを返します(ハートビートフレームはフィルターされます)。
close
def close(self)
認識セッションを閉じます。with コンテキストの退出時に自動的に呼び出されます。
request_id / first_package_delay / last_package_delay / last_response
rec.request_id
rec.first_package_delay
rec.last_package_delay
rec.last_response
request_id、初回パケット遅延(最初の音声パケットを送信してから最初の認識結果を受信するまでのレイテンシー)、最終パケット遅延(stop コマンドを送信してから最後の認識結果が到着するまでの時間)を取得します。タスク完了後に使用してください。last_response は、最後に正常に読み取られた生のメッセージであり、失敗したタスクのエラーを復元するために使用できます。これらはセッションを閉じた後も読み取り可能です。

会話コンテキストの更新

認識タスクの実行中に update_context を呼び出して会話コンテキストを更新します。コンテキストは、後続の音声の認識を支援するために使用されます。このメソッドには DashScope Python SDK 2.0.1 以降が必要です。
def update_context(self, context: dict)
  • 呼び出しタイミング:with コンテキストに入って(start が自動的に呼び出されます)ストリーミング認識を開始した後、stop を呼び出す前。
  • パラメーター:context は辞書で、continue-task イベントの payload.input オブジェクトを渡します(context フィールドを含む)。payload や input の階層を追加でラップしないでください。
  • サポート範囲とパラメーターの制約:continue-task をご参照ください。
以下の例は、起動済みの recognition インスタンスを再利用します。
payload_input = {
    "context": [
        {
            "role": "user",
            "content": [{"type": "input_text", "text": "Hello"}]
        },
        {
            "role": "assistant",
            "content": [{"type": "text", "text": "Hello, I am Qwen. How can I help you?"}]
        }
    ]
}
recognition.update_context(context=payload_input)

イベント反復(events()/results())

双方向ストリーミング呼び出しでは、サーバーはイベントを通じて、主要なプロセス情報とデータをクライアントに返します。受信スレッドでセッションの events()(生のイベント dict)または results()(型付き認識結果フレーム)を反復処理して、サーバーから返される情報とデータを処理してください。
# 生のイベントを反復処理します:認識テキストは payload.output.sentence にあります
def receive_events(rec):
    for event in rec.events():
        payload = event.get('payload') or {}
        sentence = (payload.get('output') or {}).get('sentence') or {}
        if sentence.get('text') and not sentence.get('heartbeat'):
            print('Recognized text: ', sentence['text'])


# または認識結果フレームのみを反復処理します(RecognitionResult を返し、ハートビートフレームはフィルター済み)
def receive_results(rec):
    for result in rec.results():
        sentence = result.get_sentence()
        if sentence and 'text' in sentence:
            print('Recognized text: ', sentence['text'])
イベント/反復メソッド産出内容戻り値説明
event["header"]["event"] == "task-started"
task-started イベントなしstart() 内部で読み取られ、起動の戻り時に last_response に保存されます。events() からは再度産出されません。
def events(self) -> Iterator[Dict]
event:サービス側イベントの dict反復子サーバーから応答があった場合にイベントを産出します。認識結果は payload.output.sentence にあり、ハートビートや空テキストのイベントである可能性があるため、アプリケーションで必要に応じて無視できます。単一の受信スレッドで継続的に消費し、並行して複数のリーダーを作成しないでください。
def results(self) -> Iterator[RecognitionResult]
result:認識結果 (RecognitionResult)反復子認識結果フレームのみを産出します(ハートビートフレームはフィルター済み)。すべての認識結果が返された後に反復が終了します。
try:
    ...
except DashScopeError as e:
    print(e.code, e.message, e.request_id)
DashScopeError 例外なしエラー発生時に送信/受信スレッドでスローされます。try/except で捕捉できます。
event["header"]["event"] == "task-finished"
task-finished イベントなしサーバーがすべての認識を完了した後に events() から産出され、その後反復が終了します。stop() を呼び出した後もこのイベントを読み取る必要があります。

応答

認識結果 (RecognitionResult)

RecognitionResult は、セッションの results() 反復処理で産出される 1 回の認識結果フレームを表します(双方向ストリーミング呼び出しと非ストリーミング呼び出しの両方で使用できます。events() が産出するのは生のイベント dict であるため、この型付きビューが必要な場合は results() を使用してください)。
メンバーメソッドメソッドシグネチャ説明
get_sentence
def get_sentence(self) -> Union[Dict[str, Any], List[Any]]
現在認識されている文と、そのタイムスタンプ情報を取得します。このメソッドの戻り値の型は Dict[str, Any](単文情報)です。詳細については、「文情報 (Sentence)」をご参照ください。
request_id
result.request_id
現在のイベントに対応するリクエストの request_id です。
is_sentence_end
def is_sentence_end(self) -> bool
現在の文が終了したかどうかを判断します。このメソッドは、get_sentence() が返す単文情報内の end_time フィールドが None かどうかを確認して判定します。end_time が None でない場合は、文が終了したことを示します。

文情報 (Sentence)

Sentence クラスのメンバーは次のとおりです:
パラメーター型説明
begin_timeint文の開始時刻 (ms) です。
end_timeint文の終了時刻 (ms) です。
textstr認識されたテキストです。
words単語レベルのタイムスタンプ情報 (Word) のリスト単語レベルのタイムスタンプ情報です。

単語レベルのタイムスタンプ情報 (Word)

Word クラスのメンバーは次のとおりです:
パラメーター型説明
begin_timeint単語の開始時刻 (ms) です。
end_timeint単語の終了時刻 (ms) です。
textstr単語です。
punctuationstr句読点です。

エラーコード

エラーが発生した場合は、「エラーコード」を参照してトラブルシューティングを行ってください。 問題が解決しない場合は、開発者コミュニティ に参加し、問題を報告して Request ID を提供してください。

よくある質問

機能

Q:長時間の無音状態でも接続を維持するにはどうすればよいですか?

heartbeat リクエストパラメーターを true に設定し、サーバーに無音オーディオを送信し続けます。 無音オーディオは、オーディオファイルまたはストリームに含まれる音響信号のないコンテンツです。無音オーディオは、Audacity や Adobe Audition などのオーディオ編集ソフトウェア、または FFmpeg などのコマンドラインツールを使用して、いくつかの方法で生成できます。

Q:オーディオをサポートされているフォーマットに変換するにはどうすればよいですか?

FFmpeg を使用します。詳しい使い方については、FFmpeg の公式サイトをご参照ください。
# 基本的な変換コマンド (汎用テンプレート)
# -i: 入力ファイルパス。例: audio.wav
# -c:a: オーディオコーデック。例: aac、libmp3lame、pcm_s16le
# -b:a: ビットレート (音質制御)。例: 192k、320k
# -ar: サンプルレート。例: 44100 (CD)、48000、16000
# -ac: チャンネル数。例: 1 (モノラル)、2 (ステレオ)
# -y: 既存のファイルを上書き (値は不要)
ffmpeg -i input_audio.ext -c:a codec_name -b:a bitrate -ar sample_rate -ac channels output.ext

# 例:WAV から MP3 へ (元の品質を維持)
ffmpeg -i input.wav -c:a libmp3lame -q:a 0 output.mp3
# 例:MP3 から WAV へ (16 ビット PCM 標準フォーマット)
ffmpeg -i input.mp3 -c:a pcm_s16le -ar 44100 -ac 2 output.wav
# 例:M4A から AAC へ (Apple オーディオの抽出または変換)
ffmpeg -i input.m4a -c:a copy output.aac  # 再エンコードせずに直接抽出
ffmpeg -i input.m4a -c:a aac -b:a 256k output.aac  # 品質を向上させるために再エンコード
# 例:FLAC ロスレスから Opus へ (高圧縮)
ffmpeg -i input.flac -c:a libopus -b:a 128k -vbr on output.opus

Q:ローカルファイル (録音) を認識するにはどうすればよいですか?

ローカルファイルを認識するには 2 つの方法があります:
  • ローカルファイルパスを直接渡す:この方法では、認識が完了した後にのみ完全な結果が返されるため、即時のフィードバックが必要なシナリオには適していません。 非ストリーミング呼び出しを参照し、コアリソース(client.audio.asr)の recognize_file メソッドにファイルパスを渡して録音を直接認識します。
  • ローカルファイルをバイナリストリームに変換して認識する:この方法では、結果をストリーミングしながらファイルを認識するため、即時のフィードバックが必要なシナリオに適しています。 双方向ストリーミング呼び出しを参照し、認識セッションの send_audio_frame メソッドを使用して、バイナリ ストリームをサーバーに送信して認識を行います。

トラブルシューティング

Q:音声が認識されない (認識結果がない) のはなぜですか?

  1. リクエストパラメーターの音声フォーマット (format) とサンプルレート (sampleRate/sample_rate) が正しいこと、およびパラメーターの制約を満たしていることを確認してください。 よくあるエラーとして、以下が挙げられます。
    • 音声ファイルの拡張子は .wav ですが、実際は MP3 形式であり、format リクエストパラメーターは mp3 に設定されています(パラメーター設定が正しくありません)。
    • 音声サンプルレートは 3600 Hz ですが、sampleRate/sample_rate リクエストパラメーターは 48000 に設定されています (不正なパラメーター設定)。
    ffprobe ツールを使用して、オーディオのコンテナ、コーデック、サンプルレート、チャンネル数、その他の情報を取得します:
ffprobe -v error -show_entries format=format_name -show_entries stream=codec_name,sample_rate,channels -of default=noprint_wrappers=1 input.xxx
  1. 上記のいずれのチェックでも問題が解決しない場合は、カスタムホットワードを追加して特定の用語の認識を向上させてください。