Model pengenalan ucapan non-real-time mengonversi rekaman audio menjadi teks. Model ini mendukung pengenalan multibahasa, pengenalan nyanyian, penolakan noise, dan diarizasi pembicara, sehingga cocok untuk transkripsi rapat, analisis panggilan, pembuatan subtitle, serta skenario serupa lainnya.
Ikhtisar
Transkripsikan file audio dan video yang telah direkam secara batch melalui tugas asinkron.
- Peningkatan konteks meningkatkan akurasi pengenalan melalui konteks yang dapat dikonfigurasi.
- Kata kunci khusus (hotwords) meningkatkan akurasi pengenalan nama diri melalui daftar kata yang telah ditentukan sebelumnya.
- Fitur yang dapat dikonfigurasi mencakup diarizasi pembicara, penyaringan kata sensitif, serta timestamp tingkat kalimat atau tingkat kata.
- Transkripsi asinkron mendukung satu file audio dengan durasi hingga 12 jam dan ukuran maksimal 2 GB.
- Semua laju sampel didukung, bersama format audio dan video utama seperti AAC, WAV, dan MP3.
Untuk skenario real-time seperti subtitle langsung, rapat daring, dan asisten suara, gunakan Pengenalan ucapan real-time. Untuk panduan pemilihan model, lihat Teks dari ucapan.
Prasyarat
- Diperlukan Kunci API—Dapatkan Kunci API dan konfigurasikan sebagai Variabel lingkungan.
- Untuk memanggil API melalui SDK DashScope, instal SDK terbaru.
Mulai cepat
PentingPada pengenalan ucapan non-real-time, Qwen-Audio-3.0-ASR-Flash-Filetrans, Fun-ASR, Qwen3-ASR-Flash-Filetrans, dan Paraformer menggunakan panggilan asinkron. Atur header permintaan X-DashScope-Async: enable, kirimkan tugas, lalu polling API kueri untuk mengambil hasilnya. Model lain seperti Fun-ASR-Flash dan Qwen3-ASR-Flash menggunakan panggilan sinkron.
Jika Anda memanggil penerapan khusus layanan model dan menerima error current user api does not support asynchronous calls, penerapan tersebut hanya mendukung panggilan sinkron. Ubah header permintaan menjadi X-DashScope-Async: disable dan biarkan bagian lain dari panggilan tetap sama.
Qwen-Audio-3.0-ASR-Flash-Filetrans/Fun-ASR
Karena file audio dan video bisa berukuran besar, API transkripsi file menggunakan panggilan asinkron: kirimkan tugas, polling API kueri untuk statusnya, lalu ambil hasil pengenalan setelah tugas selesai.
cURL
Saat memanggil API dengan cURL, pertama-tama kirimkan tugas untuk mendapatkan task_id, lalu kueri hasil tugas menggunakan ID tersebut.
Kirimkan tugas
Konfigurasi berikut berlaku untuk wilayah Singapura. Ganti {WorkspaceId} dengan ID Ruang Kerja Anda yang sebenarnya. Konfigurasi berbeda-beda tergantung wilayah.
curl -X POST 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/audio/asr/transcription' \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-H "X-DashScope-Async: enable" \
-d '{
"model": "qwen-audio-3.0-asr-flash-filetrans",
"input": {
"file_urls": [
"{YOUR_AUDIO_URL}"
]
},
"parameters": {
"channel_id": [0],
"language_hints": ["zh", "en"]
}
}'
Ambil hasil tugas
API kueri ini secara default mengizinkan 20 QPS dan dapat diskalakan hingga 100 QPS. Untuk frekuensi lebih tinggi atau menghindari Pembatasan kecepatan akibat polling, konfigurasikan callback tugas asinkron (lihat Skema konkurensi tinggi: gunakan callback alih-alih polling).
Konfigurasi berikut berlaku untuk wilayah Singapura. Ganti {WorkspaceId} dengan ID Ruang Kerja Anda yang sebenarnya. Konfigurasi berbeda-beda tergantung wilayah.
curl -X GET 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/tasks/{task_id}' \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json"
Unduh hasil pengenalan
Setelah tugas berhasil, output.results[].transcription_url yang dikembalikan oleh API kueri mengarah ke file JSON yang dapat diunduh publik dan berisi hasil pengenalan lengkap. URL ini secara default berlaku selama 24 jam, jadi unduh dan simpan segera.
# Ganti {transcription_url} dengan nilai transcription_url yang dikembalikan oleh API kueri
curl -sS '{transcription_url}' -o transcription.json
cat transcription.json | jq .
Python
from http import HTTPStatus
from dashscope.audio.asr import Transcription
from urllib import request
import dashscope
import os
import json
# Berikut adalah konfigurasi untuk wilayah Singapura. Saat memanggil, ganti "{WorkspaceId}" dengan ID ruang kerja Anda yang sebenarnya. Konfigurasi berbeda-beda tergantung wilayah.
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'
# Kunci API berbeda antara wilayah Singapura dan Beijing. Dapatkan Kunci API: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Alibaba Cloud Model Studio Anda: dashscope.api_key = "sk-xxx"
dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")
task_response = Transcription.async_call(
model='qwen-audio-3.0-asr-flash-filetrans',
file_urls=['{YOUR_AUDIO_URL}'],
language_hints=['zh', 'en'] # language_hints adalah parameter opsional yang digunakan untuk menentukan kode bahasa audio yang akan dikenali. Untuk rentang nilai, lihat dokumentasi referensi API.
)
transcription_response = Transcription.wait(task=task_response.output.task_id)
if transcription_response.status_code == HTTPStatus.OK:
for transcription in transcription_response.output['results']:
if transcription['subtask_status'] == 'SUCCEEDED':
url = transcription['transcription_url']
result = json.loads(request.urlopen(url).read().decode('utf8'))
print(json.dumps(result, indent=4,
ensure_ascii=False))
else:
print('transkripsi gagal!')
print(transcription)
else:
print('Error: ', transcription_response.output.message)
Java
import com.alibaba.dashscope.audio.asr.transcription.*;
import com.alibaba.dashscope.utils.Constants;
import com.google.gson.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
// Berikut adalah konfigurasi untuk wilayah Singapura. Saat memanggil, ganti "{WorkspaceId}" dengan ID ruang kerja Anda yang sebenarnya. Konfigurasi berbeda-beda tergantung wilayah.
Constants.baseHttpApiUrl = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
// Buat parameter permintaan transkripsi.
TranscriptionParam param =
TranscriptionParam.builder()
// Kunci API berbeda antara wilayah Singapura dan Beijing. Dapatkan Kunci API: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
// Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Alibaba Cloud Model Studio Anda: .apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.model("qwen-audio-3.0-asr-flash-filetrans")
// language_hints adalah parameter opsional yang digunakan untuk menentukan kode bahasa audio yang akan dikenali. Untuk rentang nilai, lihat dokumentasi referensi API.
.parameter("language_hints", new String[]{"zh", "en"})
.fileUrls(
Arrays.asList(
"{YOUR_AUDIO_URL}"))
.build();
try {
Transcription transcription = new Transcription();
// Kirimkan permintaan transkripsi
TranscriptionResult result = transcription.asyncCall(param);
System.out.println("RequestId: " + result.getRequestId());
// Periksa apakah tugas berhasil dikirim
if (result.getTaskId() == null) {
System.out.println("Error: " + result.getOutput());
System.exit(1);
}
// Blokir dan tunggu hingga tugas selesai lalu dapatkan hasilnya
result = transcription.wait(
TranscriptionQueryParam.FromTranscriptionParam(param, result.getTaskId()));
// Dapatkan hasil transkripsi
List<TranscriptionTaskResult> taskResultList = result.getResults();
if (taskResultList != null && taskResultList.size() > 0) {
for (TranscriptionTaskResult taskResult : taskResultList) {
String transcriptionUrl = taskResult.getTranscriptionUrl();
HttpURLConnection connection =
(HttpURLConnection) new URL(transcriptionUrl).openConnection();
connection.setRequestMethod("GET");
connection.connect();
BufferedReader reader =
new BufferedReader(new InputStreamReader(connection.getInputStream()));
Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonElement jsonResult = gson.fromJson(reader, JsonObject.class);
System.out.println(gson.toJson(jsonResult));
}
}
} catch (Exception e) {
System.out.println("error: " + e);
}
System.exit(0);
}
}
Hasil pengenalan lengkap dicetak ke konsol dalam format JSON. Hasil ini berisi teks transkripsi beserta waktu mulai dan akhir setiap segmen dalam file audio atau video, dalam satuan milidetik.
- Hasil pengenalan
{
"file_url": "{YOUR_AUDIO_URL}",
"properties": {
"audio_format": "pcm_s16le",
"channels": [
0
],
"original_sampling_rate": 16000,
"original_duration_in_milliseconds": 3834
},
"transcripts": [
{
"channel_id": 0,
"content_duration_in_milliseconds": 2480,
"text": "Hello World, this is the Alibaba Speech Lab.",
"sentences": [
{
"begin_time": 760,
"end_time": 3240,
"text": "Hello World, this is the Alibaba Speech Lab.",
"sentence_id": 1,
"words": [
{
"begin_time": 760,
"end_time": 1000,
"text": "Hello",
"punctuation": ""
},
{
"begin_time": 1000,
"end_time": 1120,
"text": " World",
"punctuation": ","
},
{
"begin_time": 1400,
"end_time": 1920,
"text": "this is",
"punctuation": ""
},
{
"begin_time": 1920,
"end_time": 2520,
"text": "the Alibaba",
"punctuation": ""
},
{
"begin_time": 2520,
"end_time": 2840,
"text": "Speech",
"punctuation": ""
},
{
"begin_time": 2840,
"end_time": 3240,
"text": "Lab",
"punctuation": "."
}
]
}
]
}
]
}
Qwen-Audio-3.0-ASR-Flash/Fun-ASR-Flash
Seri model Qwen-Audio-3.0-ASR-Flash dan Fun-ASR-Flash mendukung panggilan sinkron untuk file audio berdurasi kurang dari 5 menit, dan dapat mengembalikan hasil pengenalan dalam mode streaming atau non-streaming.
Konfigurasi berikut berlaku untuk wilayah Singapura. Ganti {WorkspaceId} dengan ID Ruang Kerja Anda yang sebenarnya. Konfigurasi berbeda-beda tergantung wilayah. Kunci API untuk wilayah Singapura berbeda dengan wilayah Beijing.
curl --location --request POST 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header "Content-Type: application/json" \
--header "X-DashScope-SSE: disable" \
--data '{
"model": "qwen-audio-3.0-asr-flash",
"input": {
"messages": [
{
"role": "user",
"content": [
{
"type": "input_audio",
"input_audio": {
"data": "{YOUR_AUDIO_URL}"
}
}
]
}
]
},
"parameters": {
"format": "wav",
"sample_rate": "16000"
}
}'
PentingCatatan: Struktur respons yang dikembalikan oleh seri model Qwen-Audio-3.0-ASR-Flash dan Fun-ASR-Flash melalui API sinkron DashScope (endpoint multimodal-generation) berbeda dari format respons multimodal standar DashScope. Struktur respons aktual adalah sebagai berikut:
{
"output": {
"output": {
"sentence": {
"text": "Recognized text content"
}
},
"text": "Hello World, this is the Alibaba Speech Lab."
},
"request_id": "..."
}
Di sini, output.output.sentence.text dan output.text tingkat atas adalah bidang teks yang dikenali, dan tidak ada bidang choices. Uraikan respons sesuai ketentuan tersebut.
Paraformer
Kode contoh Paraformer mirip dengan panggilan asinkron untuk Fun-ASR. Ganti nilai model dengan nama model Paraformer.
Fitur lanjutan
Gunakan API kompatibel OpenAI
PentingWilayah AS tidak mendukung mode kompatibel OpenAI.
Hanya model seri Qwen3-ASR-Flash yang mendukung panggilan melalui mode kompatibel OpenAI. Mode ini hanya menerima URL file audio yang dapat diakses publik. Mode ini tidak menerima jalur mutlak file audio lokal.
Gunakan SDK Python OpenAI versi 1.52.0 atau lebih baru, atau SDK Node.js versi 4.68.0 atau lebih baru. Untuk menginstal atau memperbarui SDK, jalankan:
# Python
pip install -U "openai>=1.52.0"
# Node.js
npm install openai@^4.68.0
asr_options bukan parameter standar OpenAI. Dengan SDK Python OpenAI, teruskan melalui extra_body. Dengan SDK OpenAI Node.js, teruskan asr_options langsung sebagai parameter tingkat atas dalam badan permintaan.
Input: URL file audio
Python SDK
from openai import OpenAI
import os
try:
client = OpenAI(
// Kunci API berbeda antara wilayah Singapura/AS dan wilayah Beijing. Dapatkan Kunci API: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
// Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Alibaba Cloud Model Studio Anda: api_key = "sk-xxx",
api_key=os.getenv("DASHSCOPE_API_KEY"),
// Berikut adalah konfigurasi untuk wilayah Singapura. Saat memanggil, ganti "{WorkspaceId}" dengan ID ruang kerja Anda yang sebenarnya. Konfigurasi berbeda-beda tergantung wilayah.
base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
)
stream_enabled = False // Apakah akan mengaktifkan keluaran streaming
completion = client.chat.completions.create(
model="qwen3-asr-flash",
messages=[
{
"content": [
{
"type": "input_audio",
"input_audio": {
"data": "{YOUR_AUDIO_URL}"
}
}
],
"role": "user"
}
],
stream=stream_enabled,
// Saat stream diatur ke False, parameter stream_options tidak dapat diatur
// stream_options={"include_usage": True},
extra_body={
"asr_options": {
// "language": "zh",
"enable_itn": False
}
}
)
if stream_enabled:
full_content = ""
print("Keluaran streaming adalah:")
for chunk in completion:
// Jika stream_options.include_usage bernilai True, bidang choices pada chunk terakhir adalah daftar kosong dan perlu dilewati (Anda dapat mendapatkan penggunaan Token melalui chunk.usage)
print(chunk)
if chunk.choices and chunk.choices[0].delta.content:
full_content += chunk.choices[0].delta.content
print(f"Konten lengkap adalah: {full_content}")
else:
print(f"Keluaran non-streaming adalah: {completion.choices[0].message.content}")
except Exception as e:
print(f"Pesan error: {e}")
Node.js SDK
// Persiapan sebelum menjalankan:
// Umum untuk Windows/Mac/Linux:
// 1. Pastikan Node.js terinstal (versi >= 14 direkomendasikan)
// 2. Jalankan perintah berikut untuk menginstal dependensi yang diperlukan: npm install openai
import OpenAI from "openai";
const client = new OpenAI({
// Kunci API berbeda antara wilayah Singapura/AS dan wilayah Beijing. Dapatkan Kunci API: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
// Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Alibaba Cloud Model Studio Anda: apiKey: "sk-xxx",
apiKey: process.env.DASHSCOPE_API_KEY,
// Berikut adalah konfigurasi untuk wilayah Singapura. Saat memanggil, ganti "{WorkspaceId}" dengan ID ruang kerja Anda yang sebenarnya. Konfigurasi berbeda-beda tergantung wilayah.
baseURL: "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
});
async function main() {
try {
const streamEnabled = false; // Apakah akan mengaktifkan keluaran streaming
const completion = await client.chat.completions.create({
model: "qwen3-asr-flash",
messages: [
{
role: "user",
content: [
{
type: "input_audio",
input_audio: {
data: "{YOUR_AUDIO_URL}"
}
}
]
}
],
stream: streamEnabled,
// Saat stream diatur ke False, parameter stream_options tidak dapat diatur
// stream_options: {
// "include_usage": true
// },
asr_options: {
// language: "zh",
enable_itn: false
}
});
if (streamEnabled) {
let fullContent = "";
console.log("Keluaran streaming adalah:");
for await (const chunk of completion) {
console.log(JSON.stringify(chunk));
if (chunk.choices && chunk.choices.length > 0) {
const delta = chunk.choices[0].delta;
if (delta && delta.content) {
fullContent += delta.content;
}
}
}
console.log(`Konten lengkap adalah: ${fullContent}`);
} else {
console.log(`Keluaran non-streaming adalah: ${completion.choices[0].message.content}`);
}
} catch (err) {
console.error(`Pesan error: ${err}`);
}
}
main();
cURL
Konfigurasi berikut berlaku untuk wilayah Singapura. Ganti {WorkspaceId} dengan ID Ruang Kerja Anda yang sebenarnya. Konfigurasi berbeda-beda tergantung wilayah.
curl -X POST 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/chat/completions' \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3-asr-flash",
"messages": [
{
"content": [
{
"type": "input_audio",
"input_audio": {
"data": "{YOUR_AUDIO_URL}"
}
}
],
"role": "user"
}
],
"stream":false,
"asr_options": {
"enable_itn": false
}
}'
Input: file audio dalam format Base64
Teruskan data dalam format Base64 sebagai Data URL dengan format data:<mediatype>;base64,<data>.
-
<mediatype>: jenis MIME.Jenis MIME bervariasi tergantung format audio. Contohnya:
- WAV:
audio/wav - MP3:
audio/mpeg
- WAV:
-
<data>: string audio yang dikodekan Base64.Pengkodean Base64 meningkatkan ukuran data. Pastikan file sumber cukup kecil sehingga hasil yang dikodekan masih memenuhi batas ukuran input audio (10 MB).
-
Contoh:
data:audio/wav;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4LjI5LjEwMAAAAAAAAAAAAAAA//PAxABQ/BXRbMPe4IQAhl9Klik untuk melihat contoh kode
import base64, pathlib // input.mp3 adalah file audio lokal yang digunakan untuk kloning suara. Ganti dengan path ke file audio Anda sendiri dan pastikan memenuhi persyaratan audio. file_path = pathlib.Path("{YOUR_AUDIO_FILE}") base64_str = base64.b64encode(file_path.read_bytes()).decode() data_uri = f"data:audio/mpeg;base64,{base64_str}"import java.nio.file.*; import java.util.Base64; public class Main { /** * filePath adalah file audio lokal yang digunakan untuk kloning suara. Ganti dengan path ke file audio Anda sendiri dan pastikan memenuhi persyaratan audio. */ public static String toDataUrl(String filePath) throws Exception { byte[] bytes = Files.readAllBytes(Paths.get(filePath)); String encoded = Base64.getEncoder().encodeToString(bytes); return "data:audio/mpeg;base64," + encoded; } // Contoh penggunaan public static void main(String[] args) throws Exception { System.out.println(toDataUrl("{YOUR_AUDIO_FILE}")); } }
import base64
from openai import OpenAI
import os
import pathlib
try:
// Ganti dengan path file audio yang sebenarnya
file_path = "{YOUR_AUDIO_FILE}"
// Ganti dengan jenis MIME file audio yang sebenarnya
audio_mime_type = "audio/mpeg"
file_path_obj = pathlib.Path(file_path)
if not file_path_obj.exists():
raise FileNotFoundError(f"File audio tidak ditemukan: {file_path}")
base64_str = base64.b64encode(file_path_obj.read_bytes()).decode()
data_uri = f"data:{audio_mime_type};base64,{base64_str}"
client = OpenAI(
// Kunci API berbeda antara wilayah Singapura/AS dan wilayah Beijing. Dapatkan Kunci API: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
// Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Alibaba Cloud Model Studio Anda: api_key = "sk-xxx",
api_key=os.getenv("DASHSCOPE_API_KEY"),
// Berikut adalah konfigurasi untuk wilayah Singapura. Saat memanggil, ganti "{WorkspaceId}" dengan ID ruang kerja Anda yang sebenarnya. Konfigurasi berbeda-beda tergantung wilayah.
base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
)
stream_enabled = False // Apakah akan mengaktifkan keluaran streaming
completion = client.chat.completions.create(
model="qwen3-asr-flash",
messages=[
{
"content": [
{
"type": "input_audio",
"input_audio": {
"data": data_uri
}
}
],
"role": "user"
}
],
stream=stream_enabled,
// Saat stream diatur ke False, parameter stream_options tidak dapat diatur
// stream_options={"include_usage": True},
extra_body={
"asr_options": {
// "language": "zh",
"enable_itn": False
}
}
)
if stream_enabled:
full_content = ""
print("Keluaran streaming adalah:")
for chunk in completion:
// Jika stream_options.include_usage bernilai True, bidang choices pada chunk terakhir adalah daftar kosong dan perlu dilewati (Anda dapat mendapatkan penggunaan Token melalui chunk.usage)
print(chunk)
if chunk.choices and chunk.choices[0].delta.content:
full_content += chunk.choices[0].delta.content
print(f"Konten lengkap adalah: {full_content}")
else:
print(f"Keluaran non-streaming adalah: {completion.choices[0].message.content}")
except Exception as e:
print(f"Pesan error: {e}")
// Persiapan sebelum menjalankan:
// Umum untuk Windows/Mac/Linux:
// 1. Pastikan Node.js terinstal (versi >= 14 direkomendasikan)
// 2. Jalankan perintah berikut untuk menginstal dependensi yang diperlukan: npm install openai
import OpenAI from "openai";
import { readFileSync } from 'fs';
const client = new OpenAI({
// Kunci API berbeda antara wilayah Singapura/AS dan wilayah Beijing. Dapatkan Kunci API: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
// Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Alibaba Cloud Model Studio Anda: apiKey: "sk-xxx",
apiKey: process.env.DASHSCOPE_API_KEY,
// Berikut adalah konfigurasi untuk wilayah Singapura. Saat memanggil, ganti "{WorkspaceId}" dengan ID ruang kerja Anda yang sebenarnya. Konfigurasi berbeda-beda tergantung wilayah.
baseURL: "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
});
const encodeAudioFile = (audioFilePath) => {
const audioFile = readFileSync(audioFilePath);
return audioFile.toString('base64');
};
// Ganti dengan path file audio yang sebenarnya
const dataUri = `data:audio/mpeg;base64,${encodeAudioFile("{YOUR_AUDIO_FILE}")}`;
async function main() {
try {
const streamEnabled = false; // Apakah akan mengaktifkan keluaran streaming
const completion = await client.chat.completions.create({
model: "qwen3-asr-flash",
messages: [
{
role: "user",
content: [
{
type: "input_audio",
input_audio: {
data: dataUri
}
}
]
}
],
stream: streamEnabled,
// Saat stream diatur ke False, parameter stream_options tidak dapat diatur
// stream_options: {
// "include_usage": true
// },
asr_options: {
// language: "zh",
enable_itn: false
}
});
if (streamEnabled) {
let fullContent = "";
console.log("Keluaran streaming adalah:");
for await (const chunk of completion) {
console.log(JSON.stringify(chunk));
if (chunk.choices && chunk.choices.length > 0) {
const delta = chunk.choices[0].delta;
if (delta && delta.content) {
fullContent += delta.content;
}
}
}
console.log(`Konten lengkap adalah: ${fullContent}`);
} else {
console.log(`Keluaran non-streaming adalah: ${completion.choices[0].message.content}`);
}
} catch (err) {
console.error(`Pesan error: ${err}`);
}
}
main();
Proses file audio panjang
Pengenalan ucapan non-real-time mendukung transkripsi asinkron file audio panjang. Ini cocok untuk skenario seperti notulen rapat, transkrip wawancara, dan pemutaran panggilan.
Batasan:- Qwen-Audio-3.0-ASR-Flash-Filetrans/Fun-ASR / Qwen3-ASR-Flash-Filetrans / Paraformer: satu file audio dapat memiliki ukuran hingga 2 GB dan durasi hingga 12 jam.
- Qwen-Audio-3.0-ASR-Flash/Fun-ASR-Flash/Qwen3-ASR-Flash: satu file audio dapat memiliki ukuran hingga 10 MB dan durasi hingga 5 menit. Untuk audio yang lebih panjang, gunakan Qwen-Audio-3.0-ASR-Flash-Filetrans, Fun-ASR, atau Qwen3-ASR-Flash-Filetrans.
- Saat diarizasi pembicara diaktifkan: batasi durasi audio dalam 2 jam. Audio yang lebih panjang dapat menyebabkan kegagalan pengenalan atau timeout. Untuk informasi lebih lanjut, lihat Diarizasi pembicara.
Alur panggilan: transkripsi audio panjang menggunakan model tugas asinkron dengan tiga langkah:
- Kirimkan tugas transkripsi dan dapatkan
task_id. - Polling API kueri untuk status tugas, atau gunakan metode wait SDK untuk memblokir hingga tugas selesai.
- Setelah tugas selesai, unduh hasil pengenalan JSON dari URL yang dikembalikan.
Untuk contoh kode, lihat kode Mulai cepat dalam Pengenalan ucapan non-real-time.
keluaran streaming
Qwen-Audio-3.0-ASR-Flash/Fun-ASR-Flash/Qwen3-ASR-Flash mendukung keluaran streaming: mereka mengembalikan hasil antara saat pengenalan berlangsung. Ini cocok untuk skenario yang membutuhkan umpan balik progres real-time.
Model transkripsi asinkron seperti Qwen-Audio-3.0-ASR-Flash-Filetrans, Fun-ASR, Qwen3-ASR-Flash-Filetrans, dan Paraformer tidak mendukung keluaran streaming. Dapatkan hasil akhir dengan polling tugas (untuk informasi lebih lanjut, lihat Proses file audio panjang).
Cara mengaktifkan:- SDK Python DashScope: atur parameter
streamkeTrue. - SDK Java DashScope: panggil API
streamCall. - HTTP DashScope: atur header
X-DashScope-SSEkeenable. - SDK kompatibel OpenAI: atur parameter
streamkeTrue.
Untuk contoh output streaming Qwen3-ASR-Flash, lihat Contoh permintaan lalu pilih tab keluaran streaming.
Tingkatkan akurasi dengan hotwords
Hotwords meningkatkan akurasi pengenalan untuk nama diri spesifik domain seperti nama orang, nama tempat, dan nama produk. Untuk detail cara membuat dan menggunakan hotwords, lihat Tingkatkan akurasi pengenalan.
SDK berbeda menggunakan konvensi penamaan berbeda untuk parameter ini, seperti kunci kamus, properti objek, atau metode. Untuk pemetaan bidang lengkap, lihat referensi API untuk setiap SDK.
Tingkatkan akurasi dengan peningkatan konteks
Peningkatan konteks meneruskan riwayat percakapan ke model ASR, yang secara signifikan meningkatkan akurasi transkripsi untuk nama diri. Untuk detail cara menggunakan fitur ini dan contoh hasilnya, lihat Peningkatan konteks.
Diarizasi pembicara
Diarizasi pembicara secara otomatis mengidentifikasi pembicara berbeda dalam audio dan memberi label setiap kalimat dalam hasil transkripsi dengan tag pembicara. Ini cocok untuk skenario seperti rapat multipihak dan rekaman wawancara.
Model yang didukung: model seri Qwen-Audio-3.0-ASR-Flash-Filetrans, Fun-ASR, dan Paraformer.
Cara mengaktifkan: atur parameter diarization_enabled ke true dalam permintaan API. Dalam hasilnya, setiap kalimat menyertakan bidang speaker_id yang mengidentifikasi pembicara.
Struktur respons contoh (cuplikan):
{
"transcripts": [
{
"sentences": [
{ "begin_time": 100, "end_time": 3820, "text": "Halo, mari kita bahas kemajuan proyek hari ini.", "speaker_id": 0 },
{ "begin_time": 3820, "end_time": 6500, "text": "Tentu, izinkan saya memberikan laporan singkat terlebih dahulu.", "speaker_id": 1 }
]
}
]
}
SDK berbeda menggunakan konvensi penamaan berbeda untuk bidang ini, seperti kunci kamus, properti objek, atau metode. Untuk pemetaan bidang lengkap, lihat referensi API untuk setiap SDK.
PentingSaat diarizasi pembicara diaktifkan, batasi durasi audio dalam 2 jam. Audio yang lebih panjang dapat menyebabkan kegagalan pengenalan atau timeout. Untuk batas durasi audio saat diarizasi dinonaktifkan, lihat Proses file audio panjang. Diarizasi pembicara hanya mendukung audio mono.
Untuk definisi bidang lengkap, lihat referensi API.
Penyaringan kata sensitif
Penyaringan kata sensitif mengganti atau menghapus kata sensitif dalam hasil pengenalan. Ini cocok untuk skenario seperti inspeksi kualitas layanan pelanggan, kepatuhan konten, dan moderasi subtitle.
Model yang didukung: model seri Qwen-Audio-3.0-ASR-Flash-Filetrans, Fun-ASR, dan Paraformer.
Perilaku default: saat parameter special_word_filter tidak diteruskan, sistem menggunakan daftar kata sensitif Model Studio bawaan. Kata yang cocok diganti dengan string * dengan panjang yang sama.
Konfigurasi khusus: special_word_filter adalah objek JSON dengan tiga subbidang:
filter_with_signed.word_list: larik string kata sensitif yang akan diganti dengan string*dengan panjang yang sama. Misalnya, dengan["test"], "Tolong bantu saya test ini" menjadi "Tolong bantu saya **** ini".filter_with_empty.word_list: larik string kata sensitif yang akan dihapus sepenuhnya dari hasil. Misalnya, dengan["start"], "Apakah permainan akan segera dimulai sekarang" menjadi "Apakah permainan akan segera sekarang".system_reserved_filter: nilai boolean yang default-nyatrue. Ini mengontrol apakah juga menerapkan daftar kata sensitif bawaan sistem, yang berlaku bersama daftar khusus Anda.
Contoh konfigurasi:
{
"special_word_filter": {
"filter_with_signed": {
"word_list": ["test"]
},
"filter_with_empty": {
"word_list": ["start", "happen"]
},
"system_reserved_filter": true
}
}
SDK berbeda menggunakan konvensi penamaan berbeda untuk parameter ini, seperti kunci kamus, properti objek, atau metode. Untuk pemetaan bidang lengkap, lihat referensi API.
Pengenalan emosi
Model seri Qwen3-ASR-Flash-Filetrans dan Qwen3-ASR-Flash memiliki pengenalan emosi yang diaktifkan secara permanen, tanpa konfigurasi tambahan yang diperlukan. Hasilnya mencakup tag emosi untuk pembicara, dipilih dari tujuh emosi detail halus: surprised, neutral, happy, sad, disgusted, angry, dan fearful.
Jalur bidang (berbeda-beda tergantung API):
- API kompatibel OpenAI (transkripsi real-time Qwen3-ASR-Flash): bersarang dalam
choices[].delta.annotations[].emotion(keluaran streaming) atauchoices[].message.annotations[].emotion(non-streaming). - API sinkron DashScope (Qwen3-ASR-Flash): bersarang dalam
output.choices[].message.annotations[].emotion. - API tugas asinkron DashScope (transkripsi file rekaman Qwen3-ASR-Flash-Filetrans): bersarang dalam
transcripts[].sentences[].emotion, bersama timestamp, pembicara, dan bidang lain dalam setiap objek kalimat.
Struktur respons contoh (cuplikan dari API tugas asinkron DashScope):
{
"transcripts": [{
"sentences": [{
"begin_time": 0,
"end_time": 1440,
"text": "Selamat datang di Alibaba Cloud.",
"emotion": "neutral",
"language": "en"
}]
}]
}
SDK berbeda menggunakan konvensi penamaan berbeda untuk bidang ini, seperti kunci kamus, properti objek, atau metode. Untuk pemetaan bidang lengkap, lihat referensi API.
PentingModel non-real-time Qwen-Audio-3.0-ASR-Flash-Filetrans, Qwen-Audio-3.0-ASR-Flash, Fun-ASR-Flash, Fun-ASR, dan Paraformer tidak mendukung pengenalan emosi. Untuk menggunakan pengenalan emosi dalam pengenalan real-time, lihat bagian yang sesuai dalam Pengenalan ucapan real-time.
Dapatkan timestamp
Pengenalan ucapan non-real-time dapat mengeluarkan timestamp dalam hasil transkripsi, yang membantu pembuatan subtitle, penyorotan kata kunci, dan pengeditan audio/video. Qwen-Audio-3.0-ASR-Flash-Filetrans, Qwen-Audio-3.0-ASR-Flash, Fun-ASR, Fun-ASR-Flash, Qwen3-ASR-Flash-Filetrans, dan Paraformer semuanya mendukung timestamp, tetapi perilaku default dan metode kontrol berbeda-beda tergantung model:
- Qwen-Audio-3.0-ASR-Flash-Filetrans/Qwen-Audio-3.0-ASR-Flash/Fun-ASR/Fun-ASR-Flash/Paraformer: timestamp diaktifkan secara permanen dan tidak dapat dimatikan.
- Qwen3-ASR-Flash-Filetrans: hanya panggilan asinkron DashScope yang mendukung timestamp, dan timestamp diaktifkan secara permanen. Gunakan parameter permintaan
enable_wordsuntuk mengontrol tingkat timestamp: atur kefalse(default) untuk mengembalikan timestamp tingkat kalimat, atautrueuntuk mengembalikan timestamp tingkat kata. Timestamp tingkat kata hanya mendukung bahasa berikut: Cina, Inggris, Jepang, Korea, Jerman, Prancis, Spanyol, Italia, Portugis, dan Rusia. Akurasi tidak dijamin untuk bahasa lain.
PentingSaat Anda memanggil Qwen3-ASR-Flash melalui API kompatibel OpenAI, bentuk keluarannya adalah chat.completion, yang tidak mengembalikan bidang timestamp. Untuk timestamp, gunakan Qwen3-ASR-Flash-Filetrans (API tugas asinkron).
Timestamp dalam satuan milidetik dan dikembalikan pada dua tingkat:
- Tingkat kalimat:
sentences[].begin_timedansentences[].end_timemenandai waktu mulai dan akhir setiap kalimat dalam audio. - Tingkat kata: larik
sentences[].words[], di mana setiap elemen berisibegin_time,end_time, dantext(teks kata tersebut).
Struktur respons contoh (cuplikan dari API tugas asinkron DashScope):
{
"transcripts": [{
"sentences": [{
"begin_time": 100,
"end_time": 3820,
"text": "Halo, mari kita bahas kemajuan proyek hari ini.",
"words": [
{ "begin_time": 100, "end_time": 596, "text": "Halo," },
{ "begin_time": 596, "end_time": 844, "text": "mari" }
]
}]
}]
}
PentingTimestamp dalam audio adalah bilangan bulat milidetik (seperti 100). Jangan bingung dengan end_time tingkat tugas (waktu penyelesaian tugas, string tanggal seperti "2024-09-12 15:11:40.903"). Ini adalah bidang yang berbeda.
SDK berbeda menggunakan konvensi penamaan berbeda untuk bidang ini, seperti kunci kamus, properti objek, atau metode. Untuk pemetaan bidang lengkap, lihat referensi API.
Terapkan di produksi
Saat menerapkan pengenalan ucapan non-real-time di produksi, praktik terbaik berikut meningkatkan kualitas pengenalan dan stabilitas sistem.
Skema konkurensi tinggi: gunakan callback alih-alih polling
Untuk tugas transkripsi asinkron (Qwen-Audio-3.0-ASR-Flash-Filetrans, Fun-ASR, Qwen3-ASR-Flash-Filetrans, dan Paraformer), Anda mengirimkan tugas melalui POST /api/v1/services/audio/asr/transcription lalu biasanya mendapatkan hasilnya dengan memanggil API kueri secara berkala GET /api/v1/tasks/{task_id}. API kueri ini secara default memiliki batas 20 QPS dan dapat diskalakan hingga 100 QPS. Dalam skenario batch konkurensi tinggi, polling yang sering mudah memicu Pembatasan kecepatan.
Konfigurasikan notifikasi callback melalui EventBridge. Saat tugas selesai, Model Studio secara otomatis mendorong event dashscope:System:AsyncTaskFinish ke target yang Anda konfigurasi (endpoint HTTP/HTTPS atau topik RocketMQ). Setelah konsumen menerima event tersebut, tidak perlu lagi memanggil API kueri, yang menghindari risiko Pembatasan kecepatan akibat polling yang sering. Untuk informasi lebih lanjut, lihat Konfigurasi notifikasi callback EventBridge.
Model yang didukung
- Didukung: Qwen-Audio-3.0-ASR-Flash-Filetrans, Fun-ASR, Qwen3-ASR-Flash-Filetrans, dan Paraformer (semua tugas transkripsi asinkron).
- Tidak didukung: Qwen3-ASR-Flash (panggilan sinkron atau streaming, yang bukan tugas asinkron).
Isi pesan callback
Untuk ketiga model, isi pesan callback memiliki data.contain_result diatur ke true, dan data.output_result secara langsung membawa transcription_url. Setelah konsumen menerima callback, dapat langsung mendapatkan hasil pengenalan tanpa perlu memanggil GET /api/v1/tasks/{task_id} lagi. Namun, jalur dan struktur bidang hasil berbeda-beda di ketiga model. Lihat tabel berikut.
CatatanSaat menulis konsumen, pilih jalur yang benar untuk model yang Anda gunakan. Jangan hardcode satu jalur saja. Dalam skenario kegagalan, data.output_result.output tidak lagi berisi results/result; melainkan berisi bidang code dan message. Periksa data.task_status terlebih dahulu, lalu baca hasilnya.
Model | Parameter pengiriman | Jalur bidang hasil (berdasarkan isi callback) | bidang Penggunaan |
|---|---|---|---|
Qwen-Audio-3.0-ASR-Flash-Filetrans, Fun-ASR |
|
|
|
Paraformer |
| Sama dengan Qwen-Audio-3.0-ASR-Flash-Filetrans/Fun-ASR: |
|
Qwen3-ASR-Flash-Filetrans |
|
|
|
Catatan penggunaan
Keamanan (pengiriman HTTP/HTTPS): di produksi, verifikasi field header X-Eventbridge-Signature* dalam permintaan callback sebelum mengonsumsinya. Jika tidak, IP eksternal mana pun dapat memalsukan event AsyncTaskFinish dan menyuntikkan hasil pengenalan palsu. Juga atur timeout penerima minimal 5 detik pada penerima. Metode pengiriman RocketMQ tidak memiliki signature tingkat pesan; keamanannya dijamin oleh mekanisme otentikasi RocketMQ.
Latensi pengiriman: dari penyelesaian tugas (end_time) hingga target pengiriman (endpoint HTTP/HTTPS atau topik RocketMQ) menerima pesan, penundaannya biasanya sekitar 1 hingga 90 detik. Latensi tepatnya tergantung pada beban real-time EventBridge.
Idempotensi: event yang sama mungkin dikirim beberapa kali karena retries. Implementasikan pemrosesan idempoten pada konsumen, menggunakan data.id atau data.task_id CloudEvents sebagai kunci deduplikasi.
Rekomendasi produksi
- Hosting file: unggah file audio ke Object Storage Service (OSS) Alibaba Cloud dan panggil API melalui URL. Hindari unggahan file lokal (panggilan file lokal dibatasi hingga 100 QPS dan tidak dapat diskalakan).
- Polling asinkron: transkripsi audio panjang menggunakan model asinkron. Atur interval polling yang wajar (misalnya 2 hingga 5 detik) untuk menghindari kueri yang sering yang menghabiskan kuota Anda. Untuk melebihi batas kueri 20 hingga 100 QPS, beralihlah ke notifikasi callback event. Untuk informasi lebih lanjut, lihat Skema konkurensi tinggi: gunakan callback alih-alih polling.
- Penanganan error: implementasikan mekanisme retry yang kuat. Untuk timeout jaringan atau error sementara di sisi server (5xx), lakukan retry dengan strategi backoff eksponensial.
- Reduksi noise: untuk audio yang berisik, pra-proses dengan alat seperti FFmpeg sebelum mengirimkannya untuk pengenalan.
- Pemilihan model: pilih model yang tepat berdasarkan durasi audio. Untuk audio pendek dalam 5 menit, gunakan Qwen3-ASR-Flash. Untuk audio panjang lebih dari 5 menit, gunakan Qwen-Audio-3.0-ASR-Flash-Filetrans, Fun-ASR, atau Qwen3-ASR-Flash-Filetrans.
Model dan wilayah yang didukung
Singapura
Untuk memanggil model berikut, gunakan Kunci API untuk wilayah Singapura:
- Qwen-Audio-3.0-ASR-Flash-Filetrans: qwen-audio-3.0-asr-flash-filetrans
- Qwen-Audio-3.0-ASR-Flash: qwen-audio-3.0-asr-flash
- Fun-ASR: fun-asr (versi stabil, saat ini setara dengan fun-asr-2025-11-07), fun-asr-2025-11-07 (versi snapshot), fun-asr-2025-08-25 (versi snapshot), fun-asr-mtl (versi stabil, saat ini setara dengan fun-asr-mtl-2025-08-25), fun-asr-mtl-2025-08-25 (versi snapshot)
- Fun-ASR-Flash: fun-asr-flash-2026-06-15
- Qwen3-ASR-Flash-Filetrans: qwen3-asr-flash-filetrans (versi stabil, saat ini setara dengan qwen3-asr-flash-filetrans-2025-11-17), qwen3-asr-flash-filetrans-2025-11-17 (versi snapshot)
- Qwen3-ASR-Flash: qwen3-asr-flash (versi stabil, saat ini setara dengan qwen3-asr-flash-2025-09-08), qwen3-asr-flash-2026-02-10 (versi snapshot terbaru), qwen3-asr-flash-2025-09-08 (versi snapshot)
AS (Virginia)
Untuk memanggil model berikut, gunakan Kunci API untuk wilayah AS:
Qwen3-ASR-Flash: qwen3-asr-flash-us (versi stabil, saat ini setara dengan qwen3-asr-flash-2025-09-08-us), qwen3-asr-flash-2025-09-08-us (versi snapshot)
China (Beijing)
Untuk memanggil model berikut, gunakan Kunci API untuk wilayah Beijing:
- Qwen-Audio-3.0-ASR-Flash-Filetrans: qwen-audio-3.0-asr-flash-filetrans
- Qwen-Audio-3.0-ASR-Flash: qwen-audio-3.0-asr-flash
- Fun-ASR: fun-asr (versi stabil, saat ini setara dengan fun-asr-2025-11-07), fun-asr-2025-11-07 (versi snapshot), fun-asr-2025-08-25 (versi snapshot), fun-asr-mtl (versi stabil, saat ini setara dengan fun-asr-mtl-2025-08-25), fun-asr-mtl-2025-08-25 (versi snapshot)
- Fun-ASR-Flash: fun-asr-flash-2026-06-15
- Qwen3-ASR-Flash-Filetrans: qwen3-asr-flash-filetrans (versi stabil, saat ini setara dengan qwen3-asr-flash-filetrans-2025-11-17), qwen3-asr-flash-filetrans-2025-11-17 (versi snapshot)
- Qwen3-ASR-Flash: qwen3-asr-flash (versi stabil, saat ini setara dengan qwen3-asr-flash-2025-09-08), qwen3-asr-flash-2026-02-10 (versi snapshot terbaru), qwen3-asr-flash-2025-09-08 (versi snapshot)
- Paraformer: paraformer-v2, paraformer-8k-v2
Referensi API
- Referensi API Pengenalan ucapan non-real-time - Qwen-Audio-3.0-ASR-Flash-Filetrans/Fun-ASR
- Referensi API Pengenalan ucapan non-real-time - Qwen-Audio-3.0-ASR-Flash/Fun-ASR-Flash
- Referensi API Pengenalan ucapan non-real-time - Qwen-ASR
- Referensi API Pengenalan ucapan non-real-time - Paraformer
FAQ
T: Bagaimana cara menyediakan URL audio yang dapat diakses publik ke API?
Gunakan Layanan Penyimpanan Objek (OSS) Alibaba Cloud. OSS menyediakan penyimpanan yang sangat tersedia dan andal, serta memungkinkan Anda menghasilkan URL akses publik.
Verifikasi bahwa URL yang dihasilkan dapat diakses melalui jaringan publik: buka URL di browser atau dengan perintah curl untuk memastikan file audio dapat diunduh atau diputar (kode status HTTP 200).
T: Bagaimana cara memeriksa apakah format audio memenuhi persyaratan?
Gunakan alat open-source ffprobe untuk dengan cepat mendapatkan informasi audio terperinci:
// Kueri format kontainer (format_name), kodek (codec_name), laju sampel (sample_rate), dan jumlah channel (channels) audio
ffprobe -v error -show_entries format=format_name -show_entries stream=codec_name,sample_rate,channels -of default=noprint_wrappers=1 your_audio_file.mp3
T: Bagaimana cara memproses audio agar memenuhi persyaratan model?
Gunakan alat open-source FFmpeg untuk memangkas atau mengonversi audio:
- Pangkas audio: ekstrak klip dari file audio panjang
// -i: file input
// -ss 00:01:30: atur waktu mulai pemangkasan (mulai pada 1 menit 30 detik)
// -t 00:02:00: atur durasi pemangkasan (pangkas 2 menit)
// -c copy: salin aliran audio langsung tanpa re-encoding, yang cepat
// output_clip.wav: file output
ffmpeg -i long_audio.wav -ss 00:01:30 -t 00:02:00 -c copy output_clip.wav
-
Konversi format
Misalnya, konversi audio apa pun ke file WAV mono 16 kHz, 16-bit:
// -i: file input
// -ac 1: atur jumlah channel ke 1 (mono)
// -ar 16000: atur laju sampel ke 16000 Hz (16 kHz)
// -sample_fmt s16: atur format sampel ke PCM integer bertanda 16-bit
// output.wav: file output
ffmpeg -i input.mp3 -ac 1 -ar 16000 -sample_fmt s16 output.wav
T: Bagaimana cara meningkatkan akurasi pengenalan?
Faktor-faktor berikut memengaruhi akurasi pengenalan. Periksa masing-masing dan optimalkan sesuai kebutuhan.
Faktor utama:
- Kualitas audio: kualitas perangkat perekam, laju sampel, dan noise lingkungan secara langsung memengaruhi kejernihan audio. Input audio berkualitas tinggi adalah fondasi pengenalan yang akurat.
- Karakteristik pembicara: nada suara, kecepatan bicara, aksen, dan perbedaan dialek (terutama dialek langka atau aksen kuat) meningkatkan kesulitan pengenalan.
- Bahasa dan kosakata: campuran bahasa, istilah teknis, atau slang meningkatkan kesulitan pengenalan. Konfigurasikan hotwords untuk meningkatkan akurasi istilah spesifik domain.
Metode optimasi:
- Tingkatkan kualitas audio: gunakan mikrofon berkinerja-tinggi, rekam pada laju sampel yang direkomendasikan, dan minimalkan noise lingkungan serta gema.
- Adaptasi terhadap pembicara: untuk audio dengan aksen kuat atau dialek mencolok, pilih model yang mendukung dialek tersebut.
- Konfigurasikan hotwords: atur hotwords untuk istilah teknis, nama diri, dan kata serupa.