File: speech_recognition_impl.h

package info (click to toggle)
chromium 138.0.7204.183-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 6,071,908 kB
  • sloc: cpp: 34,937,088; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,953; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,806; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (137 lines) | stat: -rw-r--r-- 5,552 bytes parent folder | download | duplicates (6)
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_