Mặc dù các từ tiếng Việt cũng như các lời chào và tạm biệt đã được thu âm sẵn trước khi tới tay người sử dụng, chương trình thông báo kết quả học tập vẫn kèm thêm một chương trình thu âm nhằm cho phép người dùng thu âm lại nếu cần. Ngoài chức năng thu, chương trình còn cho phép phát lại hoặc xóa bất cứ từ nào đã thu âm. Nếu một từ đã có mà ta thu lại thì từ cũ đã thu âm sẽ bị thay bằng từ mới vừa thu âm.
Để thu âm thì người dùng cần trang bị một micro loa nối vào soundcard.
Các chức năng của chương trình thu âm :
1. Thu :
- Các thông số cần cung cấp cho header hoàn toàn giống như đã nêu ở phần 2
- Để điều khiển soundcard dùng để thu âm, ta gọi hàm waveInOpen() với ID của thiết bị thu âm thanh sẽ được gán bằng hằng WAVE_MAPPER và chương trình sẽ tự động chọn thiết bị thu âm thanh phù hợp.
SVTH : Bùi Danh Đạt Trang 55
- Tiếp đó ta phải tạo ra vùng đệm để lưu trữ các mẫu âm thanh thu được. Vùng đệm này có kích thước tối đa được tính như sau :
BufferSize = MaxTime * Số mẫu trên 1giây * Số byte trên 1 mẫu
Với MaxTime được quy định là 90 giây. Khi thời gian thu đến 90 giây thì chương trình sẽ ngừng thu và ghi dữ liệu vừa thu vào file.
- Sau đó, dùng 2 hàm waveInPrepareHeader() và waveInAddBuffer() để nạp header chuẩn bị cho việc thu. Khi đã sẵn sàng, hàm waveInStart() sẽ bắt đầu công việc thu âm. Từ lúc này mọi âm thanh thu vào sẽ được lưu vào vùng đệm.
- Khi ngừng thu, chương trình sẽ kiểm tra từ được nhập vào đã có chưa, nếu có thì sẽ xóa phần dữ liệu tiếng nói cũ và ghi lại dữ liệu mới vào cuối file *.sam tương ứng, đồng thời cập nhật lại 2 giá trị FileOffset và DataSize trong bảng chỉ mục. Song song đó, chương trình cũng sẽ cập nhật lại FileOffset và DataSize của các từ trong nhóm mà có FileOffset > FileOffset của từ vừa cập nhật. Đó là vì khối dữ liệu tương ứng trong file *.sam đã bị xóa (khối dữ liệu mới được để ở cuối file) nên toàn bộ các khối dữ liệu phía dưới sẽ được đôn lên, dẫn đến FileOffset của các từ phía dưới thay đổi theo. Còn FileOffset của các từ phía trên không thay đổi Như thế các FileOffset của các từ phía dưới sẽ được cập nhật lại như sau:
FileOffset = FileOffset - DataSize của từ vừa xóa
Nếu từ này chưa có thì dữ liệu tiếng nói sẽ được ghi vào cuối file *.sam tương ứng , đồng thời thêm từ này và 3 giá trị FileOffset , DataSize và tên nhóm vào bảng chỉ mục. Tên nhóm sẽ là chữ cái cơ bản dựa vào ký tự đầu tiên của từ vừa thu.
- Tuy nhiên thường trước và sau khi khi thu âm sẽ có một khoảng im lặng. Khi phát ra một câu gồm nhiều từ ghép lại, nếu khoảng im lặng này quá lâu sẽ làm ngắt quãng câu nói. Do đó, trước khi ghi dữ liệu tiếng nói vào file *.sam , chương trình sẽ cắt bỏ những mẫu âm thanh nào có giá trị nằm trong khoảng 7Ah đến 86h.
2. Phát :
SVTH : Bùi Danh Đạt Trang 56
- Quá trình phát ở đây tương tự như quá trình phát qua điện thoại, chỉ khác ở chỗ thiết bị xuất âm thanh là soundcard. Lúc này ID của thiết bị phát âm thanh sẽ được gán bằng hằng WAVE_MAPPER và chương trình sẽ tự động chọn thiết bị phát âm thanh phù hợp.
3. Xóa :
- Trước tiên chương trình sẽ đọc 2 giá trị FileOffset và DataSize tương ứng với từ cần xóa. Dựa vào đó chương trình sẽ định vị được khối dữ liệu tiếng nói cần loại bỏ trong file *.sam tương ứng.
- Chương trình sẽ đọc lại 2 khối dữ liệu trước và sau khối dữ liệu cần cắt bỏ , sau đó ghi ra một file tạm, xóa file *.sam , sau đó đổi tên file tạm trở thành *.sam đó
- Lúc này trong bảng chỉ mục, FileOffset của các từ được thu trước đó không còn đúng so với file *.sam mới nữa. Vì vậy, ta phải tiến hành cập nhật lại những từ nào thuộc cùng nhóm với từ vừa xóa và FileOffset có lớn hơn FileOffset của từ vừa xóa, tương tự như trong phần thu một từ đã có.
4. Chèn khoảng im lặng :
- Có một số từ cần thêm một khoảng thời gian im lặng ở đầu hoặc cuối từ vừa thu . Vì vậy chương trình cung cấp thêm chức năng này
- Dựa vào thời gian im lặng đầu và cuối (theo mili giây) do người dùng nhập vào, chương trình sẽ tính toán kích thước dữ liệu mới như sau :
DataSize= DataSize + (TgDau+TgCuoi)/1000*11500 - Số mẫu âm thanh cần thêm vào đầu và cuối được tính :
SoMauDau = TgDau/1000*11500 SoMauCuoi = TgCuoi/1000*11500
- Tất cả các mẫu âm thanh được thêm vào sẽ được gán giá trị 80h.
- Bây giờ ta chỉ việc đọc khối dữ liệu tiếng nói cũ vào bộ nhớ, sau đó xóa khối dữ liệu này trong file *.sam, cuối cùng ghi lại vào cuối file này các mẫu im lặng đầu, khối dữ liệu tiếng nói cũ trong bộ nhớ và các mẫu im lặng cuối. đồng thời cập nhật lại 2 giá trị FileOffset và DataSize của từ đó vào bảng chỉ mục và FileOffset của các từ phía trước bị thay đổi.
SVTH : Bùi Danh Đạt Trang 57