2012-08-01 26 views
14

Đối với mọi người sử dụng số điện thoại voice recognition API của Android, trước đây bạn có thể sử dụng một số tiện ích RecognitionListener mà bạn có thể đăng ký để đẩy các sự kiện khác nhau vào cuộc gọi lại của mình. Đặc biệt, đã có những onBufferReceived(byte[]) phương pháp sau đây:Tại sao RecognitionListener ngừng hoạt động trong Jellybean?

public abstract void onBufferReceived (byte[] buffer)

Từ: API Cấp 8 More âm thanh đã được nhận. Mục đích của chức năng này là cho phép đưa ra phản hồi cho người dùng về âm thanh được chụp . Không có đảm bảo rằng phương pháp này sẽ được gọi.

Tham sốbuffer bộ đệm chứa chuỗi thứ tự lớn 16 bit số nguyên đại diện cho luồng âm thanh kênh đơn. Tỷ lệ mẫu phụ thuộc vào việc triển khai.

Mặc dù phương pháp này một cách rõ ràng khẳng định rằng không có đảm bảo nó sẽ được gọi, trong ICS và trước khi nó sẽ có hiệu quả được gọi là 100% thời gian: Thường xuyên đủ, ít nhất, điều đó bằng cách kết hợp tất cả các byte nhận được theo cách này, bạn có thể tái tạo lại toàn bộ luồng âm thanh và phát lại.

Vì một số lý do, tuy nhiên, trong SDK Jellybean, điều này đã ngừng hoạt động một cách kỳ diệu. Không có thông báo về việc không dùng nữa và mã vẫn được biên dịch, nhưng onBufferReceived hiện là không bao giờ được gọi là. Về mặt kỹ thuật, điều này không phá vỡ API của họ (vì nó nói rằng "không bảo đảm" phương pháp này sẽ được gọi), nhưng rõ ràng đây là một thay đổi phá vỡ cho rất nhiều thứ phụ thuộc vào hành vi này.

Có ai biết tại sao chức năng này bị vô hiệu hóa không và liệu có cách nào để nhân rộng hành vi của nó trên Jellybean không?

Làm rõ: Tôi nhận ra rằng toàn bộ RecognizerIntent điều là một giao diện với nhiều triển khai (bao gồm cả một số có sẵn trên Play Store), và họ có thể từng chọn những gì để làm với RecognitionListener. Tôi đặc biệt đề cập đến việc triển khai Google mặc định mà phần lớn các điện thoại Jellybean sử dụng.

Trả lời

8

Google không gọi phương thức này là ứng dụng lời nói Jelly Bean của họ (QuickSearchBox). Đơn giản là nó không có trong mã. Trừ khi có một nhận xét chính thức từ một kỹ sư của Google, tôi không thể đưa ra một câu trả lời rõ ràng "tại sao" họ đã làm điều này. Tôi đã tìm kiếm các diễn đàn nhà phát triển nhưng không thấy bất kỳ bình luận nào về quyết định này.

Mặc định ics cho nhận dạng giọng nói đến từ VoiceSearch.apk của Google. Bạn có thể dịch ngược gói ứng dụng này và xem và tìm thấy có một Hoạt động để xử lý mục đích hành động * android.speech.action.RECOGNIZE_SPEECH *. Trong apk này, tôi đã tìm kiếm "onBufferReceived" và tìm thấy một tham chiếu đến nó trong com.google.android.voicesearch.GoogleRecognitionService $ RecognitionCallback.

Với Jelly Bean, Google đổi tên VoiceSearch.apk thành QuickSearch.apk và thực hiện rất nhiều bổ sung mới cho ứng dụng (ví dụ: đọc chính tả ngoại tuyến). Bạn sẽ vẫn tìm thấy một cuộc gọi onBufferReceived, nhưng vì lý do nào đó nó hoàn toàn biến mất.

+0

Cảm ơn bạn đã phân tích chuyên sâu xác nhận rằng vấn đề này phổ biến trên Jellybean :) Tôi đoán cách duy nhất nó có thể rõ ràng hơn là nếu chúng tôi có một kỹ sư của Google giải thích _why_ điều này đã xảy ra. Cảm ơn! –

2

Tôi cũng đã sử dụng phương thức onBufferReceived và đã thất vọng khi cuộc gọi (không bảo đảm) đến phương thức đã bị xóa trong Jelly Bean. Vâng, nếu chúng ta không thể lấy âm thanh với onBufferReceived(), có thể có khả năng chạy một AudioRecord đồng thời với nhận dạng giọng nói. Bất cứ ai đã thử điều này? Nếu không, tôi sẽ cho nó một xoáy và báo cáo lại.

+2

Tôi nghi ngờ điều đó là có thể, nhưng tôi rất muốn nghe kết quả của bạn. –

+5

Vâng, tôi đã cho nó một thử tốt, nhưng có vẻ như chạy một AudioRecord và SpeechRecognizer cùng một lúc sẽ không hoạt động. Chỉ một trong số họ có thể truy cập vào micrô. Vì vậy, trở lại để cần onBufferReceived() để làm việc .... đi trên Google, làm cho nó như vậy! –

0

Tôi đã gặp phải vấn đề tương tự. Lý do tại sao tôi không chỉ chấp nhận rằng "điều này không làm việc" là bởi vì Google Nows "ghi chú để tự" ghi lại âm thanh và gửi nó cho bạn. Những gì tôi phát hiện ra trong logcat khi chạy "note-to-tự" -operation là:

02-20 14:04:59.664: I/AudioService(525): AudioFocus requestAudioFocus() from [email protected][email protected] 

02-20 14:04:59.754: I/AbstractCardController.SelfNoteController(8675): #attach 
02-20 14:05:01.006: I/AudioService(525): AudioFocus abandonAudioFocus() from [email protected][email protected] 

02-20 14:05:05.791: I/ActivityManager(525): START u0 {act=com.google.android.gm.action.AUTO_SEND typ=text/plain cmp=com.google.android.gm/.AutoSendActivity (has extras)} from pid 8675 
02-20 14:05:05.821: I/AbstractCardView.SelfNoteCard(8675): #onViewDetachedFromWindow 

này khiến tôi luôn tin rằng google disposes các audioFocus từ google bây giờ (các regonizerIntent), và rằng họ sử dụng một âm thanh máy ghi âm hoặc một cái gì đó tương tự khi thẻ Ghi chú tự xuất hiện trong onPartialResults. Tôi không thể xác nhận điều này, có ai khác đã cố gắng thực hiện công việc này không?

0

Tôi có dịch vụ đang triển khai RecognitionListener và tôi cũng ghi đè phương thức onBufferReceived (byte []). Tôi đã điều tra tại sao nhận dạng giọng nói chậm hơn nhiều khi gọi onResults() trên < = ICS. Sự khác biệt duy nhất tôi có thể tìm thấy là onBufferReceived được gọi trên điện thoại < = ICS. Trên JellyBean, onBufferReceived() không bao giờ được gọi và onResults() được gọi là nhanh hơn đáng kể và tôi nghĩ nó vì chi phí để gọi onBufferReceived mỗi giây hoặc mili giây. Có lẽ đó là lý do tại sao họ đã đi với onBufferReceived()?

Các vấn đề liên quan