1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_ASH_ACCESSIBILITY_SERVICE_SPEECH_RECOGNITION_IMPL_H_
#define CHROME_BROWSER_ASH_ACCESSIBILITY_SERVICE_SPEECH_RECOGNITION_IMPL_H_
#include <map>
#include "base/memory/weak_ptr.h"
#include "chrome/browser/ash/extensions/speech/speech_recognition_private_delegate.h"
#include "chrome/browser/speech/speech_recognition_constants.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "services/accessibility/public/mojom/assistive_technology_type.mojom.h"
#include "services/accessibility/public/mojom/speech_recognition.mojom.h"
namespace content {
class BrowserContext;
} // namespace content
namespace extensions {
class SpeechRecognitionPrivateRecognizer;
} // namespace extensions
namespace ash {
// SpeechRecognitionImpl handles speech recognition requests from the
// Accessibility Service and also routes speech recognition events back to
// clients.
class SpeechRecognitionImpl
: public ax::mojom::SpeechRecognition,
public extensions::SpeechRecognitionPrivateDelegate {
public:
// Wraps a SpeechRecognitionEventObserver remote. The lifetime of this object
// is a session of speech recognition e.g. it's created when speech
// recognition starts and is destroyed when speech recognition stops.
class SpeechRecognitionEventObserverWrapper {
public:
SpeechRecognitionEventObserverWrapper();
~SpeechRecognitionEventObserverWrapper();
SpeechRecognitionEventObserverWrapper(
const SpeechRecognitionEventObserverWrapper&) = delete;
SpeechRecognitionEventObserverWrapper& operator=(
const SpeechRecognitionEventObserverWrapper&) = delete;
// Called whenever speech recognition stops.
void OnStop();
// Called when a speech recognition result is returned.
void OnResult(ax::mojom::SpeechRecognitionResultEventPtr event);
// Called when speech recognition encounters an error.
void OnError(ax::mojom::SpeechRecognitionErrorEventPtr event);
mojo::PendingReceiver<ax::mojom::SpeechRecognitionEventObserver>
PassReceiver();
private:
mojo::Remote<ax::mojom::SpeechRecognitionEventObserver> observer_;
};
// Constructs a new SpeechRecognitionImpl for the given `profile`. This
// SpeechRecognitionImpl will be reset when the profile changes so it can
// assume that the profile is valid for its entire lifetime.
explicit SpeechRecognitionImpl(content::BrowserContext* profile);
SpeechRecognitionImpl(const SpeechRecognitionImpl&) = delete;
SpeechRecognitionImpl& operator=(const SpeechRecognitionImpl&) = delete;
~SpeechRecognitionImpl() override;
void Bind(mojo::PendingReceiver<ax::mojom::SpeechRecognition> receiver);
// ax::mojom::SpeechRecognition:
void Start(ax::mojom::StartOptionsPtr options,
StartCallback callback) override;
void Stop(ax::mojom::StopOptionsPtr options, StopCallback callback) override;
// extensions::SpeechRecognitionPrivateDelegate:
void HandleSpeechRecognitionStopped(const std::string& key) override;
void HandleSpeechRecognitionResult(const std::string& key,
const std::u16string& transcript,
bool is_final) override;
void HandleSpeechRecognitionError(const std::string& key,
const std::string& error) override;
base::WeakPtr<SpeechRecognitionImpl> GetWeakPtr() {
return weak_ptr_factory_.GetWeakPtr();
}
private:
friend class SpeechRecognitionImplTest;
// Called after speech recognition starts. Performs final setup and creates
// the object that is passed back to the caller.
void StartHelper(StartCallback callback,
const std::string& key,
speech::SpeechRecognitionType type,
std::optional<std::string> error);
// Called after speech recognition stops. Performs final clean up and notifies
// the caller using the StopCallback.
void StopHelper(StopCallback callback,
const std::string& key,
std::optional<std::string> error);
// Creates a key given a client ID.
std::string CreateKey(ax::mojom::AssistiveTechnologyType type);
// Returns the speech recognizer associated with the key. Creates one if
// none exists.
extensions::SpeechRecognitionPrivateRecognizer* GetSpeechRecognizer(
const std::string& key);
// Creates an event observer wrapper associated with the key, if none already
// exists.
void CreateEventObserverWrapper(const std::string& key);
// Returns the event observer wrapper associated with the key, if one exists.
SpeechRecognitionEventObserverWrapper* GetEventObserverWrapper(
const std::string& key);
// Destroys the event observer wrapper associated with the key.
void RemoveEventObserverWrapper(const std::string& key);
std::map<std::string,
std::unique_ptr<extensions::SpeechRecognitionPrivateRecognizer>>
recognizers_;
std::map<std::string, std::unique_ptr<SpeechRecognitionEventObserverWrapper>>
event_observer_wrappers_;
mojo::ReceiverSet<ax::mojom::SpeechRecognition> receivers_;
raw_ptr<content::BrowserContext> profile_ = nullptr;
base::WeakPtrFactory<SpeechRecognitionImpl> weak_ptr_factory_{this};
};
} // namespace ash
#endif // CHROME_BROWSER_ASH_ACCESSIBILITY_SERVICE_SPEECH_RECOGNITION_IMPL_H_
|