Skip to content

Commit dc3287f

Browse files
authored
Add HarmonyOS support for text-to-speech. (#1584)
1 parent a3d6e1a commit dc3287f

33 files changed

+333
-133
lines changed

.github/workflows/lazarus.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ jobs:
5656
key: ${{ matrix.os }}
5757

5858
# See https://github.com/gcarreno/setup-lazarus
59-
- uses: gcarreno/setup-lazarus@v3
59+
- uses: gcarreno/setup-lazarus@v3.3.1
6060
with:
6161
lazarus-version: "stable"
6262
with-cache: true

.github/workflows/test-nodejs-npm.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ jobs:
2626
fail-fast: false
2727
matrix:
2828
os: [ubuntu-latest, macos-latest, windows-2019]
29-
python-version: ["3.8"]
29+
python-version: ["3.10"]
3030

3131
steps:
3232
- uses: actions/checkout@v4

harmony-os/SherpaOnnxHar/sherpa_onnx/BuildProfile.ets

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
* Use these variables when you tailor your ArkTS code. They must be of the const type.
33
*/
44
export const HAR_VERSION = '1.10.32';
5-
export const BUILD_MODE_NAME = 'release';
6-
export const DEBUG = false;
5+
export const BUILD_MODE_NAME = 'debug';
6+
export const DEBUG = true;
77
export const TARGET_NAME = 'default';
88

99
/**

harmony-os/SherpaOnnxHar/sherpa_onnx/Index.ets

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,12 @@ export {
3838
OnlineRecognizerResult,
3939
OnlineRecognizer,
4040
} from './src/main/ets/components/StreamingAsr';
41+
42+
export {
43+
OfflineTtsVitsModelConfig,
44+
OfflineTtsModelConfig,
45+
OfflineTtsConfig,
46+
OfflineTts,
47+
TtsOutput,
48+
TtsInput,
49+
} from './src/main/ets/components/NonStreamingTts';

harmony-os/SherpaOnnxHar/sherpa_onnx/src/main/cpp/macros.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
#include <string>
99

1010
#if __OHOS__
11-
#include "rawfile/raw_file_manager.h"
1211
#include "hilog/log.h"
12+
#include "rawfile/raw_file_manager.h"
1313

1414
#undef LOG_DOMAIN
1515
#undef LOG_TAG

harmony-os/SherpaOnnxHar/sherpa_onnx/src/main/cpp/non-streaming-asr.cc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,10 @@ CreateOfflineRecognizerWrapper(const Napi::CallbackInfo &info) {
236236
SHERPA_ONNX_ASSIGN_ATTR_FLOAT(blank_penalty, blankPenalty);
237237

238238
#if __OHOS__
239-
std::unique_ptr<NativeResourceManager, decltype(&OH_ResourceManager_ReleaseNativeResourceManager)> mgr (OH_ResourceManager_InitNativeResourceManager(env, info[1]), &OH_ResourceManager_ReleaseNativeResourceManager);
239+
std::unique_ptr<NativeResourceManager,
240+
decltype(&OH_ResourceManager_ReleaseNativeResourceManager)>
241+
mgr(OH_ResourceManager_InitNativeResourceManager(env, info[1]),
242+
&OH_ResourceManager_ReleaseNativeResourceManager);
240243

241244
const SherpaOnnxOfflineRecognizer *recognizer =
242245
SherpaOnnxCreateOfflineRecognizerOHOS(&c, mgr.get());

harmony-os/SherpaOnnxHar/sherpa_onnx/src/main/cpp/non-streaming-tts.cc

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,17 @@ static SherpaOnnxOfflineTtsModelConfig GetOfflineTtsModelConfig(
6363
static Napi::External<SherpaOnnxOfflineTts> CreateOfflineTtsWrapper(
6464
const Napi::CallbackInfo &info) {
6565
Napi::Env env = info.Env();
66+
#if __OHOS__
67+
// the last argument is the NativeResourceManager
68+
if (info.Length() != 2) {
69+
std::ostringstream os;
70+
os << "Expect only 2 arguments. Given: " << info.Length();
71+
72+
Napi::TypeError::New(env, os.str()).ThrowAsJavaScriptException();
73+
74+
return {};
75+
}
76+
#else
6677
if (info.Length() != 1) {
6778
std::ostringstream os;
6879
os << "Expect only 1 argument. Given: " << info.Length();
@@ -71,6 +82,7 @@ static Napi::External<SherpaOnnxOfflineTts> CreateOfflineTtsWrapper(
7182

7283
return {};
7384
}
85+
#endif
7486

7587
if (!info[0].IsObject()) {
7688
Napi::TypeError::New(env, "Expect an object as the argument")
@@ -90,7 +102,15 @@ static Napi::External<SherpaOnnxOfflineTts> CreateOfflineTtsWrapper(
90102
SHERPA_ONNX_ASSIGN_ATTR_INT32(max_num_sentences, maxNumSentences);
91103
SHERPA_ONNX_ASSIGN_ATTR_STR(rule_fars, ruleFars);
92104

105+
#if __OHOS__
106+
std::unique_ptr<NativeResourceManager,
107+
decltype(&OH_ResourceManager_ReleaseNativeResourceManager)>
108+
mgr(OH_ResourceManager_InitNativeResourceManager(env, info[1]),
109+
&OH_ResourceManager_ReleaseNativeResourceManager);
110+
SherpaOnnxOfflineTts *tts = SherpaOnnxCreateOfflineTtsOHOS(&c, mgr.get());
111+
#else
93112
SherpaOnnxOfflineTts *tts = SherpaOnnxCreateOfflineTts(&c);
113+
#endif
94114

95115
if (c.model.vits.model) {
96116
delete[] c.model.vits.model;

harmony-os/SherpaOnnxHar/sherpa_onnx/src/main/cpp/streaming-asr.cc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,10 @@ static Napi::External<SherpaOnnxOnlineRecognizer> CreateOnlineRecognizerWrapper(
211211
c.ctc_fst_decoder_config = GetCtcFstDecoderConfig(o);
212212

213213
#if __OHOS__
214-
std::unique_ptr<NativeResourceManager, decltype(&OH_ResourceManager_ReleaseNativeResourceManager)> mgr (OH_ResourceManager_InitNativeResourceManager(env, info[1]), &OH_ResourceManager_ReleaseNativeResourceManager);
214+
std::unique_ptr<NativeResourceManager,
215+
decltype(&OH_ResourceManager_ReleaseNativeResourceManager)>
216+
mgr(OH_ResourceManager_InitNativeResourceManager(env, info[1]),
217+
&OH_ResourceManager_ReleaseNativeResourceManager);
215218

216219
const SherpaOnnxOnlineRecognizer *recognizer =
217220
SherpaOnnxCreateOnlineRecognizerOHOS(&c, mgr.get());

harmony-os/SherpaOnnxHar/sherpa_onnx/src/main/cpp/types/libsherpa_onnx/Index.d.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,8 @@ export const decodeOnlineStream: (handle: object, streamHandle: object) => void;
3333
export const isEndpoint: (handle: object, streamHandle: object) => boolean;
3434
export const reset: (handle: object, streamHandle: object) => void;
3535
export const getOnlineStreamResultAsJson: (handle: object, streamHandle: object) => string;
36+
37+
export const createOfflineTts: (config: object, mgr?: object) => object;
38+
export const getOfflineTtsNumSpeakers: (handle: object) => number;
39+
export const getOfflineTtsSampleRate: (handle: object) => number;
40+
export const offlineTtsGenerate: (handle: object, input: object) => object;

harmony-os/SherpaOnnxHar/sherpa_onnx/src/main/cpp/vad.cc

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,10 @@ static void CircularBufferPushWrapper(const Napi::CallbackInfo &info) {
7070

7171
#if __OHOS__
7272
// Note(fangjun): Normally, we don't need to divied it by sizeof(float).
73-
// However, data.ElementLength() here returns number of bytes, not number of elements.
74-
SherpaOnnxCircularBufferPush(buf, data.Data(), data.ElementLength() / sizeof(float));
73+
// However, data.ElementLength() here returns number of bytes, not number of
74+
// elements.
75+
SherpaOnnxCircularBufferPush(buf, data.Data(),
76+
data.ElementLength() / sizeof(float));
7577
#else
7678
SherpaOnnxCircularBufferPush(buf, data.Data(), data.ElementLength());
7779
#endif
@@ -353,10 +355,14 @@ CreateVoiceActivityDetectorWrapper(const Napi::CallbackInfo &info) {
353355
float buffer_size_in_seconds = info[1].As<Napi::Number>().FloatValue();
354356

355357
#if __OHOS__
356-
std::unique_ptr<NativeResourceManager, decltype(&OH_ResourceManager_ReleaseNativeResourceManager)> mgr(OH_ResourceManager_InitNativeResourceManager(env, info[2]), &OH_ResourceManager_ReleaseNativeResourceManager);
358+
std::unique_ptr<NativeResourceManager,
359+
decltype(&OH_ResourceManager_ReleaseNativeResourceManager)>
360+
mgr(OH_ResourceManager_InitNativeResourceManager(env, info[2]),
361+
&OH_ResourceManager_ReleaseNativeResourceManager);
357362

358363
SherpaOnnxVoiceActivityDetector *vad =
359-
SherpaOnnxCreateVoiceActivityDetectorOHOS(&c, buffer_size_in_seconds, mgr.get());
364+
SherpaOnnxCreateVoiceActivityDetectorOHOS(&c, buffer_size_in_seconds,
365+
mgr.get());
360366
#else
361367
SherpaOnnxVoiceActivityDetector *vad =
362368
SherpaOnnxCreateVoiceActivityDetector(&c, buffer_size_in_seconds);
@@ -410,9 +416,10 @@ static void VoiceActivityDetectorAcceptWaveformWrapper(
410416
Napi::Float32Array samples = info[1].As<Napi::Float32Array>();
411417

412418
#if __OHOS__
413-
// Note(fangjun): For unknown reasons, we need to use `/sizeof(float)` here for Huawei
414-
SherpaOnnxVoiceActivityDetectorAcceptWaveform(vad, samples.Data(),
415-
samples.ElementLength() / sizeof(float));
419+
// Note(fangjun): For unknown reasons, we need to use `/sizeof(float)` here
420+
// for Huawei
421+
SherpaOnnxVoiceActivityDetectorAcceptWaveform(
422+
vad, samples.Data(), samples.ElementLength() / sizeof(float));
416423
#else
417424
SherpaOnnxVoiceActivityDetectorAcceptWaveform(vad, samples.Data(),
418425
samples.ElementLength());

0 commit comments

Comments
 (0)