Layanan Real-time Speech Recognition mengonversi aliran audio menjadi teks ber-tanda baca, mentranskripsikan audio dari mikrofon, rekaman rapat, maupun file audio lokal. Kasus penggunaan umum meliputi transkripsi rapat real-time, keterangan langsung (live captions), obrolan suara, dan layanan pelanggan cerdas.
Fitur utama
Pengenalan ucapan real-time untuk beberapa bahasa, termasuk Tiongkok, Inggris, dan berbagai dialek.
Output timestamp untuk menghasilkan hasil pengenalan terstruktur.
Laju sampel fleksibel dan berbagai format audio guna menyesuaikan dengan lingkungan perekaman yang berbeda.
Deteksi Aktivitas Suara (Voice Activity Detection/VAD) opsional untuk secara otomatis menyaring segmen diam, sehingga meningkatkan efisiensi pemrosesan audio panjang.
Koneksi SDK dan WebSocket yang menyediakan layanan stabil dengan latensi rendah.
Ketersediaan
Model yang didukung:
Internasional
Dalam mode penyebaran internasional, Endpoint dan Penyimpanan Data berada di wilayah Singapura. Sistem menjadwalkan secara dinamis Sumber Daya Komputasi Inferensi Model di seluruh wilayah global, kecuali Tiongkok daratan.
Saat memanggil model berikut, gunakan API Key dari wilayah Singapura:
Fun-ASR: fun-asr-realtime (Stable, saat ini setara dengan fun-asr-realtime-2025-11-07), fun-asr-realtime-2025-11-07 (Snapshot)
Tiongkok daratan
Dalam mode penyebaran Tiongkok daratan, Endpoint dan Penyimpanan Data berada di wilayah Beijing. Sumber Daya Komputasi Inferensi Model hanya beroperasi di dalam Tiongkok daratan.
Saat memanggil model berikut, gunakan API Key dari wilayah Beijing:
Fun-ASR: fun-asr-realtime (Stable, saat ini setara dengan fun-asr-realtime-2025-11-07), fun-asr-realtime-2026-02-28 (Latest Snapshot), fun-asr-realtime-2025-11-07 (Snapshot), fun-asr-realtime-2025-09-15 (Snapshot)
fun-asr-flash-8k-realtime (Stable, saat ini setara dengan fun-asr-flash-8k-realtime-2026-01-28), fun-asr-flash-8k-realtime-2026-01-28
Paraformer: paraformer-realtime-v2, paraformer-realtime-v1, paraformer-realtime-8k-v2, paraformer-realtime-8k-v1
Untuk informasi lebih lanjut, lihat Daftar Model.
Pemilihan model
Skenario | Recommended | Alasan |
Pengenalan Bahasa Mandarin (rapat/streaming langsung) | fun-asr-realtime, fun-asr-realtime-2026-02-28, paraformer-realtime-v2 | Menawarkan latensi stabil dan mendukung berbagai format audio serta laju sampel tinggi. |
Pengenalan multi-bahasa (Layanan Pelanggan lintas batas/konferensi internasional) | paraformer-realtime-v2 | Mendukung skenario lintas batas dan peralihan bahasa yang mulus. |
Pengenalan dialek Tiongkok (Layanan Pelanggan/layanan pemerintah) | fun-asr-realtime-2026-02-28, paraformer-realtime-v2 | Mencakup berbagai dialek regional. |
Pengenalan Campuran Bahasa Tiongkok, Inggris, dan Jepang (Kelas/Presentasi) | fun-asr-realtime, fun-asr-realtime-2025-11-07 | Dioptimalkan untuk pengenalan bahasa Mandarin, Inggris, dan Jepang. |
Transkripsi audio telepon dengan laju sampel rendah | fun-asr-flash-8k-realtime | Dioptimalkan untuk mentranskripsikan panggilan Layanan Pelanggan Tiongkok. |
Untuk informasi lebih lanjut, lihat Bandingkan model.
Memulai
Berikut adalah contoh kode untuk memanggil API. Untuk contoh lain yang mencakup skenario umum, lihat GitHub.
Dapatkan Kunci API dan ekspor Kunci API sebagai Variabel lingkungan. Jika menggunakan SDK untuk melakukan panggilan, instal DashScope SDK.
Fun-ASR
Dari mikrofon
Layanan Real-time Speech Recognition mentranskripsikan audio dari mikrofon dan memberikan output teks secara real-time saat Anda berbicara.
Java
import com.alibaba.dashscope.audio.asr.recognition.Recognition;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionParam;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionResult;
import com.alibaba.dashscope.common.ResultCallback;
import com.alibaba.dashscope.utils.Constants;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.TargetDataLine;
import java.nio.ByteBuffer;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) throws InterruptedException {
// URL berikut untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan wss://dashscope.aliyuncs.com/api-ws/v1/inference.
Constants.baseWebsocketApiUrl = "wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference";
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(new RealtimeRecognitionTask());
executorService.shutdown();
executorService.awaitTermination(1, TimeUnit.MINUTES);
System.exit(0);
}
}
class RealtimeRecognitionTask implements Runnable {
@Override
public void run() {
RecognitionParam param = RecognitionParam.builder()
.model("fun-asr-realtime")
// Kunci API untuk wilayah Singapura dan Beijing berbeda. Untuk mendapatkan Kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key.
// Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Anda: .apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.format("pcm")
.sampleRate(16000)
.build();
Recognition recognizer = new Recognition();
ResultCallback<RecognitionResult> callback = new ResultCallback<RecognitionResult>() {
@Override
public void onEvent(RecognitionResult result) {
if (result.isSentenceEnd()) {
System.out.println("Final Result: " + result.getSentence().getText());
} else {
System.out.println("Intermediate Result: " + result.getSentence().getText());
}
}
@Override
public void onComplete() {
System.out.println("Recognition complete");
}
@Override
public void onError(Exception e) {
System.out.println("RecognitionCallback error: " + e.getMessage());
}
};
try {
recognizer.call(param, callback);
// Buat AudioFormat.
AudioFormat audioFormat = new AudioFormat(16000, 16, 1, true, false);
// Dapatkan target data line yang sesuai dengan format yang ditentukan.
TargetDataLine targetDataLine =
AudioSystem.getTargetDataLine(audioFormat);
targetDataLine.open(audioFormat);
// Mulai merekam.
targetDataLine.start();
ByteBuffer buffer = ByteBuffer.allocate(1024);
long start = System.currentTimeMillis();
// Rekam selama 50 detik dan lakukan transkripsi ucapan real-time.
while (System.currentTimeMillis() - start < 50000) {
int read = targetDataLine.read(buffer.array(), 0, buffer.capacity());
if (read > 0) {
buffer.limit(read);
// Kirim data audio yang direkam ke layanan pengenalan streaming.
recognizer.sendAudioFrame(buffer);
buffer = ByteBuffer.allocate(1024);
// Tidur sejenak untuk mencegah penggunaan CPU tinggi.
Thread.sleep(20);
}
}
recognizer.stop();
} catch (Exception e) {
e.printStackTrace();
} finally {
// Tutup koneksi WebSocket setelah tugas selesai.
recognizer.getDuplexApi().close(1000, "bye");
}
System.out.println(
"[Metric] requestId: "
+ recognizer.getLastRequestId()
+ ", first package delay ms: "
+ recognizer.getFirstPackageDelay()
+ ", last package delay ms: "
+ recognizer.getLastPackageDelay());
}
}Python
Sebelum menjalankan contoh Python, instal paket PyAudio dengan perintah pip install pyaudio.
import os
import signal # Untuk penanganan event keyboard (tekan "Ctrl+C" untuk menghentikan perekaman).
import sys
import dashscope
import pyaudio
from dashscope.audio.asr import *
mic = None
stream = None
# Atur parameter perekaman.
sample_rate = 16000 # Laju pengambilan sampel (Hz).
channels = 1 # Saluran mono.
dtype = 'int16' # Tipe data.
format_pcm = 'pcm' # Format data audio.
block_size = 3200 # Jumlah frame per buffer.
# Definisikan callback pengenalan ucapan real-time.
class Callback(RecognitionCallback):
def on_open(self) -> None:
global mic
global stream
print('RecognitionCallback open.')
mic = pyaudio.PyAudio()
stream = mic.open(format=pyaudio.paInt16,
channels=1,
rate=16000,
input=True)
def on_close(self) -> None:
global mic
global stream
print('RecognitionCallback close.')
stream.stop_stream()
stream.close()
mic.terminate()
stream = None
mic = None
def on_complete(self) -> None:
print('RecognitionCallback completed.') # Pengenalan selesai.
def on_error(self, message) -> None:
print('RecognitionCallback task_id: ', message.request_id)
print('RecognitionCallback error: ', message.message)
# Hentikan dan tutup aliran audio jika sedang berjalan.
if 'stream' in globals() and stream.active:
stream.stop()
stream.close()
# Keluar dari program secara paksa.
sys.exit(1)
def on_event(self, result: RecognitionResult) -> None:
sentence = result.get_sentence()
if 'text' in sentence:
print('RecognitionCallback text: ', sentence['text'])
if RecognitionResult.is_sentence_end(sentence):
print(
'RecognitionCallback sentence end, request_id:%s, usage:%s'
% (result.get_request_id(), result.get_usage(sentence)))
def signal_handler(sig, frame):
print('Ctrl+C ditekan, hentikan pengenalan ...')
# Hentikan pengenalan.
recognition.stop()
print('Pengenalan dihentikan.')
print(
'[Metric] requestId: {}, first package delay ms: {}, last package delay ms: {}'
.format(
recognition.get_last_request_id(),
recognition.get_first_package_delay(),
recognition.get_last_package_delay(),
))
# Keluar dari program secara paksa.
sys.exit(0)
# Definisikan fungsi utama.
if __name__ == '__main__':
# Kunci API untuk wilayah Singapura dan Beijing berbeda. Untuk mendapatkan Kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key
# Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Model Studio Anda: dashscope.api_key = "sk-xxx"
dashscope.api_key = os.environ.get('DASHSCOPE_API_KEY')
# Berikut adalah URL untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan: wss://dashscope.aliyuncs.com/api-ws/v1/inference
dashscope.base_websocket_api_url='wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference'
# Buat callback pengenalan.
callback = Callback()
# Panggil layanan pengenalan dalam mode asinkron. Anda dapat menyesuaikan parameter pengenalan, seperti model, format, dan sample_rate.
recognition = Recognition(
model='fun-asr-realtime',
format=format_pcm,
# Format yang didukung meliputi 'pcm', 'wav', 'opus', 'speex', 'aac', dan 'amr'. Untuk informasi lebih lanjut, lihat dokumentasi.
sample_rate=sample_rate,
# Mendukung 8000 dan 16000.
semantic_punctuation_enabled=False,
callback=callback)
# Mulai pengenalan.
recognition.start()
signal.signal(signal.SIGINT, signal_handler)
print("Tekan 'Ctrl+C' untuk menghentikan perekaman dan pengenalan...")
# Atur penangan sinyal untuk menangkap sinyal interupsi (Ctrl+C).
while True:
if stream:
data = stream.read(3200, exception_on_overflow=False)
recognition.send_audio_frame(data)
else:
break
recognition.stop()Dari file lokal
API ini ideal untuk skenario audio pendek hampir real-time seperti obrolan suara, perintah suara, input suara, dan pencarian suara.
Java
File audio yang digunakan dalam contoh adalah asr_example.wav.
import com.alibaba.dashscope.api.GeneralApi;
import com.alibaba.dashscope.audio.asr.recognition.Recognition;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionParam;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionResult;
import com.alibaba.dashscope.base.HalfDuplexParamBase;
import com.alibaba.dashscope.common.GeneralListParam;
import com.alibaba.dashscope.common.ResultCallback;
import com.alibaba.dashscope.protocol.GeneralServiceOption;
import com.alibaba.dashscope.protocol.HttpMethod;
import com.alibaba.dashscope.protocol.Protocol;
import com.alibaba.dashscope.protocol.StreamingMode;
import com.alibaba.dashscope.utils.Constants;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
class TimeUtils {
private static final DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
public static String getTimestamp() {
return LocalDateTime.now().format(formatter);
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
// URL berikut untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan wss://dashscope.aliyuncs.com/api-ws/v1/inference.
Constants.baseWebsocketApiUrl = "wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference";
// Di lingkungan produksi, Anda hanya perlu memanggil metode ini sekali saat startup aplikasi.
warmUp();
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(new RealtimeRecognitionTask(Paths.get(System.getProperty("user.dir"), "asr_example.wav")));
executorService.shutdown();
// tunggu hingga semua tugas selesai
executorService.awaitTermination(1, TimeUnit.MINUTES);
System.exit(0);
}
public static void warmUp() {
try {
// Permintaan GET ringan untuk membuat koneksi
GeneralServiceOption warmupOption = GeneralServiceOption.builder()
.protocol(Protocol.HTTP)
.httpMethod(HttpMethod.GET)
.streamingMode(StreamingMode.OUT)
.path("assistants")
.build();
warmupOption.setBaseHttpUrl(Constants.baseHttpApiUrl);
GeneralApi<HalfDuplexParamBase> api = new GeneralApi<>();
api.get(GeneralListParam.builder().limit(1L).build(), warmupOption);
} catch (Exception e) {
// Setel ulang flag untuk memungkinkan percobaan ulang jika pemanasan awal gagal
}
}
}
class RealtimeRecognitionTask implements Runnable {
private Path filepath;
public RealtimeRecognitionTask(Path filepath) {
this.filepath = filepath;
}
@Override
public void run() {
RecognitionParam param = RecognitionParam.builder()
.model("fun-asr-realtime")
// Kunci API untuk wilayah Singapura dan Beijing berbeda. Untuk mendapatkan Kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key.
// Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Anda: .apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.format("wav")
.sampleRate(16000)
.build();
Recognition recognizer = new Recognition();
String threadName = Thread.currentThread().getName();
ResultCallback<RecognitionResult> callback = new ResultCallback<RecognitionResult>() {
@Override
public void onEvent(RecognitionResult message) {
if (message.isSentenceEnd()) {
System.out.println(TimeUtils.getTimestamp()+" "+
"[process " + threadName + "] Final Result:" + message.getSentence().getText());
} else {
System.out.println(TimeUtils.getTimestamp()+" "+
"[process " + threadName + "] Intermediate Result: " + message.getSentence().getText());
}
}
@Override
public void onComplete() {
System.out.println(TimeUtils.getTimestamp()+" "+"[" + threadName + "] Recognition complete");
}
@Override
public void onError(Exception e) {
System.out.println(TimeUtils.getTimestamp()+" "+
"[" + threadName + "] RecognitionCallback error: " + e.getMessage());
}
};
try {
recognizer.call(param, callback);
// Harap ganti path dengan path file audio Anda
System.out.println(TimeUtils.getTimestamp()+" "+"[" + threadName + "] Input file_path is: " + this.filepath);
// Baca file dan kirim audio per chunk
FileInputStream fis = new FileInputStream(this.filepath.toFile());
byte[] allData = new byte[fis.available()];
int ret = fis.read(allData);
fis.close();
int sendFrameLength = 3200;
for (int i = 0; i * sendFrameLength < allData.length; i ++) {
int start = i * sendFrameLength;
int end = Math.min(start + sendFrameLength, allData.length);
ByteBuffer byteBuffer = ByteBuffer.wrap(allData, start, end - start);
recognizer.sendAudioFrame(byteBuffer);
Thread.sleep(100);
}
System.out.println(TimeUtils.getTimestamp()+" "+LocalDateTime.now());
recognizer.stop();
} catch (Exception e) {
e.printStackTrace();
} finally {
// Tutup koneksi WebSocket setelah tugas selesai.
recognizer.getDuplexApi().close(1000, "bye");
}
System.out.println(
"["
+ threadName
+ "][Metric] requestId: "
+ recognizer.getLastRequestId()
+ ", first package delay ms: "
+ recognizer.getFirstPackageDelay()
+ ", last package delay ms: "
+ recognizer.getLastPackageDelay());
}
}Python
File audio yang digunakan dalam contoh adalah: asr_example.wav.
import os
import time
import dashscope
from dashscope.audio.asr import *
# Kunci API untuk wilayah Singapura dan Beijing berbeda. Untuk mendapatkan Kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key
# Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Model Studio Anda: dashscope.api_key = "sk-xxx"
dashscope.api_key = os.environ.get('DASHSCOPE_API_KEY')
# Berikut adalah URL untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan: wss://dashscope.aliyuncs.com/api-ws/v1/inference
dashscope.base_websocket_api_url='wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference'
from datetime import datetime
def get_timestamp():
now = datetime.now()
formatted_timestamp = now.strftime("[%Y-%m-%d %H:%M:%S.%f]")
return formatted_timestamp
class Callback(RecognitionCallback):
def on_complete(self) -> None:
print(get_timestamp() + ' Recognition completed') # Pengenalan selesai.
def on_error(self, result: RecognitionResult) -> None:
print('Recognition task_id: ', result.request_id)
print('Recognition error: ', result.message)
exit(0)
def on_event(self, result: RecognitionResult) -> None:
sentence = result.get_sentence()
if 'text' in sentence:
print(get_timestamp() + ' RecognitionCallback text: ', sentence['text'])
if RecognitionResult.is_sentence_end(sentence):
print(get_timestamp() +
'RecognitionCallback sentence end, request_id:%s, usage:%s'
% (result.get_request_id(), result.get_usage(sentence)))
callback = Callback()
recognition = Recognition(model='fun-asr-realtime',
format='wav',
sample_rate=16000,
callback=callback)
try:
audio_data: bytes = None
f = open("asr_example.wav", 'rb')
if os.path.getsize("asr_example.wav"):
# Baca seluruh file ke dalam buffer sekaligus.
file_buffer = f.read()
f.close()
print("Start Recognition")
recognition.start()
# Kirim data dalam potongan 3200 byte dari buffer.
buffer_size = len(file_buffer)
offset = 0
chunk_size = 3200
while offset < buffer_size:
# Hitung ukuran potongan data saat ini yang akan dikirim.
remaining_bytes = buffer_size - offset
current_chunk_size = min(chunk_size, remaining_bytes)
# Ekstrak potongan data saat ini dari buffer.
audio_data = file_buffer[offset:offset + current_chunk_size]
# Kirim frame data audio.
recognition.send_audio_frame(audio_data)
# Perbarui offset.
offset += current_chunk_size
# Tambahkan jeda untuk mensimulasikan transmisi real-time.
time.sleep(0.1)
recognition.stop()
else:
raise Exception(
'File yang diberikan kosong (panjang nol byte)')
except Exception as e:
raise e
print(
'[Metric] requestId: {}, first package delay ms: {}, last package delay ms: {}'
.format(
recognition.get_last_request_id(),
recognition.get_first_package_delay(),
recognition.get_last_package_delay(),
))Paraformer
Input mikrofon
Layanan Real-time Speech Recognition mentranskripsikan audio mikrofon menjadi teks secara real-time.
Java
import com.alibaba.dashscope.audio.asr.recognition.Recognition;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionParam;
import com.alibaba.dashscope.exception.NoApiKeyException;
import io.reactivex.BackpressureStrategy;
import io.reactivex.Flowable;
import java.nio.ByteBuffer;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.TargetDataLine;
public class Main {
public static void main(String[] args) throws NoApiKeyException {
// Buat Flowable<ByteBuffer>
Flowable<ByteBuffer> audioSource = Flowable.create(emitter -> {
new Thread(() -> {
try {
// Buat format audio
AudioFormat audioFormat = new AudioFormat(16000, 16, 1, true, false);
// Dapatkan perangkat perekaman default untuk format audio yang ditentukan
TargetDataLine targetDataLine =
AudioSystem.getTargetDataLine(audioFormat);
targetDataLine.open(audioFormat);
// Mulai merekam
targetDataLine.start();
ByteBuffer buffer = ByteBuffer.allocate(1024);
long start = System.currentTimeMillis();
// Rekam selama 300 detik dan lakukan transkripsi real-time
while (System.currentTimeMillis() - start < 300000) {
int read = targetDataLine.read(buffer.array(), 0, buffer.capacity());
if (read > 0) {
buffer.limit(read);
// Kirim data audio yang direkam ke layanan pengenalan streaming
emitter.onNext(buffer);
buffer = ByteBuffer.allocate(1024);
// Tidur untuk mengendalikan laju perekaman dan mencegah penggunaan CPU tinggi.
Thread.sleep(20);
}
}
// Beri tahu penyelesaian transkripsi
emitter.onComplete();
} catch (Exception e) {
emitter.onError(e);
}
}).start();
},
BackpressureStrategy.BUFFER);
// Buat instance Recognizer
Recognition recognizer = new Recognition();
// Bangun parameter pengenalan.
RecognitionParam param = RecognitionParam.builder()
.model("paraformer-realtime-v2")
.format("pcm")
.sampleRate(16000)
// Jika Anda belum mengonfigurasi Kunci API sebagai Variabel Lingkungan, hapus komentar baris berikut dan ganti "apikey" dengan Kunci API Anda sendiri.
// .apiKey("apikey")
.build();
// Panggil API dalam mode streaming
recognizer.streamCall(param, audioSource)
// Gunakan blockingForEach untuk menerima hasil
.blockingForEach(
result -> {
// Cetak hasil akhir
if (result.isSentenceEnd()) {
System.out.println("Fix:" + result.getSentence().getText());
} else {
System.out.println("Result:" + result.getSentence().getText());
}
});
System.exit(0);
}
}Python
Sebelum menjalankan contoh Python, instal suite pemutaran dan penangkapan audio PyAudio dengan perintah pip install pyaudio.
import pyaudio
from dashscope.audio.asr import (Recognition, RecognitionCallback,
RecognitionResult)
# Jika Anda belum mengonfigurasi Kunci API sebagai Variabel Lingkungan, hapus komentar baris berikut dan ganti "apiKey" dengan Kunci API Anda sendiri.
# import dashscope
# dashscope.api_key = "apiKey"
mic = None
stream = None
class Callback(RecognitionCallback):
def on_open(self) -> None:
global mic
global stream
print('RecognitionCallback open.')
mic = pyaudio.PyAudio()
stream = mic.open(format=pyaudio.paInt16,
channels=1,
rate=16000,
input=True)
def on_close(self) -> None:
global mic
global stream
print('RecognitionCallback close.')
stream.stop_stream()
stream.close()
mic.terminate()
stream = None
mic = None
def on_event(self, result: RecognitionResult) -> None:
print('RecognitionCallback sentence: ', result.get_sentence())
callback = Callback()
recognition = Recognition(model='paraformer-realtime-v2',
format='pcm',
sample_rate=16000,
callback=callback)
recognition.start()
while True:
if stream:
data = stream.read(3200, exception_on_overflow=False)
recognition.send_audio_frame(data)
else:
break
recognition.stop()File audio lokal
Layanan Real-time Speech Recognition dapat mengenali dan mentranskripsikan file audio lokal. API ini ideal untuk skenario hampir real-time dengan audio pendek, seperti obrolan suara, perintah kontrol, input suara, dan pencarian suara.
Java
import com.alibaba.dashscope.audio.asr.recognition.Recognition;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionParam;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
public class Main {
public static void main(String[] args) {
// Anda dapat mengabaikan pengunduhan file dari URL dan menggunakan file lokal untuk memanggil API.
String exampleWavUrl =
"https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav";
try {
InputStream in = new URL(exampleWavUrl).openStream();
Files.copy(in, Paths.get("asr_example.wav"), StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
System.out.println("error: " + e);
System.exit(1);
}
// Buat instance Recognition
Recognition recognizer = new Recognition();
// Buat RecognitionParam
RecognitionParam param =
RecognitionParam.builder()
// Jika Anda belum mengonfigurasi Kunci API sebagai Variabel Lingkungan, hapus komentar baris berikut dan ganti "apikey" dengan Kunci API Anda sendiri.
// .apiKey("apikey")
.model("paraformer-realtime-v2")
.format("wav")
.sampleRate(16000)
// Parameter "language_hints" hanya didukung oleh model paraformer-v2 dan paraformer-realtime-v2.
.parameter("language_hints", new String[]{"zh", "en"})
.build();
try {
System.out.println("Recognition Result: " + recognizer.call(param, new File("asr_example.wav")));
} catch (Exception e) {
e.printStackTrace();
}
System.exit(0);
}
}Python
import requests
from http import HTTPStatus
from dashscope.audio.asr import Recognition
# Jika Anda belum mengonfigurasi Kunci API sebagai Variabel Lingkungan, hapus komentar baris berikut dan ganti "apiKey" dengan Kunci API Anda sendiri.
# import dashscope
# dashscope.api_key = "apiKey"
# Anda dapat mengabaikan pengunduhan file dari URL dan menggunakan file lokal untuk pengenalan.
r = requests.get(
'https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav'
)
with open('asr_example.wav', 'wb') as f:
f.write(r.content)
recognition = Recognition(model='paraformer-realtime-v2',
format='wav',
sample_rate=16000,
# Parameter "language_hints" hanya didukung oleh model paraformer-v2 dan paraformer-realtime-v2.
language_hints=['zh', 'en'],
callback=None)
result = recognition.call('asr_example.wav')
if result.status_code == HTTPStatus.OK:
print('Recognition Result:')
print(result.get_sentence())
else:
print('Error: ', result.message)Mulai produksi
Meningkatkan akurasi pengenalan
Pilih Model dengan Laju Sampel yang Tepat: Untuk audio telepon yang direkam pada 8 kHz, gunakan model 8 kHz. Hindari upsampling ke 16 kHz untuk pengenalan karena dapat menyebabkan distorsi dan menurunkan akurasi.
Optimalkan Kualitas Input Audio: Gunakan mikrofon berkualitas tinggi dan pastikan lingkungan perekaman memiliki rasio sinyal terhadap noise (SNR) tinggi serta bebas gema. Pada level aplikasi, integrasikan algoritma pengurangan noise (seperti RNNoise) dan Pembatalan Gema Akustik (AEC) untuk memproses audio sebelumnya agar input lebih bersih.
Tentukan Bahasa Pengenalan: Untuk model multibahasa seperti Paraformer-v2, tentukan bahasa audio terlebih dahulu (misalnya, gunakan parameter Language_hints untuk menentukan
['zh','en']). Hal ini membantu model konvergen, menghindari kebingungan antar bahasa yang terdengar mirip, dan meningkatkan akurasi.Aktifkan Penghapusan Ketidakteraturan Ucapan: Untuk model Paraformer, aktifkan fitur penghapusan ketidakteraturan ucapan dengan mengatur parameter disfluency_removal_enabled. Hal ini menghasilkan output teks yang lebih formal dan mudah dibaca.
Menetapkan kebijakan toleransi kesalahan
Rekoneksi di Sisi Klien: Klien Anda harus menerapkan mekanisme rekoneksi otomatis untuk menangani jitter jaringan. Rekomendasi berikut berlaku untuk Software Development Kit (SDK) Python:
Tangkap Pengecualian: Implementasikan metode
on_errordalam kelasCallback. SDKdashscopememanggil metode ini saat mengalami error jaringan atau masalah lainnya.Beri Sinyal untuk Rekoneksi: Dalam metode
on_error, atur sinyal rekoneksi. Di Python, Anda dapat menggunakanthreading.Event, yaitu mekanisme pensinyalan aman untuk thread.Implementasikan Loop Rekoneksi: Bungkus logika utama Anda dalam loop
foruntuk mengelola percobaan ulang, misalnya hingga tiga kali. Saat sinyal rekoneksi terdeteksi, hentikan tugas pengenalan saat ini, bebaskan semua sumber daya, tunggu beberapa detik, lalu mulai ulang loop untuk membuat koneksi baru.
Atur Heartbeat untuk Mencegah Kehilangan Koneksi: Untuk mempertahankan koneksi jangka panjang dengan layanan, atur parameter heartbeat ke
true. Hal ini mencegah koneksi terputus meskipun terjadi periode diam yang panjang dalam audio.Pengendalian aliran: Saat memanggil API model, ikuti aturan Pengendalian aliran model.
API
Perbandingan fitur model
Fitur | Fun-ASR | Paraformer |
Bahasa yang didukung | Bervariasi berdasarkan model:
| Bervariasi berdasarkan model:
|
Format audio yang didukung | PCM, WAV, MP3, OPUS, Speex, AAC, dan AMR. | |
Laju sampel | Bervariasi berdasarkan model:
| Bervariasi berdasarkan model:
|
Saluran audio | Mono. | |
Format input | Aliran biner audio. | |
Durasi audio | Tanpa Batas. | Tanpa Batas. |
Pengenalan emosi | Bervariasi berdasarkan model:
| |
Penyaringan kata sensitif | ||
Diarisasi Pembicara | ||
Penyaringan kata pengisi | ||
Timestamp | ||
Prediksi tanda baca | Bervariasi berdasarkan model:
| |
Hotword | ||
Inverse text normalization (ITN) | ||
Deteksi aktivitas suara (VAD) | ||
Batas laju (RPS) | 20 | 20 |
Metode integrasi | SDK Java, Python, Android, dan iOS; API WebSocket. | |
Harga | Bervariasi berdasarkan model:
| Tiongkok daratan: $0,000034/detik |