Skip to content

Commit e2d4fe3

Browse files
committed
Add non-streaming ASR support for HarmonyOS.
1 parent a4b79f0 commit e2d4fe3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+648
-454
lines changed

sherpa-onnx/c-api/c-api.cc

+62-41
Original file line numberDiff line numberDiff line change
@@ -352,27 +352,7 @@ struct SherpaOnnxOfflineStream {
352352
: impl(std::move(p)) {}
353353
};
354354

355-
static sherpa_onnx::OfflineRecognizerConfig convertConfig(
356-
const SherpaOnnxOfflineRecognizerConfig *config);
357-
358-
const SherpaOnnxOfflineRecognizer *SherpaOnnxCreateOfflineRecognizer(
359-
const SherpaOnnxOfflineRecognizerConfig *config) {
360-
sherpa_onnx::OfflineRecognizerConfig recognizer_config =
361-
convertConfig(config);
362-
363-
if (!recognizer_config.Validate()) {
364-
SHERPA_ONNX_LOGE("Errors in config");
365-
return nullptr;
366-
}
367-
368-
SherpaOnnxOfflineRecognizer *recognizer = new SherpaOnnxOfflineRecognizer;
369-
370-
recognizer->impl =
371-
std::make_unique<sherpa_onnx::OfflineRecognizer>(recognizer_config);
372-
373-
return recognizer;
374-
}
375-
sherpa_onnx::OfflineRecognizerConfig convertConfig(
355+
static sherpa_onnx::OfflineRecognizerConfig GetOfflineRecognizerConfig(
376356
const SherpaOnnxOfflineRecognizerConfig *config) {
377357
sherpa_onnx::OfflineRecognizerConfig recognizer_config;
378358

@@ -491,17 +471,39 @@ sherpa_onnx::OfflineRecognizerConfig convertConfig(
491471
recognizer_config.rule_fars = SHERPA_ONNX_OR(config->rule_fars, "");
492472

493473
if (config->model_config.debug) {
474+
#if __OHOS__
475+
SHERPA_ONNX_LOGE("%{public}s", recognizer_config.ToString().c_str());
476+
#else
494477
SHERPA_ONNX_LOGE("%s", recognizer_config.ToString().c_str());
478+
#endif
495479
}
496480

497481
return recognizer_config;
498482
}
499483

484+
const SherpaOnnxOfflineRecognizer *SherpaOnnxCreateOfflineRecognizer(
485+
const SherpaOnnxOfflineRecognizerConfig *config) {
486+
sherpa_onnx::OfflineRecognizerConfig recognizer_config =
487+
GetOfflineRecognizerConfig(config);
488+
489+
if (!recognizer_config.Validate()) {
490+
SHERPA_ONNX_LOGE("Errors in config");
491+
return nullptr;
492+
}
493+
494+
SherpaOnnxOfflineRecognizer *recognizer = new SherpaOnnxOfflineRecognizer;
495+
496+
recognizer->impl =
497+
std::make_unique<sherpa_onnx::OfflineRecognizer>(recognizer_config);
498+
499+
return recognizer;
500+
}
501+
500502
void SherpaOnnxOfflineRecognizerSetConfig(
501503
const SherpaOnnxOfflineRecognizer *recognizer,
502504
const SherpaOnnxOfflineRecognizerConfig *config) {
503505
sherpa_onnx::OfflineRecognizerConfig recognizer_config =
504-
convertConfig(config);
506+
GetOfflineRecognizerConfig(config);
505507
recognizer->impl->SetConfig(recognizer_config);
506508
}
507509

@@ -977,25 +979,6 @@ SherpaOnnxVoiceActivityDetector *SherpaOnnxCreateVoiceActivityDetector(
977979
return p;
978980
}
979981

980-
#ifdef __OHOS__
981-
SherpaOnnxVoiceActivityDetector *SherpaOnnxCreateVoiceActivityDetectorOHOS(
982-
const SherpaOnnxVadModelConfig *config, float buffer_size_in_seconds,
983-
NativeResourceManager *mgr) {
984-
if (mgr == nullptr) {
985-
return SherpaOnnxCreateVoiceActivityDetector(config,
986-
buffer_size_in_seconds);
987-
}
988-
989-
auto vad_config = GetVadModelConfig(config);
990-
991-
SherpaOnnxVoiceActivityDetector *p = new SherpaOnnxVoiceActivityDetector;
992-
p->impl = std::make_unique<sherpa_onnx::VoiceActivityDetector>(
993-
mgr, vad_config, buffer_size_in_seconds);
994-
995-
return p;
996-
}
997-
#endif
998-
999982
void SherpaOnnxDestroyVoiceActivityDetector(
1000983
SherpaOnnxVoiceActivityDetector *p) {
1001984
delete p;
@@ -1891,4 +1874,42 @@ SherpaOnnxOfflineSpeakerDiarizationProcessWithCallbackNoArg(
18911874
return ans;
18921875
}
18931876

1877+
#ifdef __OHOS__
1878+
1879+
const SherpaOnnxOfflineRecognizer *SherpaOnnxCreateOfflineRecognizerOHOS(
1880+
const SherpaOnnxOfflineRecognizerConfig *config,
1881+
NativeResourceManager *mgr) {
1882+
if (mgr == nullptr) {
1883+
return SherpaOnnxCreateOfflineRecognizer(config);
1884+
}
1885+
1886+
sherpa_onnx::OfflineRecognizerConfig recognizer_config =
1887+
GetOfflineRecognizerConfig(config);
1888+
1889+
SherpaOnnxOfflineRecognizer *recognizer = new SherpaOnnxOfflineRecognizer;
1890+
1891+
recognizer->impl =
1892+
std::make_unique<sherpa_onnx::OfflineRecognizer>(mgr, recognizer_config);
1893+
1894+
return recognizer;
1895+
}
1896+
1897+
SherpaOnnxVoiceActivityDetector *SherpaOnnxCreateVoiceActivityDetectorOHOS(
1898+
const SherpaOnnxVadModelConfig *config, float buffer_size_in_seconds,
1899+
NativeResourceManager *mgr) {
1900+
if (mgr == nullptr) {
1901+
return SherpaOnnxCreateVoiceActivityDetector(config,
1902+
buffer_size_in_seconds);
1903+
}
1904+
1905+
auto vad_config = GetVadModelConfig(config);
1906+
1907+
SherpaOnnxVoiceActivityDetector *p = new SherpaOnnxVoiceActivityDetector;
1908+
p->impl = std::make_unique<sherpa_onnx::VoiceActivityDetector>(
1909+
mgr, vad_config, buffer_size_in_seconds);
1910+
1911+
return p;
1912+
}
1913+
#endif
1914+
18941915
#endif

sherpa-onnx/c-api/c-api.h

+23-15
Original file line numberDiff line numberDiff line change
@@ -841,21 +841,6 @@ SHERPA_ONNX_API SherpaOnnxVoiceActivityDetector *
841841
SherpaOnnxCreateVoiceActivityDetector(const SherpaOnnxVadModelConfig *config,
842842
float buffer_size_in_seconds);
843843

844-
#ifdef __OHOS__
845-
846-
// Return an instance of VoiceActivityDetector.
847-
// The user has to use SherpaOnnxDestroyVoiceActivityDetector() to free
848-
// the returned pointer to avoid memory leak.
849-
//
850-
// It is for HarmonyOS
851-
typedef struct NativeResourceManager NativeResourceManager;
852-
853-
SHERPA_ONNX_API SherpaOnnxVoiceActivityDetector *
854-
SherpaOnnxCreateVoiceActivityDetectorOHOS(
855-
const SherpaOnnxVadModelConfig *config, float buffer_size_in_seconds,
856-
NativeResourceManager *mgr);
857-
#endif
858-
859844
SHERPA_ONNX_API void SherpaOnnxDestroyVoiceActivityDetector(
860845
SherpaOnnxVoiceActivityDetector *p);
861846

@@ -1537,6 +1522,29 @@ SherpaOnnxOfflineSpeakerDiarizationProcessWithCallbackNoArg(
15371522
SHERPA_ONNX_API void SherpaOnnxOfflineSpeakerDiarizationDestroyResult(
15381523
const SherpaOnnxOfflineSpeakerDiarizationResult *r);
15391524

1525+
#ifdef __OHOS__
1526+
1527+
// It is for HarmonyOS
1528+
typedef struct NativeResourceManager NativeResourceManager;
1529+
1530+
/// @param config Config for the recognizer.
1531+
/// @return Return a pointer to the recognizer. The user has to invoke
1532+
// SherpaOnnxDestroyOfflineRecognizer() to free it to avoid memory
1533+
// leak.
1534+
SHERPA_ONNX_API const SherpaOnnxOfflineRecognizer *
1535+
SherpaOnnxCreateOfflineRecognizerOHOS(
1536+
const SherpaOnnxOfflineRecognizerConfig *config,
1537+
NativeResourceManager *mgr);
1538+
1539+
// Return an instance of VoiceActivityDetector.
1540+
// The user has to use SherpaOnnxDestroyVoiceActivityDetector() to free
1541+
// the returned pointer to avoid memory leak.
1542+
SHERPA_ONNX_API SherpaOnnxVoiceActivityDetector *
1543+
SherpaOnnxCreateVoiceActivityDetectorOHOS(
1544+
const SherpaOnnxVadModelConfig *config, float buffer_size_in_seconds,
1545+
NativeResourceManager *mgr);
1546+
#endif
1547+
15401548
#if defined(__GNUC__)
15411549
#pragma GCC diagnostic pop
15421550
#endif

sherpa-onnx/c-api/cxx-api.h

-5
Original file line numberDiff line numberDiff line change
@@ -214,11 +214,6 @@ struct SHERPA_ONNX_API OfflineTdnnModelConfig {
214214
std::string model;
215215
};
216216

217-
struct SHERPA_ONNX_API SherpaOnnxOfflineLMConfig {
218-
std::string model;
219-
float scale = 1.0;
220-
};
221-
222217
struct SHERPA_ONNX_API OfflineSenseVoiceModelConfig {
223218
std::string model;
224219
std::string language;

sherpa-onnx/csrc/offline-ctc-model.cc

+25-4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,15 @@
99
#include <sstream>
1010
#include <string>
1111

12+
#if __ANDROID_API__ >= 9
13+
#include "android/asset_manager.h"
14+
#include "android/asset_manager_jni.h"
15+
#endif
16+
17+
#if __OHOS__
18+
#include "rawfile/raw_file_manager.h"
19+
#endif
20+
1221
#include "sherpa-onnx/csrc/macros.h"
1322
#include "sherpa-onnx/csrc/offline-nemo-enc-dec-ctc-model.h"
1423
#include "sherpa-onnx/csrc/offline-tdnn-ctc-model.h"
@@ -48,7 +57,11 @@ static ModelType GetModelType(char *model_data, size_t model_data_length,
4857
if (debug) {
4958
std::ostringstream os;
5059
PrintModelMetadata(os, meta_data);
51-
SHERPA_ONNX_LOGE("%s", os.str().c_str());
60+
#if __OHOS__
61+
SHERPA_ONNX_LOGE("%{public}s\n", os.str().c_str());
62+
#else
63+
SHERPA_ONNX_LOGE("%s\n", os.str().c_str());
64+
#endif
5265
}
5366

5467
Ort::AllocatorWithDefaultOptions allocator;
@@ -144,10 +157,9 @@ std::unique_ptr<OfflineCtcModel> OfflineCtcModel::Create(
144157
return nullptr;
145158
}
146159

147-
#if __ANDROID_API__ >= 9
148-
160+
template <typename Manager>
149161
std::unique_ptr<OfflineCtcModel> OfflineCtcModel::Create(
150-
AAssetManager *mgr, const OfflineModelConfig &config) {
162+
Manager *mgr, const OfflineModelConfig &config) {
151163
// TODO(fangjun): Refactor it. We don't need to use model_type here
152164
ModelType model_type = ModelType::kUnknown;
153165

@@ -196,6 +208,15 @@ std::unique_ptr<OfflineCtcModel> OfflineCtcModel::Create(
196208

197209
return nullptr;
198210
}
211+
212+
#if __ANDROID_API__ >= 9
213+
template std::unique_ptr<OfflineCtcModel> OfflineCtcModel::Create(
214+
AAssetManager *mgr, const OfflineModelConfig &config);
215+
#endif
216+
217+
#if __OHOS__
218+
template std::unique_ptr<OfflineCtcModel> OfflineCtcModel::Create(
219+
NativeResourceManager *mgr, const OfflineModelConfig &config);
199220
#endif
200221

201222
} // namespace sherpa_onnx

sherpa-onnx/csrc/offline-ctc-model.h

+2-8
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,6 @@
88
#include <string>
99
#include <vector>
1010

11-
#if __ANDROID_API__ >= 9
12-
#include "android/asset_manager.h"
13-
#include "android/asset_manager_jni.h"
14-
#endif
15-
1611
#include "onnxruntime_cxx_api.h" // NOLINT
1712
#include "sherpa-onnx/csrc/offline-model-config.h"
1813

@@ -25,10 +20,9 @@ class OfflineCtcModel {
2520
static std::unique_ptr<OfflineCtcModel> Create(
2621
const OfflineModelConfig &config);
2722

28-
#if __ANDROID_API__ >= 9
23+
template <typename Manager>
2924
static std::unique_ptr<OfflineCtcModel> Create(
30-
AAssetManager *mgr, const OfflineModelConfig &config);
31-
#endif
25+
Manager *mgr, const OfflineModelConfig &config);
3226

3327
/** Run the forward method of the model.
3428
*

sherpa-onnx/csrc/offline-lm.cc

+21-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,15 @@
88
#include <utility>
99
#include <vector>
1010

11+
#if __ANDROID_API__ >= 9
12+
#include "android/asset_manager.h"
13+
#include "android/asset_manager_jni.h"
14+
#endif
15+
16+
#if __OHOS__
17+
#include "rawfile/raw_file_manager.h"
18+
#endif
19+
1120
#include "sherpa-onnx/csrc/offline-rnn-lm.h"
1221

1322
namespace sherpa_onnx {
@@ -16,12 +25,11 @@ std::unique_ptr<OfflineLM> OfflineLM::Create(const OfflineLMConfig &config) {
1625
return std::make_unique<OfflineRnnLM>(config);
1726
}
1827

19-
#if __ANDROID_API__ >= 9
20-
std::unique_ptr<OfflineLM> OfflineLM::Create(AAssetManager *mgr,
28+
template <typename Manager>
29+
std::unique_ptr<OfflineLM> OfflineLM::Create(Manager *mgr,
2130
const OfflineLMConfig &config) {
2231
return std::make_unique<OfflineRnnLM>(mgr, config);
2332
}
24-
#endif
2533

2634
void OfflineLM::ComputeLMScore(float scale, int32_t context_size,
2735
std::vector<Hypotheses> *hyps) {
@@ -75,4 +83,14 @@ void OfflineLM::ComputeLMScore(float scale, int32_t context_size,
7583
}
7684
}
7785

86+
#if __ANDROID_API__ >= 9
87+
template std::unique_ptr<OfflineLM> OfflineLM::Create(
88+
AAssetManager *mgr, const OfflineLMConfig &config);
89+
#endif
90+
91+
#if __OHOS__
92+
template std::unique_ptr<OfflineLM> OfflineLM::Create(
93+
NativeResourceManager *mgr, const OfflineLMConfig &config);
94+
#endif
95+
7896
} // namespace sherpa_onnx

sherpa-onnx/csrc/offline-lm.h

+2-8
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,6 @@
88
#include <memory>
99
#include <vector>
1010

11-
#if __ANDROID_API__ >= 9
12-
#include "android/asset_manager.h"
13-
#include "android/asset_manager_jni.h"
14-
#endif
15-
1611
#include "onnxruntime_cxx_api.h" // NOLINT
1712
#include "sherpa-onnx/csrc/hypothesis.h"
1813
#include "sherpa-onnx/csrc/offline-lm-config.h"
@@ -25,10 +20,9 @@ class OfflineLM {
2520

2621
static std::unique_ptr<OfflineLM> Create(const OfflineLMConfig &config);
2722

28-
#if __ANDROID_API__ >= 9
29-
static std::unique_ptr<OfflineLM> Create(AAssetManager *mgr,
23+
template <typename Manager>
24+
static std::unique_ptr<OfflineLM> Create(Manager *mgr,
3025
const OfflineLMConfig &config);
31-
#endif
3226

3327
/** Rescore a batch of sentences.
3428
*

0 commit comments

Comments
 (0)