Nhiệm vụ: Thêm tính năng lựa chọn và trình tạo nhân vật giọng nói
Thêm tính năng lựa chọn và trình tạo nhân vật giọng nói
Tạo các nhân vật giọng nói trong trò chơi với các cài đặt tốc độ và cao độ khác nhau để trẻ có thể chọn tùy chọn thoải mái, đồng thời thêm trình tạo nhân vật tùy chỉnh.
Mục tiêu
Thêm hệ thống nhân vật giọng nói (characters) vào ứng dụng, qua đó trẻ có thể chọn phong cách lồng tiếng phù hợp theo cách trò chơi hóa.
Lý do chính: trẻ em khác nhau có thể cảm thấy thoải mái hơn với tốc độ nói và cao độ giọng khác nhau. Thay vì các cài đặt kỹ thuật rate / pitch, hãy cung cấp lựa chọn thông qua các nhân vật dễ hiểu.
Ý tưởng cơ bản
Mỗi nhân vật lưu trữ một tập hợp các cài đặt cho SpeechSynthesisUtterance:
type VoiceCharacter = {
id: string
name: string
rate: number
pitch: number
volume?: number
voiceName?: string
avatar?: string
}
Ví dụ:
const characters: VoiceCharacter[] = [
{
id: 'calm-bear',
name: 'Gấu con',
rate: 0.75,
pitch: 0.85,
},
{
id: 'default-friend',
name: 'Bạn bè',
rate: 1,
pitch: 1,
},
{
id: 'fast-bird',
name: 'Chim nhỏ',
rate: 1.15,
pitch: 1.35,
},
]
Cách sử dụng:
const utterance = new SpeechSynthesisUtterance(text)
utterance.lang = 'ru-RU'
utterance.rate = character.rate
utterance.pitch = character.pitch
utterance.volume = character.volume ?? 1
Lựa chọn nhân vật
Cần có một giao diện người dùng lựa chọn nhân vật riêng biệt:
- thẻ có tên và hình ảnh trực quan;
- nút nghe thử;
- nhân vật đang hoạt động/được chọn;
- lưu lựa chọn cho các bài tập tiếp theo;
- khả năng chuyển đổi nhanh chóng sang nhân vật khác.
Lý tưởng nhất là lựa chọn này mang lại cảm giác giống như một cài đặt trò chơi hơn là một cấu hình âm thanh hệ thống.
Trình tạo nhân vật
Cung cấp ngay một trình tạo riêng biệt nơi bạn có thể tạo nhân vật của riêng mình.
Các tham số tối thiểu:
- tên;
rate— tốc độ nói;pitch— cao độ giọng nói;volumenếu cần;- lựa chọn một trong các giọng đọc hệ thống có sẵn;
- hình ảnh trực quan/ảnh đại diện;
- nghe thử trên một câu kiểm tra.
Ví dụ về trạng thái trình tạo:
type VoiceCharacterDraft = {
name: string
rate: number
pitch: number
volume: number
voiceName?: string
avatar?: string
}
Khoảng cài đặt
Không hiển thị các giá trị kỹ thuật cho trẻ như giao diện chính. Bên trong có thể sử dụng các phạm vi số của Web Speech API, nhưng giao diện người dùng nên được làm cho dễ hiểu:
Tốc độ:
chậm ←─────●─────→ nhanh
Cao độ:
thấp ←─────●─────→ cao
Đối với người lớn/biên tập viên, các giá trị chính xác có thể được hiển thị bổ sung.
Nghe thử
Trình tạo phải có nút nghe thử:
const previewCharacter = (
character: VoiceCharacterDraft,
text = 'Xin chào! Hãy cùng học nhé.',
) => {
window.speechSynthesis.cancel()
const utterance = new SpeechSynthesisUtterance(text)
utterance.lang = 'ru-RU'
utterance.rate = character.rate
utterance.pitch = character.pitch
utterance.volume = character.volume
const voice = window.speechSynthesis
.getVoices()
.find(item => item.name === character.voiceName)
if (voice) {
utterance.voice = voice
}
window.speechSynthesis.speak(utterance)
}
Kiến trúc
Điều quan trọng là tách biệt nhân vật khỏi chính cơ chế lồng tiếng.
VoiceCharacter
↓
cài đặt giọng nói
↓
SpeechPlayer / Pronouncer
↓
SpeechSynthesisUtterance
Nghĩa là SpeechPlayer không được biết về một "Gấu con" hay "Chim nhỏ" cụ thể nào. Nó nhận các tham số đã được chuẩn bị sẵn.
Lưu trữ
Cần chuẩn bị:
- các nhân vật tích hợp sẵn trong ứng dụng;
- các nhân vật do người dùng tạo;
- nhân vật đang được chọn hoạt động;
- lưu lựa chọn của người dùng giữa các phiên làm việc.
Chọn kho lưu trữ cụ thể trong phạm vi kiến trúc dự án: trạng thái cục bộ, localStorage hoặc thực thể máy chủ nếu các nhân vật cần được đồng bộ hóa giữa các thiết bị.
Tiêu chí hoàn thành
Trẻ có thể chọn một trong các nhân vật giọng nói có sẵn, nghe sự khác biệt về tốc độ/cao độ nói, sử dụng nhân vật đó để lồng tiếng tiếp theo, đồng thời tạo nhân vật của riêng mình thông qua một trình tạo đơn giản và nghe ngay kết quả.