Hướng dẫn trung cấp

Thêm văn bản thành lời nói

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Văn bản thành lời nói là một hình thức công nghệ hỗ trợ chuyển đổi chuỗi văn bản thành âm thanh lời nói bằng cách sử dụng giọng nói nhân tạo. Ngoài việc cải thiện khả năng tiếp cận của các trải nghiệm của bạn cho người chơi có khuyết tật về thị giác, vận động hoặc nhận thức, TTS cho phép bạn tạo ra âm thanh nói một cách động để bạn không cần phải ghi âm trước âm thanh cho tất cả các kịch bản câu chuyện có thể xảy ra.

Sử dụng tệp Gingerbread House - Start .rbxl làm điểm khởi đầu và Gingerbread House - Văn bản thành lời nói làm tài liệu tham khảo, hướng dẫn này cho bạn biết cách thêm cả âm thanh TTS cơ bản và TTS thông minh theo ngữ cảnh vào các trải nghiệm của bạn, bao gồm hướng dẫn về:

  • Kích hoạt TTS cho các tình huống chơi chung mà không bao giờ thay đổi, chẳng hạn như tương tác UI và hướng dẫn.
  • Cấu hình TTS để nó thích ứng với hành động của người chơi, trạng thái môi trường hoặc mục tiêu linh hoạt.

Nếu bạn gặp khó khăn trong quá trình, bạn có thể sử dụng Gingerbread House - Văn bản thành lời nói làm tài liệu tham khảo để so sánh tiến độ của bạn.

Đối tượng Âm thanh

Để tạo âm thanh TTS, điều quan trọng là hiểu các đối tượng âm thanh mà bạn sẽ làm việc trong suốt hướng dẫn này. Có năm loại chính của các đối tượng âm thanh cho TTS:

  • Đối tượng AudioTextToSpeech chuyển đổi các chuỗi văn bản thành âm thanh lời nói.
  • Đối tượng AudioEmitter là một loa ảo phát âm thanh vào môi trường 3D.
  • Đối tượng AudioListener là một micro ảo thu âm thanh từ môi trường 3D.
  • Đối tượng AudioDeviceOutput là một thiết bị phần cứng vật lý trong thế giới thực, chẳng hạn như loa hoặc tai nghe.
  • Wires mang các luồng âm thanh từ một đối tượng này sang đối tượng khác.

Tất cả các đối tượng âm thanh này làm việc cùng nhau để phát ra âm thanh TTS phản ứng lại với hành động của người chơi. Hãy xem cách thức này hoạt động thực tế với ví dụ một người chơi đeo tai nghe trong khi chơi trải nghiệm trên máy tính xách tay của họ:

  • Đối tượng AudioTextToSpeech tải và chuyển đổi văn bản thành âm thanh bất cứ khi nào một người chơi chạm vào một phần gần một nhân vật không thể chơi (NPC).
  • Đối tượng AudioEmitter phát ra một luồng âm thanh TTS từ NPC vào môi trường 3D.
  • Một đối tượng Wire mang luồng từ AudioTextToSpeech đến AudioEmitter để luồng âm thanh phát ra từ NPC.
  • Đối tượng AudioListener của nhân vật lắng nghe âm thanh đó trong môi trường 3D và đưa lại âm thanh cho tai nghe của họ.
  • Đối tượng AudioDeviceOutput mang âm thanh từ AudioListener đến loa vật lý của người chơi, hoặc trong trường hợp này, tai nghe của họ.

Các phần tiếp theo sẽ đi sâu hơn và tham chiếu đến các đối tượng này khi bạn học cách phát âm thanh cơ bản và âm thanh thông minh theo ngữ cảnh. Khi bạn xem xét các đối tượng này với các kỹ thuật sắp tới, bạn có thể dự đoán chính xác hơn cách để ghi lại và truyền âm thanh từ trải nghiệm đến người chơi.

TTS Cơ bản

TTS cơ bản là hình thức văn bản thành lời nói phổ biến nhất mà giọng nói nhân tạo đọc một chuỗi văn bản bất kể ngữ cảnh của người chơi hay môi trường. Điều này có nghĩa là bất cứ khi nào người chơi kích hoạt âm thanh TTS, các từ và cách mà giọng nói nhân tạo đọc các từ sẽ giữ nguyên không đổi bất kể trạng thái của người chơi, hành động của họ, hoặc tình trạng môi trường.

Hình thức TTS này hữu ích trong hầu hết các tình huống chơi trò chơi, chẳng hạn như người chơi tương tác với các menu UI, hướng dẫn, hoặc các tương tác NPC thường xuyên như đề nghị của người bán hoặc tiếng kêu của kẻ thù. Roblox cung cấp các loại giọng nói sau mà bạn có thể thử nghiệm cho bất kỳ tương tác nào trong số này:

VoiceIDMô tả giọng nóiVí dụ âm thanh
1Nam Anh
2Nữ Anh
3Nam Mỹ #1
4Nữ Mỹ #1
5Nam Mỹ #2
6Nữ Mỹ #2
7Nam Úc
8Nữ Úc
9Giọng cổ điển #1
10Giọng cổ điển #2
11Giọng người dẫn
101Nam Tây Ban Nha
102Nữ Tây Ban Nha
201Nam Đức
202Nữ Đức
301Nam Ý
302Nữ Ý
401Nam Pháp
402Nữ Pháp

Để tạo lại âm thanh TTS 3D cơ bản trong ví dụ Gingerbread House - Văn bản thành lời nói:

  1. Bật một bộ lắng nghe mặc định gắn với nhân vật người chơi của bạn.
    1. Trong cửa sổ Explorer, chọn SoundService.
    2. Trong cửa sổ Properties, đặt DefaultListenerLocation thành Character. Khi bạn chạy trải nghiệm, động cơ tự động:
      • Tạo một AudioListener dưới Humanoid.RootPart của mỗi nhân vật người chơi để bạn có thể nghe âm thanh thay đổi trong loa thế giới thực của bạn theo vị trí và quy mô của các nguồn âm thanh trong trải nghiệm.
      • Tạo một AudioDeviceOutput dưới SoundService.
  2. Trong cửa sổ Explorer, điều hướng đến WorkspaceDialogueVolume, sau đó:
    1. Chèn một đối tượng AudioTextToSpeech để tạo một trình phát âm thanh cho âm thanh xung quanh người tuyết.
    2. Chèn một đối tượng AudioEmitter để phát ra một luồng một vị trí từ DialogueVolume.
    3. Chèn một đối tượng Wire để mang luồng từ bộ phát âm thanh đến bộ phát âm thanh.
  3. Chọn đối tượng AudioTextToSpeech, sau đó trong cửa sổ Properties:
    1. Đặt Text thành "Thu thập từng cái gumpdrop cuối cùng để mở cửa nhà tôi!"
    2. Đặt VoiceId thành 2 để đặt giọng nói nhân tạo giống như một nữ người Anh.
    3. Đặt Volume thành 3 để phát âm thanh ở mức âm lượng cao để bạn nghe thấy âm thanh TTS trên các nguồn âm thanh khác trong trải nghiệm.
  4. Chọn Wire, sau đó trong cửa sổ Properties:
    1. Đặt SourceInstance thành AudioTextToSpeech mới của bạn để chỉ định rằng bạn muốn dây mang âm thanh từ bộ phát âm thanh cụ thể này.
    2. Đặt TargetInstance thành AudioEmitter mới của bạn để chỉ định rằng bạn muốn dây mang âm thanh đến bộ phát âm thanh cụ thể này trong thể tích.
  5. Quay lại cửa sổ Explorer, điều hướng đến StarterPlayerStarterCharacterScripts, sau đó chèn một LocalScript, đổi tên thành PlayBasicTTSAudioWhenInVolume, và dán mã sau vào tập lệnh cục bộ:

local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local humanoid = script.Parent:WaitForChild("Humanoid")
local volumeDetector = Workspace.DialogueVolume
local trigger = humanoid:WaitForChild("Animator")
local debounce = false
local localPlayer = Players.LocalPlayer
volumeDetector.Touched:Connect(function(hit)
if debounce then
return
end
local hitCharacter = hit:FindFirstAncestorWhichIsA("Model")
local hitPlayer = Players:GetPlayerFromCharacter(hitCharacter)
if hitPlayer ~= localPlayer then
return
end
debounce = true
local audioTextToSpeech = Workspace.DialogueVolume.AudioTextToSpeech
audioTextToSpeech:Play()
audioTextToSpeech.Ended:Wait()
debounce = false
end)

Tập lệnh này bắt đầu bằng cách lấy các dịch vụ WorkspacePlayers để có thể tham chiếu trẻ em và chức năng của chúng. Đối với mỗi nhân vật người chơi được tải hoặc phục hồi trở lại trong trải nghiệm, tập lệnh sẽ chờ:

  • Các đối tượng HumanoidAnimator của nhân vật.
  • Đối tượng thể tích trong khu vực làm việc có tên là DialogueVolume.

Khi bất kỳ điều gì va chạm với thể tích, hàm xử lý sự kiện Touched sẽ lấy tổ tiên đầu tiên là một Model, mà nên là nhân vật nếu BasePart va chạm với thể tích là một phần tử con của một mô hình nhân vật. Nếu là như vậy, hàm sẽ sau đó:

  • Đặt debounce thành true.
  • Phát và chờ cho âm thanh TTS kết thúc.
  • Đặt debounce trở lại thành false.

Đặt debounce từ false thành true rồi trở về false một lần nữa sau khi âm thanh TTS cơ bản hoàn tất phát là một mẫu debounce ngăn âm thanh bị kích hoạt lặp lại khi người chơi liên tục va chạm với thể tích. Để biết thêm thông tin về mẫu debounce này, hãy xem Debounce - Phát hiện va chạm.

  1. Chạy thử trải nghiệm để nghe các hội thoại hướng dẫn khi nhân vật người chơi của bạn chạm vào thể tích xung quanh người tuyết.

Bạn có thể thử nghiệm thêm với âm thanh này bằng cách thay đổi các thuộc tính Text, VoiceID, Pitch, và Speed thành các giá trị mới. Âm thanh phát ra trở nên hoàn toàn khác mà không cần phải ghi âm và tải một tệp âm thanh mới cho mỗi kịch bản.

TTS Thông minh theo ngữ cảnh

TTS thông minh theo ngữ cảnh là hình thức văn bản thành lời nói tiên tiến hơn, trong đó giọng nói nhân tạo đọc một chuỗi văn bản liên quan đến người chơi, trạng thái môi trường của họ hoặc tình trạng trò chơi. Điều này có nghĩa là bất cứ khi nào người chơi kích hoạt âm thanh TTS, các từ và cách mà giọng nói nhân tạo đọc các từ sẽ điều chỉnh theo tương ứng.

Hình thức TTS này hữu ích cho các tình huống chơi trò chơi đang thay đổi liên tục, chẳng hạn như đánh dấu âm thanh hướng, trạng thái mục tiêu hoặc tương tác NPC độc đáo. Do đó, vì TTS thông minh theo ngữ cảnh cần phải biến đổi để chính xác, bạn phải cấu hình các yếu tố của trò chơi để bạn có thể theo dõi trạng thái của chúng khi người chơi điều hướng qua môi trường và hoàn thành các mục tiêu trò chơi.

Trong khi có nhiều cách để hoàn thành nhiệm vụ này, mẫu này sử dụng các thuộc tính tùy chỉnh để theo dõi màu sắcvị trí của mỗi chiếc gumpdrop mà người chơi cần thu thập để vào ngôi nhà bánh gừng. Để biết thêm thông tin về thuộc tính, hãy xem Thuộc tính và thuộc tính.


Mỗi đối tượng gumpdrop có các thuộc tính mô tả màu sắc và vị trí của chúng trong môi trường.
Hình ảnh cận cảnh của gumpdrop màu vàng
Hình ảnh cận cảnh của gumpdrop màu xanh
Hình ảnh cận cảnh của gumpdrop màu đỏ

Để tạo lại âm thanh TTS 3D thông minh theo ngữ cảnh trong mẫu Gingerbread House - Văn bản thành lời nói:

  1. Trong cửa sổ Explorer, điều hướng đến WorkspaceGumDrops.

  2. Cấu hình ba thuộc tính tùy chỉnh để theo dõi gumpdrop màu vàng.

    1. Chọn gumpdrop màu vàng, sau đó trong cửa sổ Properties, điều hướng đến phần Attributes, rồi nhấp vào biểu tượng cộng. Một hộp thoại pop-up hiển thị.
    2. Trong trường Name, nhập ColorDescription.
    3. Trong menu thả xuống Type, chọn string.
    4. Nhấp vào nút Save.
    5. Đặt thuộc tính ColorDescription mới thành vàng.
    6. Sử dụng quá trình này, tạo hai thuộc tính khác với các giá trị sau.
    TênLoạiGiá trị
    HintOrdersố0
    LocationDescriptionstringbên thác nước
  3. Cấu hình ba thuộc tính tùy chỉnh để theo dõi gumpdrop màu xanh.

    1. Trong cửa sổ Explorer, chọn gumpdrop màu xanh.
    2. Trong cửa sổ Properties, tạo ba thuộc tính với các giá trị sau.
    TênLoạiGiá trị
    ColorDescriptionstringxanh
    HintOrdersố1
    LocationDescriptionstringtrên mỏm đá
  4. Cấu hình ba thuộc tính tùy chỉnh để theo dõi gumpdrop màu đỏ.

    1. Trong cửa sổ Explorer, chọn gumpdrop màu đỏ.
    2. Trong cửa sổ Properties, tạo ba thuộc tính với các giá trị sau.
    TênLoạiGiá trị
    ColorDescriptionstringđỏ
    HintOrdersố2
    LocationDescriptionstringđằng sau hàng rào
  5. Trong cửa sổ Explorer, điều hướng đến WorkspaceHintVolume, sau đó:

    1. Chèn một đối tượng AudioTextToSpeech để tạo một trình phát âm thanh cho âm thanh xung quanh tuần lộc.
    2. Chèn một đối tượng AudioEmitter để phát ra một luồng một vị trí từ HintVolume.
    3. Chèn một đối tượng Wire để mang luồng từ bộ phát âm thanh đến bộ phát âm thanh.
  6. Chọn Wire, sau đó trong cửa sổ Properties:

    1. Đặt SourceInstance thành AudioTextToSpeech mới của bạn để chỉ định rằng bạn muốn dây mang âm thanh từ bộ phát âm thanh cụ thể này.
    2. Đặt TargetInstance thành AudioEmitter mới của bạn để chỉ định rằng bạn muốn dây mang âm thanh đến bộ phát âm thanh cụ thể này trong thể tích.
  7. Quay lại cửa sổ Explorer, điều hướng đến StarterPlayerStarterCharacterScripts, sau đó chèn một LocalScript, đổi tên thành PlayContextTTSAudioWhenInVolume, và dán mã sau vào tập lệnh cục bộ:


local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local humanoid = script.Parent:WaitForChild("Humanoid")
local volumeDetector = Workspace.HintVolume
local trigger = humanoid:WaitForChild("Animator")
local debounce = false
local localPlayer = Players.LocalPlayer
function getRemainingGumdrops(): {Part}
local gumdropsFolder = Workspace.Gumdrops
local gumdrops = gumdropsFolder:GetChildren()
local remainingGumdrops = {};
for _, gumdrop in gumdrops do
if gumdrop:GetAttribute("Active") then
remainingGumdrops[#remainingGumdrops + 1] = gumdrop
end
end
table.sort(remainingGumdrops, function(a, b)
return a:GetAttribute("HintOrder") < b:GetAttribute("HintOrder")
end)
return remainingGumdrops
end
function getReindeerHint(remainingGumdrops: {Part}): string
local remainingGumdrops = getRemainingGumdrops()
if (#remainingGumdrops == 0) then
return "Không còn gumpdrops nào. Kiểm tra bên trong ngôi nhà."
end
local nextGumdrop = remainingGumdrops[1]
local colorDescription = nextGumdrop:GetAttribute("ColorDescription")
local locationDescription = nextGumdrop:GetAttribute("LocationDescription")
local message = #remainingGumdrops > 1
and "Còn " .. #remainingGumdrops .. " gumpdrops. Tìm chiếc " .. colorDescription .. " ở " .. locationDescription .. "."
or "Còn một gumpdrop. Nó " .. colorDescription .. " và nó ở " .. locationDescription .. "."
return message
end
volumeDetector.Touched:Connect(function(hit)
if debounce then
return
end
local hitCharacter = hit:FindFirstAncestorWhichIsA("Model")
local hitPlayer = Players:GetPlayerFromCharacter(hitCharacter)
if hitPlayer ~= localPlayer then
return
end
print("Người chơi đã chạm vào thể tích.")
debounce = true
local remainingGumdrops = getRemainingGumdrops()
local message = getReindeerHint(remainingGumdrops)
local audioTextToSpeech = Workspace.HintVolume.AudioTextToSpeech
audioTextToSpeech.Text = message
audioTextToSpeech:Play()
audioTextToSpeech.Ended:Wait()
debounce = false
end)

Tập lệnh này bắt đầu bằng cách lấy các dịch vụ WorkspacePlayers để có thể tham chiếu trẻ em và chức năng của chúng. Đối với mỗi nhân vật người chơi được tải hoặc phục hồi trở lại trong trải nghiệm, tập lệnh sẽ chờ:

  • Các đối tượng HumanoidAnimator của nhân vật.
  • Đối tượng thể tích trong khu vực làm việc có tên là HintVolume.

Hàm getRemainingGumdrops() của tập lệnh trả về một danh sách các đối tượng gumpdrop Part trong thư mục Gumdrops và lọc ra bất kỳ phần nào mà người chơi đã thu thập. Các gumpdrop còn lại được sắp xếp theo thứ tự cụ thể theo thuộc tính HintOrder của từng gumpdrop.

Hàm getReindeerHint(remainingGumdrops) của tập lệnh lấy danh sách đó từ getRemainingGumdrops() và trả về một thông điệp chuỗi mô tả nơi người chơi có thể tìm bất kỳ gumpdrops còn lại nào, bao gồm cả mô tả màu sắc và vị trí của gumpdrop tiếp theo mà người chơi cần thu thập. Tuy nhiên, nếu người chơi đã thu thập tất cả các gumpdrops trong môi trường, thông điệp chuỗi mô tả nơi để đi tiếp theo sau khi họ đã thu thập tất cả các gumpdrops trong môi trường.

Khi bất cứ điều gì va chạm với thể tích, hàm xử lý sự kiện Touched sẽ lấy tổ tiên đầu tiên là một Model, mà nên là nhân vật nếu BasePart va chạm với thể tích là một phần tử con của một mô hình nhân vật. Nếu là như vậy, hàm sẽ sau đó:

  • Đặt debounce thành true.
  • Lấy danh sách các gumpdrops còn lại và thông điệp chuỗi mô tả gumpdrop tiếp theo mà người chơi cần tìm.
  • Chuyển đổi chuỗi thành âm thanh bằng cách sử dụng đối tượng AudioTextToSpeech, phát âm thanh và chờ cho âm thanh kết thúc.
  • Đặt debounce trở lại thành false.

Đặt debounce từ false thành true rồi trở về false một lần nữa sau khi âm thanh TTS thông minh theo ngữ cảnh hoàn tất phát là một mẫu debounce ngăn âm thanh bị kích hoạt lặp lại khi người chơi liên tục va chạm với thể tích. Để biết thêm thông tin về mẫu debounce này, hãy xem Debounce - Phát hiện va chạm.

  1. Chạy thử trải nghiệm để nghe những gợi ý theo ngữ cảnh khi nhân vật người chơi của bạn chạm vào thể tích xung quanh tuần lộc. Âm thanh TTS thay đổi theo số lượng và màu sắc của các gumpdrop mà nhân vật người chơi đã tìm thấy trong môi trường.

©2026 Roblox Corporation. Roblox, logo Roblox và Powering Imagination là các nhãn hiệu đã đăng ký và chưa đăng ký của chúng tôi tại Hoa Kỳ và các quốc gia khác.