Qwen-Omni-Realtime adalah model obrolan audio dan video real-time dari seri Qwen. Model ini mampu memahami input audio dan citra streaming, seperti rangkaian frame citra berkelanjutan yang diekstraksi dari aliran video secara real-time, serta menghasilkan teks dan audio berkualitas tinggi secara real-time.
Cara menggunakan
1. Membuat koneksi
Model Qwen-Omni-Realtime diakses melalui protokol WebSocket. Anda dapat membuat koneksi menggunakan contoh kode Python berikut atau SDK DashScope.
Sesi WebSocket tunggal untuk Qwen-Omni-Realtime dapat berlangsung maksimal 30 menit. Setelah batas ini tercapai, layanan akan secara otomatis menutup koneksi.
Koneksi WebSocket native
Item konfigurasi berikut diperlukan:
Item konfigurasi | Deskripsi |
Titik akhir | Tiongkok (Beijing): wss://dashscope.aliyuncs.com/api-ws/v1/realtime Internasional (Singapura): wss://dashscope-intl.aliyuncs.com/api-ws/v1/realtime |
Parameter kueri | Parameter kueri adalah model. Parameter ini harus diatur ke nama model yang ingin Anda akses. Contoh: |
Header permintaan | Gunakan Bearer Token untuk autentikasi: Authorization: Bearer DASHSCOPE_API_KEY DASHSCOPE_API_KEY adalah Kunci API yang Anda minta di Model Studio. |
# pip install websocket-client
import json
import websocket
import os
API_KEY=os.getenv("DASHSCOPE_API_KEY")
API_URL = "wss://dashscope-intl.aliyuncs.com/api-ws/v1/realtime?model=qwen3-omni-flash-realtime"
headers = [
"Authorization: Bearer " + API_KEY
]
def on_open(ws):
print(f"Connected to server: {API_URL}")
def on_message(ws, message):
data = json.loads(message)
print("Received event:", json.dumps(data, indent=2))
def on_error(ws, error):
print("Error:", error)
ws = websocket.WebSocketApp(
API_URL,
header=headers,
on_open=on_open,
on_message=on_message,
on_error=on_error
)
ws.run_forever()SDK DashScope
# SDK versi 1.23.9 atau yang lebih baru
import os
import json
from dashscope.audio.qwen_omni import OmniRealtimeConversation,OmniRealtimeCallback
import dashscope
# Kunci API untuk wilayah Singapura dan Beijing berbeda. Untuk mendapatkan kunci API, lihat https://www.alibabacloud.com/help/id/model-studio/get-api-key
# Jika Anda belum mengonfigurasi kunci API, ubah baris berikut menjadi dashscope.api_key = "sk-xxx"
dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")
class PrintCallback(OmniRealtimeCallback):
def on_open(self) -> None:
print("Connected Successfully")
def on_event(self, response: dict) -> None:
print("Received event:")
print(json.dumps(response, indent=2, ensure_ascii=False))
def on_close(self, close_status_code: int, close_msg: str) -> None:
print(f"Connection closed (code={close_status_code}, msg={close_msg}).")
callback = PrintCallback()
conversation = OmniRealtimeConversation(
model="qwen3-omni-flash-realtime",
callback=callback,
# Berikut ini adalah URL untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan wss://dashscope.aliyuncs.com/api-ws/v1/realtime
url="wss://dashscope-intl.aliyuncs.com/api-ws/v1/realtime"
)
try:
conversation.connect()
print("Conversation started. Press Ctrl+C to exit.")
conversation.thread.join()
except KeyboardInterrupt:
conversation.close()// SDK versi 2.20.9 atau yang lebih baru
import com.alibaba.dashscope.audio.omni.*;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.google.gson.JsonObject;
import java.util.concurrent.CountDownLatch;
public class Main {
public static void main(String[] args) throws InterruptedException, NoApiKeyException {
CountDownLatch latch = new CountDownLatch(1);
OmniRealtimeParam param = OmniRealtimeParam.builder()
.model("qwen3-omni-flash-realtime")
.apikey(System.getenv("DASHSCOPE_API_KEY"))
// Berikut ini adalah URL untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan wss://dashscope.aliyuncs.com/api-ws/v1/realtime
.url("wss://dashscope-intl.aliyuncs.com/api-ws/v1/realtime")
.build();
OmniRealtimeConversation conversation = new OmniRealtimeConversation(param, new OmniRealtimeCallback() {
@Override
public void onOpen() {
System.out.println("Connected Successfully");
}
@Override
public void onEvent(JsonObject message) {
System.out.println(message);
}
@Override
public void onClose(int code, String reason) {
System.out.println("connection closed code: " + code + ", reason: " + reason);
latch.countDown();
}
});
conversation.connect();
latch.await();
conversation.close(1000, "bye");
System.exit(0);
}
}2. Mengonfigurasi sesi
Kirim event klien session.update:
{
// ID event ini, dihasilkan oleh klien.
"event_id": "event_ToPZqeobitzUJnt3QqtWg",
// Jenis event. Nilainya tetap session.update.
"type": "session.update",
// Konfigurasi sesi.
"session": {
// Modalitas keluaran. Nilai yang didukung adalah ["text"] (hanya teks) atau ["text", "audio"] (teks dan audio).
"modalities": [
"text",
"audio"
],
// Suara untuk keluaran audio.
"voice": "Cherry",
// Format audio input. Hanya pcm16 yang didukung.
"input_audio_format": "pcm16",
// Format audio keluaran. Hanya pcm24 yang didukung.
"output_audio_format": "pcm24",
// Pesan sistem. Digunakan untuk menetapkan tujuan atau peran model.
"instructions": "Anda adalah agen layanan pelanggan AI untuk hotel bintang lima. Jawab pertanyaan pelanggan mengenai jenis kamar, fasilitas, harga, dan kebijakan pemesanan secara akurat dan ramah. Selalu tanggapi dengan sikap profesional dan membantu. Jangan memberikan informasi yang belum dikonfirmasi atau informasi di luar cakupan layanan hotel.",
// Menentukan apakah akan mengaktifkan deteksi aktivitas suara. Untuk mengaktifkannya, berikan objek konfigurasi. Server akan secara otomatis mendeteksi awal dan akhir ucapan berdasarkan objek ini.
// Atur ke null agar klien yang menentukan kapan memulai respons model.
"turn_detection": {
// Jenis VAD. Harus diatur ke server_vad.
"type": "server_vad",
// Ambang batas deteksi VAD. Tingkatkan nilai ini di lingkungan yang bising dan turunkan di lingkungan yang tenang.
"threshold": 0.5,
// Durasi diam untuk mendeteksi akhir ucapan. Jika nilai ini terlampaui, respons model akan dipicu.
"silence_duration_ms": 800
}
}
}3. Input audio dan citra
Klien mengirim data audio dan citra yang dikodekan Base64 ke buffer server menggunakan event input_audio_buffer.append dan input_image_buffer.append. Input audio wajib, sedangkan input citra opsional.
Citra dapat berasal dari file lokal atau diambil secara real-time dari aliran video.
Saat Deteksi Aktivitas Suara (VAD) sisi server diaktifkan, server secara otomatis mengirimkan data dan memicu respons saat mendeteksi akhir ucapan. Saat VAD dinonaktifkan (mode manual), klien harus memanggil event input_audio_buffer.commit untuk mengirimkan data.
4. Menerima respons model
Format respons model bergantung pada modalitas keluaran yang dikonfigurasi.
Hanya teks
Anda dapat menerima teks streaming melalui event response.text.delta dan memperoleh teks lengkap melalui event response.text.done.
Teks dan audio
Teks: Anda dapat menerima teks streaming melalui event response.audio_transcript.delta dan memperoleh teks lengkap melalui event response.audio_transcript.done.
Audio: Anda dapat memperoleh data keluaran audio streaming yang dikodekan Base64 melalui event response.audio.delta. Event response.audio.done menandakan bahwa pembuatan data audio telah selesai.
Daftar model
Qwen3-Omni-Flash-Realtime adalah model multimodal real-time terbaru dalam seri Qwen. Dibandingkan dengan model generasi sebelumnya Qwen-Omni-Turbo-Realtime yang tidak akan diperbarui lagi, Qwen3-Omni-Flash-Realtime memiliki keunggulan berikut:
Bahasa yang didukung
Jumlah bahasa yang didukung meningkat menjadi 10, termasuk Bahasa Tiongkok (Mandarin dan dialek seperti Shanghainese, Kanton, dan Sichuan), Inggris, Prancis, Jerman, Rusia, Italia, Spanyol, Portugis, Jepang, dan Korea. Qwen-Omni-Turbo-Realtime hanya mendukung dua bahasa: Bahasa Tiongkok (Mandarin) dan Inggris.
Suara yang didukung
Jumlah suara yang didukung meningkat menjadi 17. Qwen-Omni-Turbo-Realtime hanya mendukung 4. Untuk informasi selengkapnya, lihat Daftar suara.
Internasional (Singapura)
Model | Versi | Jendela konteks | Input maks | Keluaran maks | Kuota gratis |
(Tokens) | |||||
qwen3-omni-flash-realtime Setara dengan qwen3-omni-flash-realtime-2025-09-15 | Stabil | 65.536 | 49.152 | 16.384 | 1 juta token masing-masing, terlepas dari modalitas Berlaku selama 90 hari setelah Anda mengaktifkan Model Studio |
qwen3-omni-flash-realtime-2025-09-15 | Cuplikan | ||||
Tiongkok (Beijing)
Model | Versi | Jendela konteks | Input maks | Keluaran maks | Kuota gratis |
(Token) | |||||
qwen3-omni-flash-realtime Setara dengan qwen3-omni-flash-realtime-2025-09-15 | Stabil | 65.536 | 49.152 | 16.384 | Tidak ada kuota gratis |
qwen3-omni-flash-realtime-2025-09-15 | Cuplikan | ||||
Memulai
Anda perlu menyelesaikan langkah-langkah dalam Persiapan: Mendapatkan dan mengonfigurasi kunci API dan Mengonfigurasi kunci API sebagai variabel lingkungan (akan ditinggalkan dan digabungkan ke Konfigurasi kunci API).
Pilih bahasa pemrograman yang Anda kuasai dan ikuti langkah-langkah berikut untuk segera memulai percakapan real-time dengan model Qwen-Omni-Realtime.
SDK Python DashScope
Siapkan lingkungan runtime
Versi Python Anda harus 3.10 atau yang lebih baru.
Pertama, instal pyaudio berdasarkan sistem operasi Anda.
macOS
brew install portaudio && pip install pyaudioDebian/Ubuntu
Jika Anda tidak menggunakan lingkungan virtual, Anda dapat menginstalnya langsung menggunakan manajer paket sistem:
sudo apt-get install python3-pyaudioJika Anda berada dalam lingkungan virtual, Anda harus terlebih dahulu menginstal dependensi kompilasi:
sudo apt update sudo apt install -y python3-dev portaudio19-devKemudian, instal menggunakan pip di lingkungan virtual yang diaktifkan:
pip install pyaudio
CentOS
sudo yum install -y portaudio portaudio-devel && pip install pyaudioWindows
pip install pyaudioSetelah instalasi selesai, instal dependensi menggunakan pip:
pip install websocket-client dashscopePilih mode interaksi
Mode VAD (Deteksi Aktivitas Suara, yang secara otomatis mendeteksi awal dan akhir ucapan)
Server secara otomatis menentukan kapan pengguna mulai dan berhenti berbicara serta merespons sesuai.
Mode manual (tekan untuk berbicara, lepas untuk mengirim)
Klien mengontrol awal dan akhir ucapan. Setelah pengguna selesai berbicara, klien harus secara aktif mengirim pesan ke server.
Mode VAD
Buat file Python baru bernama vad_dash.py dan salin kode berikut ke dalam file tersebut:
Jalankan
vad_dash.pyuntuk melakukan percakapan real-time dengan model Qwen-Omni-Realtime melalui mikrofon Anda. Sistem mendeteksi awal dan akhir ucapan Anda serta secara otomatis mengirimkannya ke server tanpa intervensi manual.Mode manual
Buat file Python baru bernama
manual_dash.pydan salin kode berikut ke dalam file tersebut:Jalankan
manual_dash.py, tekan Enter untuk mulai berbicara, dan tekan Enter lagi untuk menerima respons audio model.
SDK Java DashScope
Pilih mode interaksi
Mode VAD (Deteksi Aktivitas Suara, yang secara otomatis mendeteksi awal dan akhir ucapan)
API Realtime secara otomatis menentukan kapan pengguna mulai dan berhenti berbicara serta merespons sesuai.
Mode manual (tekan untuk berbicara, lepas untuk mengirim)
Klien mengontrol awal dan akhir ucapan. Setelah pengguna selesai berbicara, klien harus secara aktif mengirim pesan ke server.
Mode VAD
Jalankan metode OmniServerVad.main() untuk melakukan percakapan real-time dengan model Qwen-Omni-Realtime melalui mikrofon Anda. Sistem mendeteksi awal dan akhir ucapan Anda serta secara otomatis mengirimkannya ke server tanpa intervensi manual.
Mode manual
Jalankan metode OmniWithoutServerVad.main(). Tekan Enter untuk mulai merekam. Selama perekaman, tekan Enter lagi untuk menghentikan perekaman dan mengirim audio. Respons model kemudian diterima dan diputar.
WebSocket (Python)
Siapkan lingkungan runtime
Versi Python Anda harus 3.10 atau yang lebih baru.
Pertama, instal pyaudio berdasarkan sistem operasi Anda.
macOS
brew install portaudio && pip install pyaudioDebian/Ubuntu
sudo apt-get install python3-pyaudio or pip install pyaudioKami merekomendasikan menggunakan
pip install pyaudio. Jika instalasi gagal, instal terlebih dahulu dependensiportaudiountuk sistem operasi Anda.CentOS
sudo yum install -y portaudio portaudio-devel && pip install pyaudioWindows
pip install pyaudioSetelah instalasi selesai, instal dependensi terkait websocket menggunakan pip:
pip install websockets==15.0.1Buat klien
Buat file Python baru bernama
omni_realtime_client.pydi direktori lokal Anda dan salin kode berikut ke dalam file tersebut:Pilih mode interaksi
Mode VAD (Deteksi Aktivitas Suara, yang secara otomatis mendeteksi awal dan akhir ucapan)
API Realtime secara otomatis menentukan kapan pengguna mulai dan berhenti berbicara serta merespons sesuai.
Mode manual (tekan untuk berbicara, lepas untuk mengirim)
Klien mengontrol awal dan akhir ucapan. Setelah pengguna selesai berbicara, klien harus secara aktif mengirim pesan ke server.
Mode VAD
Di direktori yang sama dengan
omni_realtime_client.py, buat file Python lain bernamavad_mode.pydan salin kode berikut ke dalam file tersebut:Jalankan
vad_mode.pyuntuk melakukan percakapan real-time dengan model Qwen-Omni-Realtime melalui mikrofon Anda. Sistem mendeteksi awal dan akhir ucapan Anda serta secara otomatis mengirimkannya ke server tanpa intervensi manual.Mode manual
Di direktori yang sama dengan
omni_realtime_client.py, buat file Python lain bernamamanual_mode.pydan salin kode berikut ke dalam file tersebut:Jalankan
manual_mode.py, tekan Enter untuk mulai berbicara, dan tekan Enter lagi untuk menerima respons audio model.
Alur interaksi
Mode VAD
Atur session.turn_detection dalam event session.update ke "server_vad" untuk mengaktifkan mode VAD. Dalam mode ini, server secara otomatis mendeteksi awal dan akhir ucapan serta merespons sesuai. Mode ini cocok untuk skenario panggilan suara.
Alur interaksinya adalah sebagai berikut:
Server mendeteksi awal ucapan dan mengirim event input_audio_buffer.speech_started.
Klien dapat mengirim event input_audio_buffer.append dan input_image_buffer.append kapan saja untuk menambahkan audio dan citra ke buffer.
Sebelum mengirim event input_image_buffer.append, Anda harus mengirim setidaknya satu event input_audio_buffer.append.
Server mendeteksi akhir ucapan dan mengirim event input_audio_buffer.speech_stopped.
Server mengirim event input_audio_buffer.committed untuk mengirimkan buffer audio.
Server mengirim event conversation.item.created, yang berisi item pesan pengguna yang dibuat dari buffer.
Siklus hidup | Event klien | Event server |
Inisialisasi sesi | Konfigurasi sesi | Sesi dibuat Konfigurasi sesi diperbarui |
Input audio pengguna | Tambahkan audio ke buffer Tambahkan citra ke buffer | input_audio_buffer.speech_started Deteksi awal ucapan input_audio_buffer.speech_stopped Deteksi akhir ucapan Server menerima audio yang dikirim |
Keluaran audio server | Tidak ada | Server mulai menghasilkan respons Konten keluaran baru selama respons Item percakapan dibuat Konten keluaran baru ditambahkan ke pesan asisten response.audio_transcript.delta Teks transkripsi yang dihasilkan secara bertahap Audio yang dihasilkan secara bertahap dari model response.audio_transcript.done Transkripsi teks selesai Pembuatan audio selesai Streaming konten teks atau audio untuk pesan asisten selesai Streaming seluruh item keluaran untuk pesan asisten selesai Respons selesai |
Mode manual
Atur session.turn_detection dalam event session.update ke null untuk mengaktifkan Mode Manual. Dalam mode ini, klien meminta respons server dengan secara eksplisit mengirim event input_audio_buffer.commit dan response.create. Mode ini cocok untuk skenario push-to-talk, seperti mengirim pesan suara di aplikasi obrolan.
Alur interaksinya adalah sebagai berikut:
Klien dapat mengirim event input_audio_buffer.append dan input_image_buffer.append kapan saja untuk menambahkan audio dan citra ke buffer.
Sebelum mengirim event input_image_buffer.append, Anda harus mengirim setidaknya satu event input_audio_buffer.append.
Klien mengirim event input_audio_buffer.commit untuk mengirimkan buffer audio dan citra. Ini memberi tahu server bahwa semua input pengguna, termasuk audio dan citra, untuk giliran saat ini telah dikirim.
Server merespons dengan event input_audio_buffer.committed.
Klien mengirim event response.create dan menunggu keluaran model dari server.
Server merespons dengan event conversation.item.created.
Siklus hidup | Event klien | Event server |
Inisialisasi sesi | Konfigurasi sesi | Sesi dibuat Konfigurasi sesi diperbarui |
Input audio pengguna | Tambahkan audio ke buffer Tambahkan citra ke buffer Kirimkan audio dan citra ke server Buat respons model | Server menerima audio yang dikirim |
Keluaran audio server | Kosongkan audio dari buffer | Server mulai menghasilkan respons Konten keluaran baru selama respons Item percakapan dibuat Konten keluaran baru ditambahkan ke item pesan asisten response.audio_transcript.delta Teks transkripsi yang dihasilkan secara bertahap Audio yang dihasilkan secara bertahap dari model response.audio_transcript.done Transkripsi teks selesai Pembuatan audio selesai Streaming konten teks atau audio untuk pesan asisten selesai Streaming seluruh item keluaran untuk pesan asisten selesai Respons selesai |
Referensi API
Penagihan dan pembatasan
Aturan penagihan
Model Qwen-Omni-Realtime ditagih berdasarkan jumlah token yang digunakan untuk modalitas input yang berbeda, seperti audio dan citra. Untuk informasi selengkapnya tentang penagihan, lihat Daftar model.
Pembatasan
Untuk informasi selengkapnya tentang aturan pembatasan model, lihat Pembatasan.
Kode kesalahan
Jika panggilan gagal, lihat Pesan kesalahan untuk pemecahan masalah.
Daftar suara
Qwen3-Omni-Flash-Realtime
Nama |
| Efek suara | Deskripsi | Bahasa yang didukung |
Cherry | Cherry | Suara wanita muda yang ceria, ramah, dan alami. | Bahasa Tiongkok, Inggris, Prancis, Jerman, Rusia, Italia, Spanyol, Portugis, Jepang, Korea, Thailand | |
Ethan | Ethan | Mandarin standar dengan sedikit aksen utara. Suara yang cerah, hangat, dan energetik. | Bahasa Tiongkok, Inggris, Prancis, Jerman, Rusia, Italia, Spanyol, Portugis, Jepang, Korea, Thailand | |
Nofish | Nofish | Desainer yang tidak menggunakan konsonan retrofleks. | Bahasa Tiongkok, Inggris, Prancis, Jerman, Rusia, Italia, Spanyol, Portugis, Jepang, Korea, Thailand | |
Jennifer | Jennifer | Suara wanita Inggris Amerika premium yang sinematik. | Bahasa Tiongkok, Inggris, Prancis, Jerman, Rusia, Italia, Spanyol, Portugis, Jepang, Korea, Thailand | |
Ryan | Ryan | Suara dramatis yang berirama dengan realisme dan ketegangan. | Bahasa Tiongkok, Inggris, Prancis, Jerman, Rusia, Italia, Spanyol, Portugis, Jepang, Korea, Thailand | |
Katerina | Katerina | Suara wanita dewasa dan berirama. | Bahasa Tiongkok, Inggris, Prancis, Jerman, Rusia, Italia, Spanyol, Portugis, Jepang, Korea, Thailand | |
Elias | Elias | Menjelaskan topik kompleks dengan ketelitian akademis dan penceritaan yang jelas. | Bahasa Tiongkok, Inggris, Prancis, Jerman, Rusia, Italia, Spanyol, Portugis, Jepang, Korea, Thailand | |
Shanghai-Jada | Jada | Wanita ceria dari Shanghai. | Bahasa Tiongkok (Shanghainese), Inggris, Prancis, Jerman, Rusia, Italia, Spanyol, Portugis, Jepang, Korea, Thailand | |
Beijing-Dylan | Dylan | Remaja yang tumbuh di hutong Beijing. | Bahasa Tiongkok (dialek Beijing), Inggris, Prancis, Jerman, Rusia, Italia, Spanyol, Portugis, Jepang, Korea, Thailand | |
Sichuan-Sunny | Sunny | Suara wanita manis dari Sichuan. | Bahasa Tiongkok (Sichuanese), Inggris, Prancis, Jerman, Rusia, Italia, Spanyol, Portugis, Jepang, Korea, Thailand | |
Nanjing-Li | Li | Guru yoga yang sabar. | Bahasa Tiongkok (dialek Nanjing), Inggris, Prancis, Jerman, Rusia, Italia, Spanyol, Portugis, Jepang, Korea, Thailand | |
Shaanxi-Marcus | Marcus | Suara tulus dan dalam dari Shaanxi. | Bahasa Tiongkok (dialek Shaanxi), Inggris, Prancis, Jerman, Rusia, Italia, Spanyol, Portugis, Jepang, Korea, Thailand | |
Man Nan-Roy | Roy | Suara pria muda yang lucu dan ceria dengan aksen Minnan. | Bahasa Tiongkok (Min Nan), Inggris, Prancis, Jerman, Rusia, Italia, Spanyol, Portugis, Jepang, Korea, Thailand | |
Tianjin-Peter | Peter | Suara untuk tokoh straight man dalam crosstalk Tianjin. | Bahasa Tiongkok (dialek Tianjin), Inggris, Prancis, Jerman, Rusia, Italia, Spanyol, Portugis, Jepang, Korea, Thailand | |
Cantonese-Rocky | Rocky | Suara pria lucu dan humoris untuk obrolan online. | Bahasa Tiongkok (Kanton), Inggris, Prancis, Jerman, Rusia, Italia, Spanyol, Portugis, Jepang, Korea, Thailand | |
Cantonese-Kiki | Kiki | Sahabat terbaik yang manis dari Hong Kong. | Bahasa Tiongkok (Kanton), Inggris, Prancis, Jerman, Rusia, Italia, Spanyol, Portugis, Jepang, Korea, Thailand | |
Sichuan-Eric | Eric | Suara pria tidak konvensional dan halus dari Chengdu, Sichuan. | Bahasa Tiongkok (Sichuanese), Inggris, Prancis, Jerman, Rusia, Italia, Spanyol, Portugis, Jepang, Korea, Thailand |
Qwen-Omni-Turbo-Realtime
Nama |
| Efek suara | Deskripsi | Bahasa yang didukung |
Cherry | Cherry | Wanita muda yang ceria, ramah, dan tulus. | Bahasa Tiongkok, Inggris | |
Serena | Serena | Wanita muda yang baik hati. | Bahasa Tiongkok, Inggris | |
Ethan | Ethan | Mandarin standar dengan sedikit aksen utara. Suara yang cerah, hangat, dan energetik. | Bahasa Tiongkok, Inggris | |
Chelsie | Chelsie | Suara pacar virtual bergaya anime. | Bahasa Tiongkok, Inggris |