Ringurooma Speech Service là một dịch vụ microservice xử lý và đánh giá kỹ năng nói tiếng Nhật, sử dụng Azure Speech Service SDK.
- Chuyển đổi giọng nói thành văn bản: Nhận dạng và chuyển đổi giọng nói tiếng Nhật thành văn bản
- Đánh giá phát âm: Đánh giá độ chính xác phát âm tiếng Nhật theo thang điểm 100
- Phân tích ngữ điệu và âm điệu: Đánh giá độ tự nhiên của ngữ điệu khi nói tiếng Nhật
- Đánh giá tốc độ nói: Phân tích và đánh giá tốc độ nói có phù hợp hay không
- Phân tích trọng âm từ vựng: Đánh giá việc đặt trọng âm đúng vị trí trong từ
- Phân tích điểm mạnh, điểm yếu: Xác định điểm mạnh, điểm yếu trong kỹ năng nói
- Đề xuất cải thiện: Đưa ra các gợi ý để cải thiện kỹ năng nói tiếng Nhật
Tất cả API endpoints yêu cầu xác thực bằng API key thông qua header X-API-Key
hoặc query parameter api_key
.
- Mô tả: Kiểm tra trạng thái hoạt động của máy chủ
- Phản hồi: Thông tin về phiên bản và trạng thái
- Ví dụ phản hồi:
{ "message": "Ringurooma Speech API Server", "version": "1.0.0", "status": "running", "features": [ "Speech to Text (POST /api/speech-to-text)", "Real-time Speech to Text (WebSocket)", "Pronunciation Assessment (POST /api/pronunciation-assessment)", "Text to Speech (POST /api/text-to-speech)", "Intent Recognition (POST /api/intent-recognition)" ] }
- Mô tả: Chuyển đổi âm thanh thành văn bản
- Content-Type: multipart/form-data hoặc application/json (nếu sử dụng base64)
- Tham số:
- Sử dụng file:
audio
: File âm thanh (WAV) - bắt buộcuser_id
: ID người dùng - tùy chọn
- Sử dụng base64:
audio_base64
: Chuỗi base64 của âm thanh - bắt buộcuser_id
: ID người dùng - tùy chọn- Headers:
X-Audio-Format
:base64
- bắt buộc
- Sử dụng file:
- Giới hạn: Kích thước file tối đa 10MB
- Phản hồi: Văn bản được nhận dạng từ âm thanh
- Ví dụ phản hồi:
{ "user_id": "test-user-001", "transcription": "こんにちは、私の名前は田中です。", "timestamp": "2025-05-18T07:31:28.123Z" }
- Mô tả: Đánh giá phát âm tiếng Nhật dựa trên âm thanh và văn bản tham chiếu
- Content-Type: multipart/form-data hoặc application/json (nếu sử dụng base64)
- Tham số:
- Sử dụng file:
audio
: File âm thanh (WAV) - bắt buộcreference_text
: Văn bản tham chiếu tiếng Nhật - bắt buộcuser_id
: ID người dùng - tùy chọn
- Sử dụng base64:
audio_base64
: Chuỗi base64 của âm thanh - bắt buộcreference_text
: Văn bản tham chiếu tiếng Nhật - bắt buộcuser_id
: ID người dùng - tùy chọn- Headers:
X-Audio-Format
:base64
- bắt buộcContent-Type
:application/json
- bắt buộc
- Sử dụng file:
- Giới hạn: Kích thước file tối đa 10MB
- Phản hồi: Kết quả đánh giá chi tiết
- Ví dụ phản hồi:
{ "user_id": "test-user-001", "reference_text": "こんにちは、私の名前は田中です。", "transcription": { "fromRecognition": "こんにちは、私の名前は田中です。", "fromAssessment": "こんにちは、私の名前は田中です。" }, "jlpt_level": "N3", "pronunciation_scores": { "accuracy": 85.7, "fluency": 79.3, "completeness": 95.0, "pronunciation": 82.5, "prosody": 75.2 }, "speech_rate": { "words_per_minute": 120, "assessment": { "rating": "good", "feedback": "Tốc độ nói phù hợp, gần với tốc độ nói tự nhiên của người bản xứ." } }, "word_stress": { "overall_score": 76.5, "details": [...] }, "analysis": { "strengths": ["Phát âm chính xác các từ vựng", "Nói đầy đủ nội dung so với văn bản tham chiếu"], "weaknesses": ["Ngữ điệu chưa tự nhiên, còn đơn điệu"], "improvement_suggestions": ["Nghe và bắt chước ngữ điệu của người bản xứ, tập trung vào cao độ và trọng âm"] }, "word_details": [...], "phoneme_details": [...], "benchmark_comparison": { "accuracy_vs_benchmark": "5.70", "fluency_vs_benchmark": "-0.70", "overall_vs_benchmark": "2.50" }, "timestamp": "2025-05-18T07:31:28.123Z" }
- Mô tả: Chuyển đổi văn bản thành giọng nói
- Content-Type: application/json
- Tham số:
text
: Văn bản cần chuyển đổi thành giọng nói - bắt buộcvoice_name
: Tên giọng đọc (mặc định: 'ja-JP-NanamiNeural') - tùy chọn
- Phản hồi: File âm thanh MP3
- Response Headers:
Content-Type
: audio/mp3Content-Disposition
: attachment; filename="tts-[timestamp].mp3"
- Mô tả: Nhận dạng ý định từ văn bản hoặc âm thanh
- Content-Type: multipart/form-data hoặc application/json
- Tham số:
- Đầu vào là văn bản (application/json):
text
: Văn bản cần nhận dạng ý định - bắt buộcuser_id
: ID người dùng - tùy chọn
- Đầu vào là âm thanh (multipart/form-data):
audio
: File âm thanh (WAV) - bắt buộcuser_id
: ID người dùng - tùy chọn
- Đầu vào là âm thanh base64 (application/json):
audio_base64
: Chuỗi base64 của âm thanh - bắt buộcuser_id
: ID người dùng - tùy chọn- Headers:
X-Audio-Format
:base64
- bắt buộc
- Đầu vào là văn bản (application/json):
- Giới hạn: Kích thước file tối đa 10MB (đối với đầu vào âm thanh)
- Phản hồi: Kết quả nhận dạng ý định
- Ví dụ phản hồi:
{ "user_id": "test-user-001", "query": "こんにちは、初めまして。お願いします。", "intent": { "top": "Greeting", "confidence": 0.5 }, "intents": { "Greeting": 2, "Request": 1, "Farewell": 0, "Question": 0, "Affirmation": 0, "Negation": 0, "Opinion": 0 }, "entities": [], "timestamp": "2025-05-18T07:45:12.456Z" }
- Mô tả: Kết nối WebSocket để nhận dạng giọng nói theo thời gian thực
- Giao thức: WebSocket (ws:// hoặc wss://)
- Quy trình:
- Kết nối tới WebSocket endpoint
- Gửi lệnh bắt đầu:
{"command": "start"}
- Gửi dữ liệu âm thanh dưới dạng binary data
- Nhận kết quả nhận dạng theo thời gian thực
- Gửi lệnh dừng:
{"command": "stop"}
- Định dạng tin nhắn từ server:
{ "type": "recognition", "result": { "type": "recognizing", // hoặc "recognized" "text": "こんにちは", "isFinal": false // true nếu là kết quả cuối cùng } }
Dịch vụ tự động xác định cấp độ JLPT dựa trên điểm phát âm:
JLPT Level | Điểm phát âm |
---|---|
N1 | 90-100 |
N2 | 80-89 |
N3 | 70-79 |
N4 | 60-69 |
N5 | <60 |
- Clone repository
- Cài đặt dependencies:
npm install
- Cấu hình môi trường: Tạo file
.env
với các biến:SPEECH_KEY=your_azure_speech_key SPEECH_REGION=your_azure_region API_KEY=your_api_authentication_key PORT=3000 (optional)
- Chạy dịch vụ:
node server.js
hoặcnpm start
- Đảm bảo Docker và Docker Compose đã được cài đặt
- Tạo file
.env
với các biến môi trường cần thiết - Chạy:
docker-compose up -d
Sử dụng script setup-ssl.sh
để thiết lập SSL với Let's Encrypt:
./setup-ssl.sh your-domain.com
curl -X POST \
-H "X-API-Key: your_api_key" \
-F "audio=@/path/to/audio.wav" \
-F "user_id=test-user" \
https://your-domain.com/api/speech-to-text
curl -X POST \
-H "X-API-Key: your_api_key" \
-F "audio=@/path/to/audio.wav" \
-F "reference_text=こんにちは、私の名前は田中です。" \
-F "user_id=test-user" \
https://your-domain.com/api/pronunciation-assessment
curl -X POST \
-H "X-API-Key: your_api_key" \
-H "Content-Type: application/json" \
-H "X-Audio-Format: base64" \
-d '{
"audio_base64": "UklGRiSFAABXQVZFLAAAAAA=...",
"reference_text": "こんにちは、私の名前は田中です。",
"user_id": "test-user"
}' \
https://your-domain.com/api/pronunciation-assessment
curl -X POST \
-H "X-API-Key: your_api_key" \
-H "Content-Type: application/json" \
-d '{"text":"こんにちは、私の名前は田中です。", "voice_name":"ja-JP-NanamiNeural"}' \
--output speech.mp3 \
https://your-domain.com/api/text-to-speech
curl -X POST \
-H "X-API-Key: your_api_key" \
-H "Content-Type: application/json" \
-d '{"text":"こんにちは、初めまして。お願いします。", "user_id":"test-user"}' \
https://your-domain.com/api/intent-recognition
curl -X POST \
-H "X-API-Key: your_api_key" \
-H "Content-Type: application/json" \
-H "X-Audio-Format: base64" \
-d '{
"audio_base64": "UklGRiSFAABXQVZFLAAAAAA=...",
"user_id": "test-user"
}' \
https://your-domain.com/api/intent-recognition
- Node.js 14+
- Tài khoản Azure Speech Service
- Kết nối internet để sử dụng Azure Speech SDK
Sử dụng script test-api.js
để kiểm thử các API endpoints:
# Kiểm thử tất cả API
node test-api.js --all
# Kiểm thử từng API riêng biệt
node test-api.js --stt # Speech to Text
node test-api.js --pronunciation # Pronunciation Assessment
node test-api.js --pronunciation-base64 # Pronunciation Assessment với base64
node test-api.js --tts # Text to Speech
node test-api.js --intent # Intent Recognition
node test-api.js --realtime # Real-time Speech Recognition (WebSocket)