MỞ ĐẦU 1 Lý do chọn đề tài Ngày nay với sự phát triển mạnh mẽ và toàn diện của công nghệ thông tin nói chung, thì các thiết bị thông minh sử dụng hệ điều hành Android cũng ngày càng phá
Trang 1XỬ LÝ ÂM THANH TRONG ANDROID OS
LUẬN VĂN THẠC SĨ KỸ THUẬT
KỸ THUẬT MÁY TÍNH VÀ TRUYỀN THÔNG
Trang 2BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
-
Hoàng Đức Tuấn
XỬ LÝ ÂM THANH TRONG ANDROID OS
Chuyên ng ành : Kỹ thuật máy tính và truyền thông
LUẬN VĂN THẠC SĨ KỸ THUẬT
KỸ THUẬT MÁY TÍNH VÀ TRUYỀN THÔNG
NGƯỜI HƯỚNG DẪN KHOA HỌC
TS NGUYỄN KIM KHÁNH
Hà Nội – 2013
Trang 3LỜI CẢM ƠN
Để hoàn thành luận văn này, tôi xin gửi lời cảm ơn chân thành nhất tới tập thể các
th ầy giáo, cô giáo trường Đại học Bách Khoa Hà Nội, viện Công nghệ thông tin và Truy ền thông đã đào tạo cho tôi những kiến thức, những kinh nghiệm qúy báu trong suốt
th ời gian học tập và rèn luyện
Xin g ửi lời cảm ơn tới thầy giáo, Ts Nguyễn Kim Khánh - Giảng viên bộ môn Kĩ thu ật máy tính, viện Công nghệ thông tin và Truyền thông, trường Đại học Bách Khoa
Hà N ội đã tận tình hướng dẫn tôi trong quá trình làm luận văn
Cu ối cùng là lời cảm ơn chân thành nhất tới gia đình, bạn bè, đồng nghiệp đã động viên, góp ý và t ạo mọi điều kiên tốt nhất để tôi có thể hoàn thành luận văn này
Tuy nhiên, do th ời gian và trình độ có hạn nên luận văn chắc chắn không tránh khỏi
nh ững thiếu sót, tôi rất mong được sự đóng góp ý kiến của các thầy, các cô và toàn thể các b ạn Xin chân thành cảm ơn
Hà N ội ngày 10 tháng 03 năm 2013 Tác gi ả
Hoàng Đức Tuấn
Trang 4MỤC LỤC
LỜI CẢM ƠN 1
MỤC LỤC 2
LỜI CAM ĐOAN 4
DANH MỤC TỪ VIẾT TẮT, THUẬT NGỮ 5
DANH MỤC HÌNH VẼ 6
MỞ ĐẦU 7
1 Lý do chọn đề tài 7
2 Lịch sử nghiên cứu 7
3 Mục đích, đối tượng và phạm vi nghiên cứu 7
4 Tóm tắt các luận điểm cơ bản và đóng góp của luận văn 8
5 Phương pháp nghiên cứu 8
NỘI DUNG 9
CHƯƠNG1 TỔNG QUAN VỀ ANDROID VÀ MODULE XỬ LÝ ÂM THANH TRONG ANDROID 9
1.1 Tổng quan hệ điều hành Android 9
1.1.1 Tìm hiểu về Android OS 9
1.1.2 Kiến trúc Android OS 13
1.1.3 Tổng quan về một ứng dụng Android 15
1.1.4 Chu kì của một ứng dụng Android 15
1.2 Module xử lý âm thanh trong Android 17
1.2.1 Tổng quan về OpenCore MutilMedia Framework 17
1.2.2 OpenCore xử lý âm thanh và tiếng nói trong Android 20
CHƯƠNG 2 XỬ LÝ ÂM THANH VÀ TIẾNG NÓI TRONG ANDROID 25
2.1 Các tiến trình xử lý âm thanh và tiếng nói trong Android 25
2.2 Quản lý và nâng cao xử lý âm thanh, tiếng nói trong Adroid 29
CHƯƠNG 3 XÂY DỰNG CHƯƠNG TRÌNH NHẬN DẠNG TIẾNG NÓI TRÊN ANDROID 35
3.1 Cơ sở lý thuyết và công nghệ áp dụng 35
3.1.1 Tổng quan về nhận dạng tiếng nói 35
3.1.2 Phát hiện tiếng nói và tiền xử lý trích chọn đặc trưng 35
Trang 53.1.3 Lượng tử vector 41
3.1.4 Mô hình Markov ẩn trong nhận dạng tiếng nói 46
3.1.5 Các loại HMM 51
3.2 Xây dựng chương trình nhận dạng tiếng nói 54
3.2.1.Lưu trữ âm thanh vào file pcm và file wav 54
3.2.2 Lấy dữ liệu âm thanh từ micro và phát hiện từ 59
3.2.3 Khối trích chọn đặc trưng MFCC 62
3.2.4 Tổ chức hệ thống nhận dạng 63
3.2.5.Lưu trữ vào load dữ liệu trong cơ sở dữ liệu SQLite 67
4.1 Các kết quả đạt được 71
4.2 Đánh giá và định hướng 72
KẾT LUẬN 74
Tài liệu tham khảo 75
Trang 6LỜI CAM ĐOAN
Tôi xin cam đoan đề tài nghiên cứu của tôi hoàn toàn do tôi tự làm dưới sự hướng
dẫn của thầy giáo Ts Nguyễn Kim Khánh, Viện công nghệ thông tin và truyền thông-Đại
học Bách Khoa Hà Nội Những kết quả nghiên cứu, thử nghiệm được thực hiện trên các
thiết bị thử nghiệm Các số liệu, kết quả trình bày trong luận văn là hoàn toàn trung thực
và chưa từng được công bố trong bất cứ công trình nào
Các tài liệu tham khảo sử dụng trong luận văn đều được dẫn nguồn (có bảng thống
kê các tài liệu tham khảo) hoặc được sự đồng ý trực tiếp của tác giả
Nếu xảy ra bất cứ điều không đúng như những lời cam đoan trên, tôi xin chịu hoàn
toàn trách nhiệm trước Viện và Nhà trường
Hà N ội, ngày 10 tháng 03năm 2013 Tác gi ả
Hoàng Đức Tuấn
Trang 7DANH MỤC TỪ VIẾT TẮT, THUẬT NGỮ
S ố thứ tự Từ viết tắt Ý nghĩa
1 OS Operating System (hệ điều hành)
3 API Application Programming Interface
4 Android OS Hệ điều hành Android
5 Packet Đơn vị đóng gói các dữ liệu để truyền đi
6 OHA Open Handset Alliance
8 MFCC Mel-frequency cepstral coefficients
9 FTT Fast Fourier Tranform
10 DFT Discrete Fourier Tranform
11 DCT Discrete Cosin Tranform
14 PCM Pulse Code Modulation
17 LPC Linear Predict Code
18 ANN Artificial Neural Network
Trang 8DANH MỤC HÌNH VẼ
Hình 1 Giới thiệu hệ điều hành Android 9
Hình 2 Kiến trúc Android OS 13
Hình 3 Sơ đồ trạng thái Activity 16
Hình 4 Sơ đồ tổng quan OpenCore Multimedia Framework 19
Hình 5 OpenCore mã hóa âm thanh cho Android 20
Hình 6 Mô hình thiết kế OpenCore mã hóa âm thanh cho Android 21
Hình 7 Kết quả hiệu năng mã hóa âm thanh trên bộ xử lý AMR9E 23
Hình 8 Sơ đồ các trạng thái trong tiến trình lưu trữ âm thanh Android 25
Hình 9 Sơ đồ các trạng thái tiến trình phát âm thanh Android 27
Hình 10 Quá trình tính toán các hệ số MFCC 38
Hình 11 Sơ đồ chi tiết tính toán các hệ số MFCC 38
Hình 12 Các băng lọc tam giác theo tần số Mel 40
Hình 13 Sơ đồ khối cấu trúc VQ huấn luyện và phân lớp 43
Hình 14 Lưu đồ giải thuật LBG 44
Hình 15 Lưu đồ giải thuật Binary Split 46
Hình 16 Minh họa mô hình Markov 47
Hình 17 Mô hình có thể tính toán kết quả của thí nghiệm thả đồng xu 49
Hình 18 Minh họa 3 kiểu HMM 52
Hình 19 Mô hình Bakis 6 trạng thái 53
Hình 20 Minh họa ghi âm thanh 56
Hình 21 Chuyển đổi dạng pcm sang wav 57
Hình 22 Quá trình xử lý âm thanh từ micro 59
Hình 23 Giải thuật phát hiện điểm đầu cuối của từ phát âm 61
Hình 24 Bộ đệm vòng để lưu dữ liệu âm thanh từ micro 62
Hình 25 Huấn luyện ban đầu cho chương trình nhận dạng tiếng nói 66
Hình 26 Huấn luyện bổ sung từ cho chương trình nhận dạng tiếng nói 67
Hình 27 Bảng lưu trữ các đặc trưng MFCC trong cơ sở dữ liệu 68
Hình 28 Bảng lưu trữ các HMM đã được huấn luyện 70
Hình 29 Bảng Cluster- lưu các cụm có được nhờ clustering 70
Hình 30 Một số hình ảnh của chương trình nhận dạng 72
Trang 9MỞ ĐẦU
1 Lý do chọn đề tài
Ngày nay với sự phát triển mạnh mẽ và toàn diện của công nghệ thông tin nói chung, thì các thiết bị thông minh sử dụng hệ điều hành Android cũng ngày càng phát triển.Bên
cạnh đó là sự cạnh tranh không ngừng của các nhà sản xuất thiết bị phần cứng cũng như
phần mềm nhằm đưa ra những sản phẩm tối ưu và tiện ích nhất Dựa trên những xu thế
đó, kết hợp công nghệ xử lý âm thanh trên Android và lý thuyết xử lý tiếng nói, luận văn
đã nghiên cứu và xây dựng những ứng dụng về xử lý âm thanh và tiếng nói trên hệ điều hành Android, giúp người dùng đặc biệt là người Việt có thể tương tác với các thiết bị thông minh theo cách tiện lợi và thân thiện nhất
2 Lịch sử nghiên cứu
Luận văn được thực hiện dưới sự hướng dẫn của thầy giáo Ts Nguyễn Kim Khánh,
Viện Công nghệ thông và Truyền thông-Đại học Bách Khoa Hà Nội.Luận văn được phát triển trên nền tảng các nghiên cứu của tác giả về hệ điều hành Android từ đồ án tốt nghiệp đại học tại trường Đại học Bách Khoa Hà Nội tháng 6 năm 2011.Trong quá trình nghiên cứu được hướng dẫn, xem xét điều chỉnh, báo cáo theo lịch đều đặn 2 tuần/ lần
với giáo viên hướng dẫn.Luận văn được bắt đầu nghiên cứu từ tháng 10/2012 và hoàn thành vào tháng 03/2013
3 Mục đích, đối tượng và phạm vi nghiên cứu
Mục đích của luận văn là tìm hiểu kiến trúc hệ điều hành Android, chu kì ứng dụng trong Android,module xử lý âm thanh trong Android: OpenCore MultiMedia Framework
xử lý âm thanh,tìm hiểu các tiến trình xử lý, quản lý và nâng cao xử lý âm thanh trong Android.Nghiên cứu công nghệ nhận dạng tiếng nói và mô hình nhận dạng tiếng nói từ
đó xây dựng chương trình nhận dạng tiếng nói trên hệ điều hành Android,triển khai, đánh giá và nghiệm thu trên các thiết bị di động chạy Android
Đối tượng, phạm vi nghiên cứu của luận văn là hệ điều hành Android và các phương pháp xử lý tiếng nói
Trang 104 Tóm tắt các luận điểm cơ bản và đóng góp của luận văn
Mục tiêu chính của luận văn là nghiên cứu xử lý âm thanh và tiếng nói trên hệ điều hành Android, nghiên cứu lý thuyết xử lý tín hiệu tiếng nói, từ đó xây dựng chương trình nhận dạng tiếng Việt trên các điện thoại Android phục vụ cho nhiều mục đích về xử
lý âm thanh và tiếng nói trên di động
Nội dung chính của luận văn này gồm:
Chương I: Tổng quan về Android và module xử lý âm thanh trên Android Chương
này tập trung đề cập đến nền tảng công nghệ phát triển ứng dụng cho luận văn:
- Giới thiệu môi trường lập trình ứng dụng cho Android
- Tìm hiểu module xử lý âm thanh trên hệ điều hành Android
Chương II: Xử lý âm thanh và tiếng nói trong Android Chương này tập trung tìm hiểu
các tiến trình xử lý âm thanh trên android đồng thời quản lý và nâng cao xử lý âm thanh trên Android
- Tìm hiểu các tiến trình xử lý âm thanh và tiếng nói trên android
- Nghiên cứu quản lý và nâng cao xử lý âm thanh trên Ándroid
Chương III: Xây dựng chương trình nhận dạng tiếng nói trên Android
- Nghiên cứu các lý thuyết cơ bản xử lý tiếng nói
- Xây dựng các giải thuật, cài đặt chương trình để phát triển ứng dụng nhận dạng tiếng nói trên Android
Chương IV: Kết quả và đánh giá.Chương này tập trung vào đánh giá kết quả đạt được,
đưa ra phương hướng phát triển cho hệ thống sau luận văn và kết luận
5 Phương pháp nghiên cứu
- Luận văn được phát triển từ các nghiên cứu của tác giả về hệ điều hành Android từ đồ
Trang 11NỘI DUNG
CHƯƠNG1 TỔNG QUAN VỀ ANDROID VÀ MODULE XỬ LÝ
ÂM THANH TRONG ANDROID
1.1 Tổng quan hệ điều hành Android
1.1.1 Tìm hiểu về Android OS
• Gi ới thiệu chung
- Android là hệ thống phần mềm được thiết kế theo kiểu ngăn xếp (stack) dành cho các thiết bị di động trong đó bao gồm một hệ điều hành, chương trình trung gian (middleware) và các ứng dụng quan trọng Google đã mua lại nhà phát triển ban đầu
của Android là công ty Android vào năm 2005 Hệ điều hành di động của Android
dựa trên nhân Linux Google và các thành viên khác của Liên minh thiết bị cầm tay
mở (Open Handset Alliance) đã hợp tác trong việc phát triển và phát hành Android
Dự án nguồn mở Android (AOSP) được giao nhiệm vụ duy trì và phát triển Android
Hình 1 Giới thiệu hệ điều hành Android
-Android có một cộng đồng lớn các nhà phát triển viết các ứng dụng (“app”) mở rộng
chức năng của thiết bị Hiện nay có hơn 150000 ứng dụng dành cho Android Android Market là cửa hàng ứng dụng trực tuyến do Google quản lý, mặc dù các ứng dụng cũng
có thể được tải về từ các trang web của bên thứ 3 Các nhà phát triển chủ yếu bằng ngôn
ngữ Java, kiểm soát thiết bị thông qua thư viện Java do Google phát triển
Trang 12• Các phiên b ản Android
Đã có một số lượng các bản cập nhật từ phiên bản đầu tiên của Android.Những cập nhật cho hệ điều hành cơ sở thường tập trung vào việc sửa lỗi cũng như bổ sung các tính năng
mới.Thông thường mỗi phiên bản mới của hệ điều hành Android được phát triển dưới
một tên mã dựa trên một món tráng miệng.Những cập nhật đã qua bao gồm Cupcake và Donut
Các phiên bản phát hành gần đây nhất của Android là:
2.0/2.1 (Eclair), trong đó sửa lại giao diện người dùng và giới thiệu HTML 5 và hỗ trợ Exchange ActiveSync 2.5
2.2 (Froyo), giới thiệu những cải tiến về tốc độ với sự tối ưu hóa JIT và Chrome V8 Javascript engine, và thêm chức năng phát sóng Wifi và hỗ trợ Adobe Flash
2.3 (Gingerbread), tinh chế giao diện người dùng, cải tiến “soft keyboard” và các tính năng copy/paste, và thêm hỗ trợ cho Near Field Communication (NFC)
3.0 (Honeycomb), một bản phát hành hướng tới máy tính bảng, hỗ trợ các thiết bị có màn hình lớn hơn và giới thiệu nhiều tính năng giao diện người dùng mới, và hỗ trợ
bộ xử lý đa lõi và tăng tốc phần cứng dùng cho đồ họa Honeycomb SDK đã được phát hành và thiết bị đầu tiên sử dụng phiên bản này, máy tính bảng Motorola Xoom,
đã được bán trong tháng 2 năm 2011 Google đã chọn giữ lại mã nguồn phát triển, đặt
ra câu hỏi về tính mở của phiên bản Android này Tuy nhiên Rubin (đồng sáng lập công ty Android) đã tuyên bố rằng mã nguồn sẽ được phát hành cho Honeycomb trong tương lai gần Lý do của sự chậm trễ này, theo Rubin trong một bài viết trên blog chính thức của Android, là bởi vì Honeycomb được đưa vào việc sản xuất của Motorola Xoom và khi nào mà Honeycomb phù hợp cho các nhà phát triển sử dụng thì nó sẽ được phát hành
4.0 (Ice Cream Sandwich) Ra mắt 19-10-2011 là thế hệ Android được mong đợi nhất đến nay, ra đời cùng dòng smartphone Samsung Galaxy Nexus, thế hệ smartphone đầu tiên trạng bị ICS Android 4.0 đửa các chức năng truy xuất nhanh các ứng dụng thường dùng vào phần bên dưới giao diện chủ, tùy biến widget , dễ sắp xếp và duyệt danh sách ứng dụng hơn Các ứng dụng đã có thể truy xuất nhanh từ màn hình thiết
bị, hiện các hãng sản xuất thiết bị mới chỉ cho phép Camera có thể chọn nhanh từ LockScreen
4.1 (Jelly Bean) Ra mắt đầu tháng 7-2012 là hệ điều hành nâng tầm hoạt động cho hệ điều hành của Google, trở thành hệ điều hành cho thiết bị di động hàng đầu hiện nay
Khả năng sắp xếp giao diện chủ và widget trong Jelly Bean rất tùy biến và linh hoạt
Hệ thống hỗ trợ dịch vụ ví điện tử Google Wallet, đặc biệt trình duyệt web mặc định trong Android được thay thế bởi đại diện tên tuổi : Chrome, với khả năng đồng bộ dữ
liệu theo tài khoản với bản Chrome trên máy tính Jelly Bean giới thiệu Google Now,
Trang 13dịch vụ trực tuyến mới hiện chỉ dành cho Android, một phụ tá đắc lực cho công việc
sắp xếp lịch trình, tìm kiếm thông tin, xác định vị trí và được xem như lời đáp trả của Google với Apple Siri trong iOS
4.2 (vẫn là Jelly Bean) Ra mắt tháng 11-2012 mang đến những cải tiến hấp dẫn cho ứng dụng chụp ảnh như HDR, Photo Sphere, hiệu ứng ảnh, Google Now, đưa tính năng lướt chọn từ rất hay trong bàn phím ảo Chức năng bom tấn hỗ trợ nhiều tài khoản người dùng (multi-user profile) lần đầu tiên được áp dụng trong Android 4.2 nhưng chỉ có người dùng máy tính bảng thừa hưởng chức năng này
Android X: Nhiều dự đoán cho rằng thế hệ Android 5.0 kế tiếp sẽ có tên mã Key Lime Pie và thế hệ thiết bị Nexus mới của Gooogle sẽ một lần nữa trở thành đại diện đầu tiên sở hữu nền tảng mới này Android sẽ dần xóa nhòa làn ranh giữa hệ điều hành cho thiết bị di động và hệ điều hành cho máy tính cá nhân, giảm khác biệt phân
mảnh, đem đến những chức năng thú vị hơn
• Các tính năng chính của Android
Handset
layouts
Nền tảng này có thể thích nghi với kích thước lớn hơn, VGA, thư
viện đồ họa 2D, thư viện đồ họa 3D dựa trên đặc tả OpenGL ES 2.0 Lưu trữ SQLite, một hệ cơ sở dữ liệu quan hệ gọn nhẹ, được dùng cho mục
đích lưu trữ dữ liệu
Kết nối Android hỗ trợ các công nghệ kết nối bao gồm GSM/EDGE, IDEN,
CDMA, EV-DO, UMTS, Bluetooth, Wifi, LTE, NFC và WiMax
Gửi tin
nhắn
SMS và MMS là các hình thức tin nhắn được chấp nhận, bao gồm
gửi tin nhắn luồng văn bản và hiện nay Android Cloud to Device Messaging Framework (C2DM) cũng là một phần của dịch vụ Android Push Messaging
Trình
duyệt web
Trình duyệt web có trên Android dựa trên layout engine nguồn mở Webkit, kết hợp với engine Javascript V8 của Chrome Trình duyệt này đạt điểm số 93/100 trong bài kiểm tra Acid3
Hỗ trợ
Java
Trong khi hầu hết các ứng dụng Android được viết bằng Java, không
có máy ảo Java trên nền tảng này và Java byte code không thực thi được Các lớp Java được biên dịch sang dạng Dalvik executable và
chạy trên máy ảo Dalvik Dalvik là một máy ảo được thiết kế đặc
biệt dành riêng cho Android và tối ưu hóa cho các thiết bị di động dùng pin với CPU và bộ nhớ hạn chế Hỗ trợ J2ME có thể được cung
cấp thông qua ứng dụng bên thứ 3
Hỗ trợ đa
phương
tiện
Android hỗ trợ các định dạng audio/video/still sau: WebM, H.263, H.264 (trong 3GP hoặc MP4container), MPEG-
Trang 14MP4 hoặc 3GP container), MP3, MIDI, Ogg
tỉ lệ, chuyển đổi định dạng pixel)
Môi
trường
phát triển
Bao gồm trình giả lập thiết bị, các công cụ cho debug, cấu hình bộ
nhớ và thực thi Môi trường phát triển tích hợp (IDE) là Eclipse (hiện
tại là 3.4 và cao hơn) sử dụng plugin ADT (Android Development Tools) Ngôn ngữ lập trình là Java và C++
Android có hỗ trợ cho cảm ứng đa điểm mà ban đầu đã có sẵn trong
những thiết bị cầm tay như HTC Hero Tính năng này lúc đầu đã bị hóa hiệu hóa ở cấp kernel (có thể để tránh vi phạm các bằng sáng chế
của Apple về công nghệ cảm ứng đa điểm vào thời điểm đó) Google sau đó đã phát hành một bản cập nhật cho Nexus One và Motorola Droid mà cho phép cảm ứng đa điểm như nguyên bản
Bluetooth Hỗ trợ A2DP, AVRCP, gửi các tập tin (OOP), truy cập vào danh bạ
điện thoại (PBAP), quay số bằng giọng nói và gửi địa chỉ liên hệ
giữa các điện thoại Hỗ trợ bàn phím, chuột và joystick (HID) được cung cấp thông qua các tùy chỉnh của nhà sản xuất và các ứng dụng bên thứ 3 Hỗ trợ HID đầy đủ dự kiến có trên Android 3.0 (Honeycomb)
Đàm thoại
video
Các phiên bản Android chính thống không hỗ trợ cuộc gọi video, nhưng một số thiết bị cầm tay có một phiên bản tùy biến của hệ điều hành này mà hỗ trợ điều đó, thông qua UMTS network (như Samsung Galaxy S) hoặc thông qua IP Gọi điện video thông qua Google Talk được lên kế hoạch cho Android 3.0 (Honeycomb)
Đa nhiệm ể chạy nhiều ứng dụng cùng lúc trên Android
Trang 15trợ trên Android 2.2 trở lên
Tethering Android hỗ trợ tethering, cho phép một điện thoại có thể được sử
dụng như một điểm truy cập không dây hoặc có dây Trước Android 2.2 nó được hỗ trợ bởi các ứng dụng bên thứ 3 hoặc các tùy chỉnh
của nhà sản xuất
1.1.2 Kiến trúc Android OS
Google thường đề cập đến Android như là một “software stack” Mỗi lớp (layer) của stack này nhóm một số chương trình với nhau hỗ trợ các chức năng nhất định của hệ điều hành
• Application Framework
-Bằng cách cung cấp một môi trường phát triển mở, Android giúp cho các lập trình viên xây dựng các ứng dụng một cách dễ dàng và phong phú Các lập trình viên có thể phát
Trang 16huy tối đa khả năng của thiết bị phần cứng, truy nhập các thông tin cục bộ, chạy các dịch
vụ cơ bản, đặt cảnh báo , thêm các cảnh báo trên thanh trạng thái và còn nhiều hơn thế
- Các lập trình viên có thể truy nhập tới cùng framework các API được sử dụng bởi các ứng dụng nhân Kiến trúc của ứng dụng được thiết kế đơn giản và thuận tiện cho việc tái
sử dụng lại các thành phần, bất kì ứng dụng nào cũng có thể công khai dung lượng của nó
và ứng dụng khác có thể sử dụng những dung lượng đó.Kĩ thuật này làm cho các thành
phần có thể được thay thế bởi người sử dụng
- Về cơ bản tất cả các ứng dụng là tập hợp các dịch vụ và các hệ thống bao gồm:
+ Một bộ các Views mà có thể được sử dụng để xây dựng các ứng dụng bao gồm list, grid, text box, button, và các trình duyệt web được nhúng vào
+ Content Providers cho phép các ứng dụng truy nhập dữ liệu từ các ứng dụng khác
hoặc để chia sẻ dữ liệu của chính nó
+ Một Resource Manager cung cấp truy nhập tới các tài nguyên không phải code như các chuỗi được cục bộ hóa , hình ảnh và các file layout
+ Một Notification Manager cho phép tất cả các ứng dụng hiển thị các cảnh báo trong thanh trạng thái
+ Một Activity Manager quản lý vòng đời của các ứng dụng
• Libraries
Andoid chứa một bộ các thư viện C/C++ được sử dụng bởi các đa dạng các thành phần
của hệ thống Android Dưới đây là một số thư viện chính:
System C library – một hệ thống thư viện C chuẩn
Media Libraries – dựa trên PacketVideo của OpenCore , nó hỗ trợ cho việc chơi và ghi lại nhiều định dạng audio và video cũng như các file hình ảnh tĩnh
Surface Manager – quản lý truy nhập tới việc hiển thị các hệ thống con và các tầng
đồ họa 2D, 3D từ nhiều ứng dụng
LibWebCore – một mô hình trình duyệt web mà nó mang tới sức mạnh của cả trình duyệt Android và web view nhúng
SGL- cơ sở cho kĩ thuật đồ họa 2D
Các thư viện 3D: dựa trên các API OpenGL ES 1.0
FreeType : bitmap và các kiểu vector
SQLite : phục vụ cho việc lưu trữ cơ sở dữ liệu
• Android Runtime
Android chứa một bộ các thư viện lõi mà cung cấp hầu hết các hàm trong thư viện chính của ngôn ngữ lập trình Java
Tất cả các ứng dụng Android đều chạy trong tiến trình riêng Dalvik đã được viết để
một thiết bị có thể chạy nhiều máy ảo hiệu quả Dalvik VM thực thi các file dưới định
dạng Dalvik Executable (.dex) VM chạy các lớp được biên dịch bởi trình biên dịch của Java mà được truyền bên trong định dạng dex bởi việc thêm công cụ “dx”
Dalvik VM dựa vào nhân Linux cho hầu hết các hàm như luồng và quản lý bộ nhớ ở
mức thấp
• Linux Kernel
Trang 17Google sử dụng Linux phiên bản 2.6 để xây dựng nhân của Android, bao gồm các chương trình quản lý bộ nhớ, các thiết lập bảo mật, phần mềm quản lý nguồn điện và một
số trình điều khiển phần cứng (hardware driver) Ví dụ: điện thoại Nexus One có một camera, nhân Android bao gồm một camera driver, cho phép người dùng gửi lệnh đến
phần cứng của camera
1.1.3 Tổng quan về một ứng dụng Android
Android SDK cung cấp các công cụ và các API cần thiết để có thể phát triển các ứng
dụng trên môi trường Android sử dụng ngôn ngữ Java.Việc hiểu được các thành phần (component) tạo nên một ứng dụng Android là rất cần thiết cho việc lập trình Các thành
phần này được chia làm 6 loại gồm:
Activity: hiểu một cách đơn giản thì Activity là nền của 1 ứng dụng Khi khởi động 1 ứng dụng Android nào đó thì bao giờ cũng có 1 main Activity được gọi, hiển thị màn
hình giao diện của ứng dụng cho phép người dùng tương tác
Service: thành phần chạy ẩn trong Android Service sử dụng để update dữ liệu, đưa ra
các cảnh báo (Notification) và không bao giờ hiển thị cho người dùng thấy
Content Provider: kho dữ liệu chia sẻ Content Provider được sử dụng để quản lý và
chia sẻ dữ liệu giữa các ứng dụng
Intent: nền tảng để truyền tải các thông báo Intent được sử dụng để gửi các thông
báo đi nhằm khởi tạo 1 Activity hay Service để thực hiện công việc bạn mong muốn
VD: khi mở 1 trang web, bạn gửi 1 intent đi để tạo 1 activity mới hiển thị trang web
đó
Broadcast Receiver : thành phần thu nhận các Intent bên ngoài gửi tới VD: bạn viết 1 chương trình thay thế cho phần gọi điện mặc định của Android, khi đó bạn cần 1 BR
để nhận biết các Intent là các cuộc gọi tới
Notification: đưa ra các cảnh báo mà không làm cho các Activity phải ngừng hoạt
động
Activity, Service, Broadcast Receiver và Content Provider mới là những thành phần chính cấu thành nên ứng dụng Android, bắt buộc phải khai báo trong AndroidManifest
1.1.4 Chu kì của một ứng dụng Android
Actitvity là thành phần quan trọng nhất và đóng vai trò chính trong xây dựng ứng dụng Android Hệ điều hành Android quản lý Activity theo dạng stack: khi một Activity mới
được khởi tạo, nó sẽ được xếp lên đầu của stack và trở thành running activity, các
Activity trước đó sẽ bị tạm dừng và chỉ hoạt động trở lại khi Activity mới được giải phóng
Activity bao gồm 4 trạng thái:
-active (running): Activity đang hiển thị trên màn hình (foreground)
- paused: Activity vẫn hiển thị (visible) nhưng không thể tương tác (lost focus) VD: một activity mới xuất hiện hiển thị giao diện đè lên trên activity cũ, nhưng giao diện
Trang 18này nhỏ hơn giao diện của activity cũ, do đó ta vẫn thấy được 1 phần giao diện của
activity cũ nhưng lại không thể tương tác với nó
- stop: Activity b ị thay thế hoàn toàn bởi Activity mới sẽ tiến đến trạng thái stop
- killed: Khi hệ thống bị thiếu bộ nhớ, nó sẽ giải phóng các tiến trình theo nguyên tắc ưu tiên Các Activity ở trạng thái stop hoặc paused cũng có thể bị giải phóng và khi nó được
hiển thị lại thì các Activity này phải khởi động lại hoàn toàn và phục hồi lại trạng thái trước đó
• Biểu đồ miêu tả các trạng thái của Activity:
Hình 3 Sơ đồ trạng thái Activity
• Các phương thức của chu kì biến đổi trạng thái activity:
-onCreate() : Được gọi khi activity lần đầu tiên được tạo Ở đây bạn làm tất cả các cài đặt tĩnh như tạo các view, kết nối cơ sở dữ liệu đến list Phương thức này gửi qua một đối tượng Bundle chứa đựng từ trạng thái trước của Activity
Trang 19-onRestart(): Được gọi sau khi activity đã được dừng, chỉ một khoảng đang khởi động
lần nữa, luôn theo sau bởi onStart()
-onStart(): Được gọi trước khi một activity visible với người dùng, theo sau bởi onResume() nếu activity đến trạng thái foreground hoặc onStop()
-onResume() : Được gọi trước khi activity bắt đầu tương tác với người dùng, tại thời điểm này activity ở trên đỉnh của stack activity,luôn theo sau bởi onPause()
-onPause(): Được gọi khi hệ thống đang resuming activity khác Phương thức này là điển hình việc giữ lại không đổi dữ liệu, nó nên được diễn ra 1 cách nhanh chóng bởi vì activity kế tiếp sẽ không được resumed ngay cho đến khi nó trở lại Theo sau bởi onResume nếu activity trở về từ ở trước , hoặc bởi onStop nếu nó trở nên visible với người dùng Trạng thái của activity có thể bị giết bởi hệ thống
-onStop(): Được gọi khi activity không thuộc tầm nhìn của người dùng Nó có thể diễn ra
bởi vì nó đang bị hủy , hoặc bởi vì activity khác nữa được resumed và bao phủ nó Được theo sau bởi onRestart() nếu activity đang trở lại để tương tác với người dùng, hoặc onDestroy() nếu activity đang bỏ
-onDestroy(): Được gọi trước khi activity bị hủy Đó là lần cuối cùng mà activity này được nhận Nó được gọi khác bởi vì activity đang hoàn thành, hoặc bởi vì hệ thống tạm
thời bị hủy diệt để tiết kiệm vùng nhớ Trạng thái của activity có thể được giết bởi hệ
thống
1.2 Module xử lý âm thanh trong Android
1.2.1 T ổng quan về OpenCore MutilMedia Framework
Âm thanh và tiếng nói được mã hóa dưới dạng MP3, ACC và AMR được sử dụng
rộng rãi trên các thiết bị di động trên khắp thế giới Trong trường hợp lý tưởng, các định
dạng mã hóa đó được dựa trên sự phát triển của phần cứng Mặc dù vậy, cũng rất phổ
biến các phần mềm mã hóa âm thanh đang chạy trên các bộ xử lý ứng dụng chính, mà
hầu hết là các bộ xử lý nhân ARM Các mã hóa này phải tổ chức bộ nhớ hiệu quả, xử lý chu kỳ hiệu quả, và tương thích với đa hệ điều hành và phải có một giao diện tốt Ở đây, chúng ta cùng tìm hiểu về OpenCore multimedia famework và việc tối ưu hóa các mã hóa
âm thanh như là một phần không thể thiếu trên các môi trường Android Chúng ta cũng
sẽ thấy được các tiêu chuẩn và yêu cầu để các thành phần này được sử dụng trên các thiết
bị di động Các thành phần OpenCore âm thanh hiện nay đã có sẵn từ Open Handset Alliance như một phần của Android SDK, và source code của các thành phần này được phát hành vào cuối năm 2008 Vì thế nó được sử dụng rộng rãi cho các dự án trên các thiết bị di động cũng như các dự án không phải di động
Môi trường Android
Trang 20Trong mùa thu năm 2007, ngày công nghiệp điện thoại di động bắt đầu nóng lên với
những tin đồn rằng Google sẽ sớm phát hành “G-Phone” Không ai chắc chắn về chiếc điện thoại này, nhưng nhiều tin tưởng và hy vọng rằng nó sẽ là câu trả lời của Google tới iPhone Nhiều bài báo khác nhau đã dự đoán về một cuộc cách mạng điện thoại, và một vài đề nghị rằng nó sẽ sớm được thương mại hóa vào đầu năm 2008 Tuy nhiên, khi công
bố thực tế vào tháng 11 năm 2007, không chỉ đơn thuần là chiếc điện thoại “G-phone” đến từ Google Thay vì đó, là một nền tảng di động mới Nền tảng đó có tên là Android
và nó không chỉ tới từ Google mà còn tới từ một liên minh các công ty trong nghành công nghiệp truyền thông di động
Android là hệ điều hành nền tảng cho thiết bị di động và hoàn toàn miễn phí , một môi hệ điều hành mở Hệ điều hành, middleware, giao diện, và một loạt các ứng dụng sẽ hoàn toàn là mã nguồn mở và có thể được chỉnh sửa và như thế loại bỏ được nhiều hạn
chế hiện có trên nền tảng di động Chính vì vậy sự phát triển của các ứng dụng di động và các dịch vụ cho Android sẽ được mở và phát triển các ứng dụng tích hợp kể từ đó Vì
miễn phí, các mã nguồn Android sẽ được sử dụng để phát triển các ứng dụng dưới dạng
phần mềm miễn phí Điều này cho phép các nhà máy sản xuất các thiết bị Android cầm tay mà không có nhiều tốn kém Mặc dù Android được khởi xướng bởi Google , nhưng
nó cũng được phát triển thành một dự án hợp tác giữa các thành viên từ 34 công ty, trong
đó có nhiều thành phần chủ chốt trong ngành công nghiệp điện thoại di động Kết quả liên minh này được gọi là Open Handset Alliance(OHA)
Trong một tuần của tháng 10 năm 2007, OHA đã phát hành một bản về Android SDK SDK này bao gồm các công cụ phát triển, một thiết bị mô phỏng, tài liệu và các project mẫu cũng như rất nhiều các thư viện thực thi các chức năng hệ thống của Android Nhiều nhà phát triển đã tải về SDK và bắt đầu viết các ứng dụng trên nền của
nó
Packet Video được chọn từ hệ thống con đa phương tiện để cung cấp cho Android Chính vì thế PacketVideo cung cấp multimedia framework và các thành phần cần thiết như mã hóa âm thanh và video, các định dạng file và các thành phần streaming Tổng hợp
của các thành phần này được gọi là OpenCore bao gồm multimedia framework và các mã hóa
OpenCore Multimedia Framework
OpenCore multimedia framework là một mô hình, một famework mở rộng để kết hợp các thành phần xử lý media như định dạng các file, mã hóa, các giao thức streaming, các thành phần dựng hình, và các yếu tố khác theo những cách khác nhau để thực hiện các
kịch bản của hệ thống đa phương tiện Hình dưới cho chúng ta thấy các khối chức năng
chủ yếu ở mức độ cao của OpenCore
Trang 21Hình 4 Sơ đồ tổng quan OpenCore Multimedia Framework
Tầng thấp nhất cung cấp các API cho giao diện của hệ điều hành và các dịch vụ nền
tảng cần thiết bao gồm quản lý bộ nhớ, DNS lookup, mạng và file I/O, các tiến trình và điều khiển luồng Multimedia framework này định nghĩa các phương thức và cấu trúc dữ
liệu cho việc quyết định các định dạng và tham số giữa các thành phần Thiết kế này cũng
giảm thiểu việc sao chép dữ liệu đa phương tiện khi qua các luồng khác nhau
Khối mã hóa Video bao gồm các định dạng MPEG4, H.263 và H.264 cùng với các giao diện để tích hợp các định dạng khác và tăng tốc độ mã hóa của phần cứng Khối mã hóa âm thanh cũng tương tự, nó cung cấp giao diện cho việc tích hợp thêm mã hóa
Khối định dạng dữ liệu đọc và ghi các định dạng file, hỗ trợ đa dạng các giao thức streaming Hỗ trợ các định dạng file khác nhau bao gồm mp3, mp4, 3gp, acc,.amr, và wav cũng như các giao thức bao gồm RTSP và HTTP, và các chức năng download
Khối multimedia engines cung cấp logic cho việc lựa chọn và kết nối các thành phần bên tromg kiến trúc tích hợp cũng như cung cấp các điều khiển ở mức cao tới các ứng
dụng đa phương tiện
Khối Content Policy Manager cung cấp framework cho các nội dung truy nhập và các điều kiển mà có thể sử dụng để tích hợp các chức năng DRM- một framework mở rộng
của Android quản lý và bảo vệ các ứng dụng theo các giấy phép mà hầu hết đến từ các hãng sản xuất
Trang 221.2.2 OpenCore x ử lý âm thanh và tiếng nói trong Android
OpenCore mã hóa âm thanh và tiếng nói được liệt kê trong bảng dưới đây, cùng với các tần số lấy mẫu được hỗ trợ (KHz), các cấu hình kênh (#Ch) và tốc độ bit (kbps) Nó
hỗ trợ mã hóa các định dạng file bao gồm: MP3, ACC,HE-ACCv2, AMR-NB và các giải
mã AMR-WB và một mã hóa AMR-NB :
Hình 5 OpenCore mã hóa âm thanh cho Android
Mô đun thiết kế
OpenCore đã áp dụng giao diện OpenMAX Inegration Layer(IL) OpenMAX IL là
một hệ thống API đa môi trường nổi tiếng mà cho phép các thành phần đa phương tiện được phát triển một lần sau đó dễ dàng tích hợp trên nhiều hệ điều hành và nhiều nền
tảng phần cứng Hình dưới đấy cho chúng ta thấy mô đun thiết kế Open Core mang tới sự vượt trội của giao diện OpenMAX IL
Trang 23Hình 6 Mô hình thiết kế OpenCore mã hóa âm thanh cho Android
OpenCore multimedia framework cung cấp các thành phần OMX được sử dụng để tích
hợp mã hóa âm thanh và video Một thành phần OMX đóng vai trò như một bao xung quanh các mã hóa âm thanh, và cung cấp khả năng tương thích tới bộ OpenMAX IL API
Hầu hết các API là không đồng bộ, nghĩa là các thành phần OMX xếp hàng các câu lệnh
và các bộ đệm dữ liệu đầu vào mà nó nhận từ tầng tích hợp OpenMAX, và xử lý chúng vào một thời gian sau đó Khi lên lịch trình để chạy, thành phần OMX có thể xử lý một
hoặc nhiều hàng đợi các bộ đệm dữ liệu đầu vào theo thứ tự để giải mã dữ liệu âm thanh bitstream được kết hợp dùng để kết nối phần mềm mã hóa audio Thành phần OMX sau
đó trả về bộ đệm đầu vào đã được xử lý tới OpenMAX Audio Decoder Node theo tầng tích hợp OpenMAX
Trong các trường hợp áp dụng,các thư viện mã hóa âm thanh có thể được cấu hình thiết kế cho phép tối ưu hóa bộ nhớ Ví dụ, thư viện ACC sử dụng tầng riêng biệt để phù
hợp với các cơ sở ACC, các công cụ Spectral Band Replication (SBR) và Parametric Stereo (PS) Chính vì thế khi lựa chọn giữa mã hóa ACC và HE-ACC tại thời điểm build,
có thể cấu hình các mã để loại bỏ các tầng mà không cần thiết Một ví dụ khác, bộ giải
mã MP3 được nhúng một bộ cân bằng để có thể đưa vào hoặc loại bỏ sử dụng sự cấu hình thời gian build
Trang 24 Các t ối ưu hóa
Các thư viện mã hóa âm thanh có nguồn gốc dựa trên các sự thực thi tham chiếu điểm nổi của đa dạng các chuẩn mã hóa Trải qua thời gian, sự mã hóa được dịch chuyển mang tới sự hiệu quả hơn trong sự thực thi các điểm cố định, và sau đó được tổ chức lại
và tối ưu tạo ra sự sử dụng tốt nhất của các tài nguyên hệ thống
Các thư viện mã hóa âm thanh hầu hết được viết chủ yếu bằng ngôn ngữ C Từ khi nhiều thiết bị nhúng sử dụng bộ vi xử lý nhân ARM, các đoạn mã được bổ xung thêm các vùng khóa có giới hạn sử dụng mã assembly được tối ưu Tại nhiều nơi có nhiều bộ cấu hình nội tuyến assembly, mà được lựa chọn tại thời điểm build tùy thuộc vào cấu hình
phần cứng Hầu hết sự tối ưu hóa có thể lựa chọn để bật hoặc tắt tại thời điểm thông dịch,
và đặc biệt có ích trong trường hợp phần cứng không chứa một bộ thông dịch được tối ưu hóa vượt trội như ARM ADS/RVCT
Các thư viện mã hóa âm thanh giúp cho việc sử dụng hiệu quả các tiến trình quản lý
bộ nhớ bên trong Một pool của bộ nhớ được phân bố cho các thư viện khi cài đặt, và bộ
nhớ này được tái tạo và sử dụng lại trong suốt quá trình giải mã Điều này ngăn các tiến trình giải mã chậm trễ trong suốt quá trình cấp phát bộ nhớ động yêu cầu từ hệ điều hành Các thư viện mã hóa âm thanh được tạo ra bên trong sử dụng một tầng có khả năng
kết nối của hệ điều hành gọi là OSCL Chính vì thế các thư viện có thể dễ dàng được kết
nối tới hệ điều hành mới bằng các cổng của tầng OSCL Các cổng OSCL tồn tại trong nhiều hệ điều hành bao gồm Win32, Symbian, Linux và ARM-Linux Tuy nhiên, các phát hành ban đầu của hệ điều hành Android sẽ tích hợp chỉ cổng Linux của OSCL, kể từ khi Android được phát triển dựa trên Linux
OpenCore mã hóa âm thanh được dựa trên mã hóa thương mại PacketVideo mà được triển khai trên gần 200 thiết bị có thiết kế khác nhau trên nhiều hệ điều hành và các trình biên dịch Môi trường được hỗ trợ bao gồm: Linux (sử dụng trình biên dịch gcc ), Symbian (sử dụng gcc và rvct), Brew (sử dụng trình biên dịch ads), Windows CE (sử
dụng trình biên dịch Microsoft)
Hi ệu năng
OpenCore mã hóa âm thanh được tối ưu với trình biên dịch ADS/RVCT của ARM và được sơ lược trên ARM emulator Bảng dưới đây cho thấy hiệu năng mã hóa một cách sơ lược trên ARM emulator sử dụng bộ vi xử lý ARM9E
Trang 25Hình 7 Kết quả hiệu năng mã hóa âm thanh trên bộ xử lý AMR9E
Hiệu năng của các thư viện OpenCore mã hóa âm thanh, được viết bằng C và tối ưu hóa bằng các nội tuyến assembly, kếts hợp chặt chẽ và thường hiệu năng của assembly
chỉ thực thi mà điển hình là các mã hóa của một bên thứ ba Hầu hết code được viết bằng
C có một lợi thế là vẫn dễ tích hợp, dễ làm việc trên các thuật toán và các phần tử kiến trúc của code
S ự che dấu các lỗi
Lỗi có khả năng phục hồi và lỗi che dấu là cực kỳ quan trọng cho việc mã hóa âm thanh và tiếng nói mà mục đích là một môi trường di động Cho việc mã hóa tiếng nói, các tiêu chuẩn kĩ thuật mã hóa cung cấp các cơ chế đơn giản để bù đắp sự mất mát các frame tiếng nói Ví dụ, ARM-NB quy định sự lặp lại của frame hợp lệ cuối cùng, cùng
với một phân rã theo cấp số nhân.Cho việc mã hóa âm thanh, các thông số tiêu chuẩn mã hóa có thể đưa ra các phương thức che dấu phức tạp, mà có thể không hiệu quả trong một
nền tảng di động Ví dụ, ACC quy định một phương thức che dấu lỗi dự trên sự lưu trữ nhiều ACC frame thành mặt nạ và có thể mất dữ liệu Điều này có thể làm tăng kích thước code , khả năng sử dụng bộ nhớ và độ phức tạp tính toán
Trong trường hợp tiếng nói, chúng ta tin tưởng tính chất không liên tục của tín hiệu
tiếng nói tạo ra cơ chế phân rã theo cấp số nhân vừa đủ Đối với hầu hết âm thanh, thông tin có xu hướng liên tục hơn và chính vì thế dễ dàng nhận thấy sự mất dữ liệu Trong các trường hợp khác, OpenCore audio framework cung cấp phương thức che dấu lỗi đơn
giản Mất các frame âm thanh có thể được phát hiện bên ngoài của việc mã hóa và được đền bù thông qua sự bổ xung khi tích hợp thêm các frame im lặng Sử dụng các frame im
lặng duy trì luồng bộ giải mã và chính vì thế duy trì đồng bộ hóa A/V Kết quả cuối cùng
là các packet mất đi được che dấu sử dụng ít bộ nhớ và các vòng xử lý.hơn phương thức tiêu chuẩn , do đó tiết kiệm bộ nhớ và bin Phương thức này có thể cũng dễ dàng mở rộng cho các mã hóa âm thanh khác mà có thể được thêm vào môi trường Android mà không
cần yêu cầu trực tiếp sự sửa đổi tới các thư viện mã hóa của chính chúng
Trang 26 K ết luận
Android là một hệ điều hành hoàn thiện, miễn phí và một môi trường mở cho các thiết
bị di động Các thành phần OpenCore của VideoPacket cung cấp các chức năng đa phương tiện trên môi trường Android OpenCore cung cấp một cách linh hoạt cho các cấu hình sử dụng khác nhau cho việc mã hóa các thành phần đa phương tiện âm thanh và video Thành phần mã hóa âm thanh trong OpenCore có sự tối ưu hóa cao, có thể cấu hình được và dễ dàng tương thích với nhiều hệ điều hành, các bộ xử lý và các trình thông
dịch khác nhau
Trang 27CHƯƠNG 2 XỬ LÝ ÂM THANH VÀ TIẾNG NÓI TRONG
ANDROID
2.1 Các tiến trình xử lý âm thanh và tiếng nói trong Android
2.1.1 Ti ến trình lưu trữ âm thanh
Android cung cấp một lớp MediaRecorder cho phép chúng ta ghi lại các file audio và video Việc điều khiển lưu trữ này dựa trên các trạng thái máy đơn giản:
Hình 8 Sơ đồ các trạng thái trong tiến trình lưu trữ âm thanh Android
Trang 28Dưới đây là các tiến trình cần thiết sử dụng của MediaRecorder để ghi các file audio: MediaRecorder recorder = new MediaRecorder();
recorder.release(); // Now the object cannot be reused
Trước tiên ta tạo mới một đối trượng MediaRecorder, sau đó gọi phương thức setAudioSource() để gán nguồn âm thanh cần thu Nguồn âm này có thể là từ mic, từ
cuộc gọi đến, từ tệp tin nhạc đang phát… Phương thức setOutputFormat() để thiết lập định dạng âm thanh và phương thức setAudioEncoder() để thiết lập cách mã hóa âm thanh và setOutPutFile() để gán đường dẫn để lưu tệp tin âm thanh xuống
Ngoài ra còn có các phương thức hữu dụng khác: setMaxDuration() dùng để gán thời gian tối đa của tập tin âm thanh ghi thành công setMaxFileSize() để gán kích thước tối
đa của tệp tin âm thanh ghi thành công
Trang 29Hình 9 Sơ đồ các trạng thái tiến trình phát âm thanh Android
Từ sơ đồ trên, có thể thấy một số trạng thái của đối tường MediaPlayer
+ Idle state: Đây là trạng thái của MediaPlayer khi được khởi tạo mới (thông qua từ khóa new) hoặc khi hàm reset() được gọi
Trang 30+ End state: Trạng thái kết thúc, khi được gọi hàm release();
+ Initialized state: Trạng thái khởi tạo, ở trạng thái này, MediaPlayer đã được cung cấp đầy đủ tài nguyên , tuy nhiên , nó chưa thể được thực thi cho tới khi hàm prepared() hoặc prepareAsyn() được gọi để đưa nó đến trạng thái Prepared
+Prepared state: Trạng thái sẵn sang, MediaPlayer sẵn sàng cho việc thực thi/ chạy file media, lúc này, mọi việc chỉ chờ gọi hàm start() để chạy mà thôi
+ Started state: Trạng thái đã bắt đầu, được gọi sau khi hàm start() được gọi thành công, lúc này , bạn có nghe gì không, MediaPlayer đang chạy bài nhạc mà bạn yêu cẩu rồi đó
+ Stopped state: Trạng thái dừng hẳn, sau khi gọi hàm stop(), lưu ý sau khi hàm stop() được gọi, nếu muốn MediaPlayer chạy tiếp, bạn phải đưa MediaPlayer về Prepared state
bằng việc gọi hàm prepared() hay preparedAsync(), nếu không, lỗi sẽ xảy ra
+ Pause state: Trạng thái tạm dừng, chỉ là tạm dừng thôi, để MediaPlayer chạy tiếp, bạn
chỉ việc gọi hàm start()
Còn hai trạng thái khác, nhưng thật sự hữu ích đó là:
+ Preparing state: Trạng thái đang sẵn sàng, khi gọi hàm prepareAsync(), điểm khác nhau giữa việc gọi 2 hàm này đó là: sau khi hàm prepared() đươc gọi, tiến trình đã gọi nó
sẽ chờ cho đến khi file đã sẵn sàng (làm đơ chương trình), còn đối với preparedAsync(),
tiến trình gọi nó sẽ gọi lại hàm onPrepared() (nằm trong giao diện onPreparedListener),
và một tiến trình khác sẽ lo liệu cho file media sẽ được chạy, như vậy, chương trình của mình sẽ không bị đơ nữa
+ Playback Completed: Trạng thái hoàn thành, khi một file media đã được chạy xong Khi đạt đến trạng thái này, MediaPlayer sẽ tự động gọi hàm onCompleted(), nếu bạn đã cài đặt OnCompletedListener() cho MediaPlayer
Chúng ta nên sử dụng preparedAsync() thay cho hàm prepared() nhưng khi sử dụng nó ta
cần cài đặt onPreparedListener() cho MediaPlayer:
mp.setOnPreparedListener(new OnPreparedListener() {
// Đặt code của bạn ở đây, thông thường
là hàm start() sẽ được gọi ở đây
} });
Nên implement giao diện OnErrorListener để xử lý lỗi cho MediaPlayer, tránh các trường
hợp xảy ra lỗi không muốn làm thoát chương trình
Trang 31Khi không cần thiết hãy gọi hàm release() để giải phóng mọi tài nguyên do MediaPlayer
nắm giữ nếu không bạn sẽ không thể truy xuất các tệp media mà MediaPlayer đang dùng
Một số lỗi thường gặp với MediaPlayer:
+ start called in state 1: Thông thường do việc gọi hàm prepared() hoặc preparedAsync()
mà chưa setDataSource(…) cho MediaPlayer
+ error(1,-2147483648), gọi hàm setDataSource(…), nhưng đường dẫn file media không chính xác, lỗi này xác định bởi đã ghi trong Logcat Trường hợp bạn đang dùng MediaPlayer để chơi các stream từ internet, rất có thể đường dẫn URL không chính xác
hoặc server có vấn đề
+ start called in state 4: Hình như có nhiều nguyên nhân dẫn đến lỗi này, một trong số đó
là việc gọi hàm preparedAsync() và setOnPreparedListener, nhưng lại gọi hàm start() bên ngoài hàm onPrepared() Tức là bạn đang cố đưa MediaPlayer từ trạng thái Preparing sang Started Nhấn mạnh lại rằng chỉ có 2 cách để đưa MediaPlayer đến trạng thái Started
đó là: Prepared hoặc Paused
+ start call in state 2 : Bạn đang cố đưa MediaPlayer đến trạng thái Started từ trạng thái Initialized, với vấn đề này bạn cần gọi hàm prepared() hoặc preparedAsync() để đưa MediaPlayer về trạng thái Prepared trước khi đến Started
2.2 Quản lý và nâng cao xử lý âm thanh, tiếng nói trong Adroid
Với một ứng dụng xử lý âm thanh trên Android, điều quan trọng là người dùng có thể điều khiển âm thanh, và việc quản lý âm thanh tập trung đảm bảo không có nhiều ứng
dụng cùng phát âm thanh trong cùng một thời điểm Chúng ta cùng tìm hiểu cách mà ứng
dụng android tương tác với nút điều khiển âm thanh phần cứng được ấn, yêu cầu âm thanh tập trung (audio focus) khi phát âm thanh và các tương tác tiếp cận việc thay đổi
âm thanh tập trung gây ra bởi hệ thống và các ứng dụng khác
2.1.1 Qu ản lý âm lượng và phát lại
Xác định luồng âm thanh sử dụng
Android duy trì những nguồn âm thanh riêng cho việc phát nhạc, báo thức, cảnh báo , chuông cuộc gọi đến, âm thanh hệ thống, âm lượng cuộc gọi, và nhạc DTMF.Điều này giúp người sử dụng kiểm soát âm thanh của mỗi luồng một cách độc lập.Android có nhiều luồng âm thanh hệ thống khác nhau như Stream_Notification, Stream_Ring, Stream_System, Stream_Voice_Call Hầu hết các luồng này được giới hạn bởi các sự
kiện hệ thống, do đó trừ khi ứng dụng của bạn thay thế đồng hồ báo thức, còn lại bạn sẽ
hầu hết phát âm thanh sử dụng luồng STREAM_MUSIC
Trang 32Mặc định, người dùng có thể ấn nút phần cứng điều kiển âm thanh đang được phát, nếu ứng dụng của bạn đang không phát âm thanh, điều đó sẽ là điều chỉnh âm lượng chuông
Nếu ứng dụng android của bạn liên quan đến game hay âm nhạc, video bạn có thể lắng nghe sự kiện nút âm thanh được ấn và điều chỉnh luồng âm thanh của bạn theo ý mình Android cung cấp phương thức setVolumeControlStream() để điều chỉnh luồng âm thanh
bạn muốn chỉ định
Sau khi xác định được luồng âm thanh mà ứng dụng của bạn sẽ sử dụng, bạn nên thiết lập
nó như luồng âm lượng mục tiêu Chúng ta nên tạo điều này sớm trong vòng đời ứng
dụng bởi vì chỉ cần gọi nó một lần trong suốt vòng đời ứng dụng, tốt nhất là đặt trong phương thức onCreate() Điều này đảm bảo rằng bất kì lúc nào ứng dụng của bạn được
bật, chức năng điều khiển âm lượng sẽ có kết quả như người dùng mong đợi
Ví dụ khi chúng ta gọi setVolumeControlStream(AudioManager.STREAM_MUSIC);
Thì từ thời điểm này, việc nhấn nút điều khiển âm thanh trên thiết bị sẽ ảnh hưởng tới
luồng âm thanh bạn chỉ định ở đây là “music”
Sử dụng phím phần cứng điều khiển phát âm thanh để điều khiển phát âm thanh trong ứng dụng của bạn
Các nút phát âm thanh, video như play, pause, stop, skip và previous có sẵn trên trên một
số thiết bị cầm tay Mỗi lần người dùng ấn những phím đó, hệ thống sẽ broadcasts một intent với sự kiện ACTION_MEDIA_BUTTON
Để tương tác tới hệ thống nút bấm media, bạn cần đăng ký một BroadcastReceiver trong manifest và lắng nghe các hành động broadcast
Intent chứa Extra_Key_Event, trong khi KeyEvent chứa một danh sách
KeyCode_Media_* ví dụ như KeyCode_Media_Play_Pause và KeyCode_Media_Next
Vì nhiều ứng dụng có thể cùng muốn lắng nghe sự kiện các nút media được ấn, bạn cũng
cần thiết lập các điều khiển khi ứng dụng của bạn nhận được sự kiện đó
Bạn có thể đăng ký và đăng ký lại việc nhận sự kiện các nút media được ấn sử dụng AudioManager Khi đã đăng ký, broadcast receiver độc chiếm việc nhận tất cả các button media khi broadcast
AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);
// Start listening for button presses
am.registerMediaButtonEventReceiver(RemoteControlReceiver);
Trang 33// Stop listening for button presses
am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
Việc tương tác tới các nút media quan trọng nhất khi ứng dụng của bạn đang chạy nhưng
lại không hiển thị hay điều khiển trực tiếp từ mạn hình giao diện người sử dụng Cách
tiếp cận tốt hơn là đăng ký và hủy nhận các sự kiện nút media khi ứng dụng của bạn tăng
hoặc mất sự tập trung âm thanh
2.2.2 Qu ản lý âm thanh tập trung
Với nhiều ứng dụng phát âm thanh nó quan trọng để nghĩ như thế nào để chúng đồng bộ
và dung hòa với nhau Để tránh mọi ứng dụng đều phát nhạc vào cùng một thời điểm, Adroid sử dụng âm thanh tập trung để kiểm soát việc phát audio, chỉ ứng dụng nào chứa audio focus mới phát âm thanh
Trước khi ứng dụng bắt đầu phát audio nó nên yêu cầu và nhận audio focus Hơn nữa, nó cũng cần lắng nghe và nhận biết mỗi khi mất audio focus và tương tác lại mỗi khi điều đó
xảy ra
Yêu c ầu Audio Focus
Trước khi ứng dụng chơi bất kì âm thanh nào, nó nên có audio focus cho nguồn sẽ sử
dụng Điều này được thực hiện khi gọi hàm requestAudioFocus() và sẽ trả về
AUDIOFOCUS_REQUEST_GRANTED nếu yêu cầu của bạn thành công
Bạn phải xác định nguồn âm thanh sẽ sử dụng và yêu cầu tạm thời hay vĩnh viễn tới audio focus Yêu cầu tạm khi bạn muốn phát âm thanh trong thời gian ngắn Yêu cầu vĩnh viễn audio focus khi bạn có kế hoạch phát âm thanh lâu dài như phát nhạc
Đoạn code dưới đây giúp ta yêu cầu một audio focus vĩnh viễn, thường xuyên trên nguồn phát âm thanh Chúng ta nên yêu cầu audio focus ngay trước khi bắt đầu phát, giống như khi người dùng ấn play hoặc nhạc nền cho một level tiếp theo của game
AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);
// Request audio focus for playback
int result = am.requestAudioFocus(afChangeListener,
// Use the music stream
Trang 34Mỗi lần kết thúc việc phát âm thanh phải đảm bảo bạn gọi tới hàm abandonAudioFocus()
Điều này thông báo cho hệ thống rằng bạn không yêu cầu focus lâu hơn và hủy sự liên
kết này AudioManager.OnAudioFocusChangeListener Trong trường hợp từ bỏ một focus
tạm thời, điều này cho phép cắt ngang ứng dụng để tiếp tục phát âm thanh
// Abandon audio focus when playback complete
am.abandonAudioFocus(afChangeListener);
phép “ducking” Thông thường, khi một ứng dụng biết cách xử lý tốt nó mất audio focus
nó sẽ dừng việc phát âm thanh ngay lúc đó Bằng cách yêu cầu một audio focus tạm thời
có ducking điều này cho phép bạn nói với các ứng dụng âm thanh khác rằng nó được
chấp nhận cho chúng được tiếp tục phát, và cung cấp cho chúng một âm lượng nhỏ hơn cho đến khi audio focus được trả về cho chúng
// Request audio focus for playback
int result = am.requestAudioFocus(afChangeListener,
// Use the music stream
Ducking là một điều đặc biệt thích hợp cho các ứng dụng sử dụng âm thanh liên tục,
chẳng hạn như có thể nghe được âm thanh chỉ dẫn khi đang lái xe
Khi bất kỳ một ứng dụng nào khác có yêu cầu về audio focus như mô tả ở trên, nó sẽ lựa
chọn giữa việc tạm thời hay vĩnh viễn, thường xuyên (có hoặc không hỗ trợ ducking) về audio focus nhận được bởi việc bạn đăng ký khi yêu cầu focus
X ử lý khi mất âm thanh tập trung (audio focus)
Nếu ứng dụng của bạn có thể yêu cầu audio focus, thì nó cũng sẽ có thể mất khi một ứng
dụng khác yêu cầu audio focus Ứng dụng của bạn sẽ trả lời sự mất audio focus đó như
thế nào phụ thuộc vào cách mà nó đã mất đó
Bằng cách gọi phương thức onAudioFocusChange() bạn sẽ lắng nghe được sự thay đổi
của audio focus , khi đó nó yêu cầu audio focus nhận một tham số miêu tả sự kiện focus được thay đổi Cụ thể, có thể các sự kiện mất focus sẽ cho chúng ta biết về kiểu yêu cầu focus trước đó là loại gì, vĩnh viễn, tạm thời hay là tạm thời có ducking Nói chung khi nói, việc mất audio focus dù là tạm thời hay vĩnh viễn nên đưa về kết quả im lặng cho nguồn âm thanh của nó, nhưng trái lại duy trì cùng 1 trạng thái Chúng ta nên tiếp tục
ững thay đổi về audio focus và chuẩn bị để tiếp tục phát âm thanh trở lại khi
Trang 35nó tạm dừng một lần bạn sẽ lấy lại được focus trở lại Nếu việc mất audio focus là vĩnh
viễn, nó sẽ giả định rằng ứng dụng khác thì đang sử dụng để nghe audio và ứng dụng của
bạn hiệu quả nhất là kết thúc nó Trong điều kiện thực tế, điều đó có nghĩa rằng dừng
việc phát và dỡ bỏ việc lắng nghe các nút bấm media và cho phép một audio player mới độc quyền xử lý những sự kiện khác và từ bỏ audio focus của bạn Tại thời điểm đó, bạn nên hy vọng một hành động của người dùng để tiếp tục yêu cầu trước khi bạn tiếp tục phát âm thanh Trong đoạn code dưới đây, chúng ta sẽ dừng việc phát nếu việc mất âm thanh là tạm thời và tiếp tục khi nó được focus trở lại Nếu việc mất là vĩnh viễn, nó sẽ
hủy việc nhận các sự kiện nút media được ấn và dừng việc theo dõi sự thay đổi của audio focus
OnAudioFocusChangeListener afChangeListener = new
Ducking là việc xử lý giảm âm lượng nguồn âm thanh của bạn để tạo ra một audio focus
tạm thời từ các ứng dụng khác dễ dàng hơn mà không hoàn toàn gián đoạn âm thanh từ các ứng dụng của chính bạn Đoạn code dưới đây là một ví dụ về việc giảm âm lượng trên đối tượng media player khi nó tạm thời mất sự focus và sau đó trả về mức trước nó khi chúng ta focus trở lại
OnAudioFocusChangeListener afChangeListener = new
OnAudioFocusChangeListener() {
public void onAudioFocusChange(int focusChange) {
if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {
// Lower the volume
} else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
// Raise it back to normal
}
}
};
Việc mất audio focus thì cực kỳ quan trọng để broadcast sự phản ưng, nhưng nó không
chỉ một lần Hệ thống broadcast một số intent để cảnh báo bạn thay đổi với những người dùng có kinh nghiệm
Trang 362.2.3 X ử lý với thiết bị phần cứng phát âm thanh
Người dùng có rất nhiều sự lựa chọn cho việc nghe các âm thanh phát ra từ các thiết bị Andoird Hầu hết các thiết bị đều có loa, headphone có dây và nhiều đặc tính kết nối Blueatoothn và hỗ trợ cho âm thanh A2DP
Kiểm tra thiết bị đang được sử dụng
Chúng ta có thể truy vấn tới AudioManager để xác định nếu âm thanh hiện tại được chuyển đến từ thiết bị loa, tai nghe có dây, hoặc gắn với thiết bị Bluetooth :
Xử lý khi thay đổi thiết bị
Khi một tai nghe không được cắm, hoặc một thiết bị Bluetooth không được kết nối tới, nguồn âm thanh của bạn được chuyển tới loa Nếu bạn nghe nhạc với một âm lượng lớn điều đó có thể mang tới sự ồn ào bất ngờ
May mắn là hệ thống broadcast một ACTION_AUDIO_BECOMING_NOISY intent khi điều đó
xảy ra Điều đó có nghĩa là đăng ký một BroadcastReceiver mà lắng nghe cho intent này
mỗi khi bạn đang phát âm thanh Trong trường hợp các player phát nhạc, người dùng hy
vọng việc phát được tạm dừng , trong khi với các game bạn có thể lựa chọn để giảm âm lượng
private class NoisyAudioStreamReceiver extends BroadcastReceiver {
Trang 37CHƯƠNG 3 XÂY DỰNG CHƯƠNG TRÌNH NHẬN DẠNG
TIẾNG NÓI TRÊN ANDROID
3.1 Cơ sở lý thuyết và công nghệ áp dụng
3.1.1 T ổng quan về nhận dạng tiếng nói
Nhận dạng tiếng nói là một quá trình nhận dạng mẫu, với mục đích là phân lớp (classify)
thông tin đầu vào là tín hiệu tiếng nói thành một dãy tuần tự các mẫu đã được học trước
đó và lưu trữ trong bộ nhớ
Nếu các mẫu này là bất biến và không thay đổi thì công việc nhận dạng tiếng nói trở nên đơn giản bằng cách so sánh dữ liệu tiếng nói cần nhận dạng với các mẫu đã được học và lưu trữ trong bộ nhớ
Khó khăn cơ bản của nhận dạng tiếng nói đó là tiếng nói luôn biến thiên theo thời gian
và có sự khác biệt lớn giữa tiếng nói của những người nói khác nhau, tốc độ nói, ngữ cảnh và môi trường âm khác nhau Xác định những thông tin biến thiên nào của tiếng nói
là có ích và những thông tin nào là không có ích đối với nhận dạng tiếng nói là rất quan trọng Đây là một nhiệm vụ rất khó khăn mà ngay cả với các kỹ thuật xác suất thống kê mạnh cũng khó khăn trong việc tổng quát hoá từ các mẫu tiếng nói những biến thiên quan trọng cần thiết trong nhận dạng tiếng nói
Các nghiên cứu về nhận dạng tiếng nói dựa trên ba nguyên tắc cơ bản:
Tín hiệu tiếng nói được biểu diễn chính xác bởi các giá trị phổ trong khoảng thời gian ngắn STAS(short-term amplitude spectrum) Nhờ vậy ta có thể trích ra các đặc điểm tiếng nói từ những khoảng thời gian ngắn và dùng các đặc điểm này làm dữ liệu để nhận dạng tiếng nói
Nội dung của tiếng nói được biểu diễn dưới dạng chữ viết, là một dãy các ký hiệu ngữ
âm Do đó ý nghĩa của một phát âm được bảo toàn khi chúng ta phiên âm phát âm thành dãy các ký hiệu ngữ âm
Nhận dạng tiếng nói là một quá trình nhận thức Thông tin về ngữ nghĩa (semantics)
và suy đoán (pragmatics) có giá trị trong quá trình nhận dạng tiếng nói, nhất là khi thông tin về âm học là không rõ ràng
3.1.2 Phát hi ện tiếng nói và tiền xử lý trích chọn đặc trưng
Trước hết nói về hàm năng lượng thời gian ngắn STEF(Short Time Energy Function) của
tiếng nói được tính bằng cách chia tín hiệu tiếng nói thành nhiều khung, mỗi frame dài N
mẫu, rồi lấy tổng bình phương của các mẫu trong từng frame Cửa sổ chữ nhật dài
Trang 3810-30ms là phù hợp cho mục đích này Với cửa sổ bắt đầu ở mẫu thứ m, hàm năng lượng
thời gian ngắn Tôi được định nghĩa như sau:
𝐸𝐸𝑚𝑚 = � [𝑥𝑥(𝑛𝑛) ∗ 𝑤𝑤(𝑛𝑛 − 𝑚𝑚)]2
𝑚𝑚+𝑁𝑁−1 𝑛𝑛=𝑚𝑚
Một trong những vấn đề cơ bản của xử lý tiếng nói là xác định điểm bắt đầu và kết thúc
của một âm Điều này khó thực hiện chính xác nếu tín hiệu được nói trong môi trường có nhiễu Chúng ta sử dụng thuật toán phát hiện điểm đầu điểm cuối của một âm căn cứ vào hàm năng lượng thời gian ngắn như sau:
Với mỗi khung, tính năng lượng thời gian ngắn E[k] (năng lượng của khung thứ k) theo
Tính năng lượng thời gian ngắn E[k] của khung kế tiếp cho đến khi nhỏ hơn giá trị ngưỡng g*E threadhold thì đánh dấu đó là frame kết thúc một từ, với g là hệ số nhân cho
phát hiện điểm cuối một từ Cuối cùng kết hợp với điều kiện chiều dài của một từ tiếng
Việt thường khoảng 300-450ms để quyết định xem đó có phải là một từ được phát âm hay không
Phương pháp này không còn chính xác nếu môi trường có nhiễu quá lớn Tuy nhiên trong môi trường không quá ồn, giải thuật này có thể chấp nhận được
Vì vậy người ta có thể kết hợp với Tần suất biến thiên qua 0.Tần suất biến thiên qua trục không của tín hiệu :
𝑍𝑍𝑠𝑠(𝑚𝑚) = 1𝐿𝐿 � 𝑠𝑠𝑢𝑢𝑛𝑛�𝑠𝑠(𝑛𝑛)� − 𝑠𝑠𝑢𝑢𝑛𝑛(𝑠𝑠(𝑛𝑛 − 1))2
𝑚𝑚 𝑛𝑛=𝑚𝑚−𝐿𝐿+1