Add HarmonyOS support for text-to-speech. (#1584)
This commit is contained in:
2
.github/workflows/lazarus.yaml
vendored
2
.github/workflows/lazarus.yaml
vendored
@@ -56,7 +56,7 @@ jobs:
|
|||||||
key: ${{ matrix.os }}
|
key: ${{ matrix.os }}
|
||||||
|
|
||||||
# See https://github.com/gcarreno/setup-lazarus
|
# See https://github.com/gcarreno/setup-lazarus
|
||||||
- uses: gcarreno/setup-lazarus@v3
|
- uses: gcarreno/setup-lazarus@v3.3.1
|
||||||
with:
|
with:
|
||||||
lazarus-version: "stable"
|
lazarus-version: "stable"
|
||||||
with-cache: true
|
with-cache: true
|
||||||
|
|||||||
2
.github/workflows/test-nodejs-npm.yaml
vendored
2
.github/workflows/test-nodejs-npm.yaml
vendored
@@ -26,7 +26,7 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-latest, macos-latest, windows-2019]
|
os: [ubuntu-latest, macos-latest, windows-2019]
|
||||||
python-version: ["3.8"]
|
python-version: ["3.10"]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
* Use these variables when you tailor your ArkTS code. They must be of the const type.
|
* Use these variables when you tailor your ArkTS code. They must be of the const type.
|
||||||
*/
|
*/
|
||||||
export const HAR_VERSION = '1.10.32';
|
export const HAR_VERSION = '1.10.32';
|
||||||
export const BUILD_MODE_NAME = 'release';
|
export const BUILD_MODE_NAME = 'debug';
|
||||||
export const DEBUG = false;
|
export const DEBUG = true;
|
||||||
export const TARGET_NAME = 'default';
|
export const TARGET_NAME = 'default';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -38,3 +38,12 @@ export {
|
|||||||
OnlineRecognizerResult,
|
OnlineRecognizerResult,
|
||||||
OnlineRecognizer,
|
OnlineRecognizer,
|
||||||
} from './src/main/ets/components/StreamingAsr';
|
} from './src/main/ets/components/StreamingAsr';
|
||||||
|
|
||||||
|
export {
|
||||||
|
OfflineTtsVitsModelConfig,
|
||||||
|
OfflineTtsModelConfig,
|
||||||
|
OfflineTtsConfig,
|
||||||
|
OfflineTts,
|
||||||
|
TtsOutput,
|
||||||
|
TtsInput,
|
||||||
|
} from './src/main/ets/components/NonStreamingTts';
|
||||||
|
|||||||
@@ -8,8 +8,8 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#if __OHOS__
|
#if __OHOS__
|
||||||
#include "rawfile/raw_file_manager.h"
|
|
||||||
#include "hilog/log.h"
|
#include "hilog/log.h"
|
||||||
|
#include "rawfile/raw_file_manager.h"
|
||||||
|
|
||||||
#undef LOG_DOMAIN
|
#undef LOG_DOMAIN
|
||||||
#undef LOG_TAG
|
#undef LOG_TAG
|
||||||
|
|||||||
@@ -236,7 +236,10 @@ CreateOfflineRecognizerWrapper(const Napi::CallbackInfo &info) {
|
|||||||
SHERPA_ONNX_ASSIGN_ATTR_FLOAT(blank_penalty, blankPenalty);
|
SHERPA_ONNX_ASSIGN_ATTR_FLOAT(blank_penalty, blankPenalty);
|
||||||
|
|
||||||
#if __OHOS__
|
#if __OHOS__
|
||||||
std::unique_ptr<NativeResourceManager, decltype(&OH_ResourceManager_ReleaseNativeResourceManager)> mgr (OH_ResourceManager_InitNativeResourceManager(env, info[1]), &OH_ResourceManager_ReleaseNativeResourceManager);
|
std::unique_ptr<NativeResourceManager,
|
||||||
|
decltype(&OH_ResourceManager_ReleaseNativeResourceManager)>
|
||||||
|
mgr(OH_ResourceManager_InitNativeResourceManager(env, info[1]),
|
||||||
|
&OH_ResourceManager_ReleaseNativeResourceManager);
|
||||||
|
|
||||||
const SherpaOnnxOfflineRecognizer *recognizer =
|
const SherpaOnnxOfflineRecognizer *recognizer =
|
||||||
SherpaOnnxCreateOfflineRecognizerOHOS(&c, mgr.get());
|
SherpaOnnxCreateOfflineRecognizerOHOS(&c, mgr.get());
|
||||||
|
|||||||
@@ -63,6 +63,17 @@ static SherpaOnnxOfflineTtsModelConfig GetOfflineTtsModelConfig(
|
|||||||
static Napi::External<SherpaOnnxOfflineTts> CreateOfflineTtsWrapper(
|
static Napi::External<SherpaOnnxOfflineTts> CreateOfflineTtsWrapper(
|
||||||
const Napi::CallbackInfo &info) {
|
const Napi::CallbackInfo &info) {
|
||||||
Napi::Env env = info.Env();
|
Napi::Env env = info.Env();
|
||||||
|
#if __OHOS__
|
||||||
|
// the last argument is the NativeResourceManager
|
||||||
|
if (info.Length() != 2) {
|
||||||
|
std::ostringstream os;
|
||||||
|
os << "Expect only 2 arguments. Given: " << info.Length();
|
||||||
|
|
||||||
|
Napi::TypeError::New(env, os.str()).ThrowAsJavaScriptException();
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
#else
|
||||||
if (info.Length() != 1) {
|
if (info.Length() != 1) {
|
||||||
std::ostringstream os;
|
std::ostringstream os;
|
||||||
os << "Expect only 1 argument. Given: " << info.Length();
|
os << "Expect only 1 argument. Given: " << info.Length();
|
||||||
@@ -71,6 +82,7 @@ static Napi::External<SherpaOnnxOfflineTts> CreateOfflineTtsWrapper(
|
|||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!info[0].IsObject()) {
|
if (!info[0].IsObject()) {
|
||||||
Napi::TypeError::New(env, "Expect an object as the argument")
|
Napi::TypeError::New(env, "Expect an object as the argument")
|
||||||
@@ -90,7 +102,15 @@ static Napi::External<SherpaOnnxOfflineTts> CreateOfflineTtsWrapper(
|
|||||||
SHERPA_ONNX_ASSIGN_ATTR_INT32(max_num_sentences, maxNumSentences);
|
SHERPA_ONNX_ASSIGN_ATTR_INT32(max_num_sentences, maxNumSentences);
|
||||||
SHERPA_ONNX_ASSIGN_ATTR_STR(rule_fars, ruleFars);
|
SHERPA_ONNX_ASSIGN_ATTR_STR(rule_fars, ruleFars);
|
||||||
|
|
||||||
|
#if __OHOS__
|
||||||
|
std::unique_ptr<NativeResourceManager,
|
||||||
|
decltype(&OH_ResourceManager_ReleaseNativeResourceManager)>
|
||||||
|
mgr(OH_ResourceManager_InitNativeResourceManager(env, info[1]),
|
||||||
|
&OH_ResourceManager_ReleaseNativeResourceManager);
|
||||||
|
SherpaOnnxOfflineTts *tts = SherpaOnnxCreateOfflineTtsOHOS(&c, mgr.get());
|
||||||
|
#else
|
||||||
SherpaOnnxOfflineTts *tts = SherpaOnnxCreateOfflineTts(&c);
|
SherpaOnnxOfflineTts *tts = SherpaOnnxCreateOfflineTts(&c);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (c.model.vits.model) {
|
if (c.model.vits.model) {
|
||||||
delete[] c.model.vits.model;
|
delete[] c.model.vits.model;
|
||||||
|
|||||||
@@ -211,7 +211,10 @@ static Napi::External<SherpaOnnxOnlineRecognizer> CreateOnlineRecognizerWrapper(
|
|||||||
c.ctc_fst_decoder_config = GetCtcFstDecoderConfig(o);
|
c.ctc_fst_decoder_config = GetCtcFstDecoderConfig(o);
|
||||||
|
|
||||||
#if __OHOS__
|
#if __OHOS__
|
||||||
std::unique_ptr<NativeResourceManager, decltype(&OH_ResourceManager_ReleaseNativeResourceManager)> mgr (OH_ResourceManager_InitNativeResourceManager(env, info[1]), &OH_ResourceManager_ReleaseNativeResourceManager);
|
std::unique_ptr<NativeResourceManager,
|
||||||
|
decltype(&OH_ResourceManager_ReleaseNativeResourceManager)>
|
||||||
|
mgr(OH_ResourceManager_InitNativeResourceManager(env, info[1]),
|
||||||
|
&OH_ResourceManager_ReleaseNativeResourceManager);
|
||||||
|
|
||||||
const SherpaOnnxOnlineRecognizer *recognizer =
|
const SherpaOnnxOnlineRecognizer *recognizer =
|
||||||
SherpaOnnxCreateOnlineRecognizerOHOS(&c, mgr.get());
|
SherpaOnnxCreateOnlineRecognizerOHOS(&c, mgr.get());
|
||||||
|
|||||||
@@ -33,3 +33,8 @@ export const decodeOnlineStream: (handle: object, streamHandle: object) => void;
|
|||||||
export const isEndpoint: (handle: object, streamHandle: object) => boolean;
|
export const isEndpoint: (handle: object, streamHandle: object) => boolean;
|
||||||
export const reset: (handle: object, streamHandle: object) => void;
|
export const reset: (handle: object, streamHandle: object) => void;
|
||||||
export const getOnlineStreamResultAsJson: (handle: object, streamHandle: object) => string;
|
export const getOnlineStreamResultAsJson: (handle: object, streamHandle: object) => string;
|
||||||
|
|
||||||
|
export const createOfflineTts: (config: object, mgr?: object) => object;
|
||||||
|
export const getOfflineTtsNumSpeakers: (handle: object) => number;
|
||||||
|
export const getOfflineTtsSampleRate: (handle: object) => number;
|
||||||
|
export const offlineTtsGenerate: (handle: object, input: object) => object;
|
||||||
|
|||||||
@@ -70,8 +70,10 @@ static void CircularBufferPushWrapper(const Napi::CallbackInfo &info) {
|
|||||||
|
|
||||||
#if __OHOS__
|
#if __OHOS__
|
||||||
// Note(fangjun): Normally, we don't need to divied it by sizeof(float).
|
// Note(fangjun): Normally, we don't need to divied it by sizeof(float).
|
||||||
// However, data.ElementLength() here returns number of bytes, not number of elements.
|
// However, data.ElementLength() here returns number of bytes, not number of
|
||||||
SherpaOnnxCircularBufferPush(buf, data.Data(), data.ElementLength() / sizeof(float));
|
// elements.
|
||||||
|
SherpaOnnxCircularBufferPush(buf, data.Data(),
|
||||||
|
data.ElementLength() / sizeof(float));
|
||||||
#else
|
#else
|
||||||
SherpaOnnxCircularBufferPush(buf, data.Data(), data.ElementLength());
|
SherpaOnnxCircularBufferPush(buf, data.Data(), data.ElementLength());
|
||||||
#endif
|
#endif
|
||||||
@@ -353,10 +355,14 @@ CreateVoiceActivityDetectorWrapper(const Napi::CallbackInfo &info) {
|
|||||||
float buffer_size_in_seconds = info[1].As<Napi::Number>().FloatValue();
|
float buffer_size_in_seconds = info[1].As<Napi::Number>().FloatValue();
|
||||||
|
|
||||||
#if __OHOS__
|
#if __OHOS__
|
||||||
std::unique_ptr<NativeResourceManager, decltype(&OH_ResourceManager_ReleaseNativeResourceManager)> mgr(OH_ResourceManager_InitNativeResourceManager(env, info[2]), &OH_ResourceManager_ReleaseNativeResourceManager);
|
std::unique_ptr<NativeResourceManager,
|
||||||
|
decltype(&OH_ResourceManager_ReleaseNativeResourceManager)>
|
||||||
|
mgr(OH_ResourceManager_InitNativeResourceManager(env, info[2]),
|
||||||
|
&OH_ResourceManager_ReleaseNativeResourceManager);
|
||||||
|
|
||||||
SherpaOnnxVoiceActivityDetector *vad =
|
SherpaOnnxVoiceActivityDetector *vad =
|
||||||
SherpaOnnxCreateVoiceActivityDetectorOHOS(&c, buffer_size_in_seconds, mgr.get());
|
SherpaOnnxCreateVoiceActivityDetectorOHOS(&c, buffer_size_in_seconds,
|
||||||
|
mgr.get());
|
||||||
#else
|
#else
|
||||||
SherpaOnnxVoiceActivityDetector *vad =
|
SherpaOnnxVoiceActivityDetector *vad =
|
||||||
SherpaOnnxCreateVoiceActivityDetector(&c, buffer_size_in_seconds);
|
SherpaOnnxCreateVoiceActivityDetector(&c, buffer_size_in_seconds);
|
||||||
@@ -410,9 +416,10 @@ static void VoiceActivityDetectorAcceptWaveformWrapper(
|
|||||||
Napi::Float32Array samples = info[1].As<Napi::Float32Array>();
|
Napi::Float32Array samples = info[1].As<Napi::Float32Array>();
|
||||||
|
|
||||||
#if __OHOS__
|
#if __OHOS__
|
||||||
// Note(fangjun): For unknown reasons, we need to use `/sizeof(float)` here for Huawei
|
// Note(fangjun): For unknown reasons, we need to use `/sizeof(float)` here
|
||||||
SherpaOnnxVoiceActivityDetectorAcceptWaveform(vad, samples.Data(),
|
// for Huawei
|
||||||
samples.ElementLength() / sizeof(float));
|
SherpaOnnxVoiceActivityDetectorAcceptWaveform(
|
||||||
|
vad, samples.Data(), samples.ElementLength() / sizeof(float));
|
||||||
#else
|
#else
|
||||||
SherpaOnnxVoiceActivityDetectorAcceptWaveform(vad, samples.Data(),
|
SherpaOnnxVoiceActivityDetectorAcceptWaveform(vad, samples.Data(),
|
||||||
samples.ElementLength());
|
samples.ElementLength());
|
||||||
|
|||||||
@@ -102,10 +102,11 @@ static Napi::Object ReadWaveFromBinaryWrapper(const Napi::CallbackInfo &info) {
|
|||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Napi::Uint8Array data = info[0].As<Napi::Uint8Array>();
|
Napi::Uint8Array data = info[0].As<Napi::Uint8Array>();
|
||||||
int32_t n = data.ElementLength();
|
int32_t n = data.ElementLength();
|
||||||
const SherpaOnnxWave *wave = SherpaOnnxReadWaveFromBinaryData(reinterpret_cast<const char*>(data.Data()), n);
|
const SherpaOnnxWave *wave = SherpaOnnxReadWaveFromBinaryData(
|
||||||
|
reinterpret_cast<const char *>(data.Data()), n);
|
||||||
if (!wave) {
|
if (!wave) {
|
||||||
std::ostringstream os;
|
std::ostringstream os;
|
||||||
os << "Failed to read wave";
|
os << "Failed to read wave";
|
||||||
@@ -113,7 +114,7 @@ static Napi::Object ReadWaveFromBinaryWrapper(const Napi::CallbackInfo &info) {
|
|||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
bool enable_external_buffer = true;
|
bool enable_external_buffer = true;
|
||||||
if (info.Length() == 2) {
|
if (info.Length() == 2) {
|
||||||
if (info[1].IsBoolean()) {
|
if (info[1].IsBoolean()) {
|
||||||
@@ -165,7 +166,7 @@ static Napi::Object ReadWaveFromBinaryWrapper(const Napi::CallbackInfo &info) {
|
|||||||
void InitWaveReader(Napi::Env env, Napi::Object exports) {
|
void InitWaveReader(Napi::Env env, Napi::Object exports) {
|
||||||
exports.Set(Napi::String::New(env, "readWave"),
|
exports.Set(Napi::String::New(env, "readWave"),
|
||||||
Napi::Function::New(env, ReadWaveWrapper));
|
Napi::Function::New(env, ReadWaveWrapper));
|
||||||
|
|
||||||
exports.Set(Napi::String::New(env, "readWaveFromBinary"),
|
exports.Set(Napi::String::New(env, "readWaveFromBinary"),
|
||||||
Napi::Function::New(env, ReadWaveFromBinaryWrapper));
|
Napi::Function::New(env, ReadWaveFromBinaryWrapper));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ export class OfflineModelConfig {
|
|||||||
public tokens: string = '';
|
public tokens: string = '';
|
||||||
public numThreads: number = 1;
|
public numThreads: number = 1;
|
||||||
public debug: boolean = false;
|
public debug: boolean = false;
|
||||||
public provider: string = "cpu";
|
public provider: string = 'cpu';
|
||||||
public modelType: string = '';
|
public modelType: string = '';
|
||||||
public modelingUnit: string = "cjkchar";
|
public modelingUnit: string = "cjkchar";
|
||||||
public bpeVocab: string = '';
|
public bpeVocab: string = '';
|
||||||
|
|||||||
@@ -0,0 +1,66 @@
|
|||||||
|
import {
|
||||||
|
createOfflineTts,
|
||||||
|
getOfflineTtsNumSpeakers,
|
||||||
|
getOfflineTtsSampleRate,
|
||||||
|
offlineTtsGenerate,
|
||||||
|
} from "libsherpa_onnx.so";
|
||||||
|
|
||||||
|
export class OfflineTtsVitsModelConfig {
|
||||||
|
public model: string = '';
|
||||||
|
public lexicon: string = '';
|
||||||
|
public tokens: string = '';
|
||||||
|
public dataDir: string = '';
|
||||||
|
public dictDir: String = '';
|
||||||
|
public noiseScale: number = 0.667;
|
||||||
|
public noiseScaleW: number = 0.8;
|
||||||
|
public lengthScale: number = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class OfflineTtsModelConfig{
|
||||||
|
public vits: OfflineTtsVitsModelConfig = new OfflineTtsVitsModelConfig();
|
||||||
|
public numThreads: number = 1;
|
||||||
|
public debug: boolean = false;
|
||||||
|
public provider: string = 'cpu';
|
||||||
|
}
|
||||||
|
|
||||||
|
export class OfflineTtsConfig{
|
||||||
|
public model: OfflineTtsModelConfig = new OfflineTtsModelConfig();
|
||||||
|
public ruleFsts: string = '';
|
||||||
|
public ruleFars: string = '';
|
||||||
|
public maxNumSentences: number = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class TtsOutput {
|
||||||
|
public samples: Float32Array = new Float32Array(0);
|
||||||
|
public sampleRate: number = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class TtsInput {
|
||||||
|
public text: string = '';
|
||||||
|
public sid: number = 0;
|
||||||
|
public speed: number = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class OfflineTts {
|
||||||
|
private handle: object;
|
||||||
|
public config: OfflineTtsConfig;
|
||||||
|
public numSpeakers: number;
|
||||||
|
public sampleRate: number;
|
||||||
|
constructor(config: OfflineTtsConfig, mgr?: object) {
|
||||||
|
this.handle = createOfflineTts(config, mgr);
|
||||||
|
this.config = config;
|
||||||
|
|
||||||
|
this.numSpeakers = getOfflineTtsNumSpeakers(this.handle);
|
||||||
|
this.sampleRate = getOfflineTtsSampleRate(this.handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
input obj: {text: "xxxx", sid: 0, speed: 1.0}
|
||||||
|
where text is a string, sid is a int32, speed is a float
|
||||||
|
|
||||||
|
return an object {samples: Float32Array, sampleRate: <a number>}
|
||||||
|
*/
|
||||||
|
generate(input: TtsInput): TtsOutput {
|
||||||
|
return offlineTtsGenerate(this.handle, input) as TtsOutput;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -52,7 +52,7 @@ export class OnlineModelConfig {
|
|||||||
public zipformer2_ctc: OnlineZipformer2CtcModelConfig = new OnlineZipformer2CtcModelConfig();
|
public zipformer2_ctc: OnlineZipformer2CtcModelConfig = new OnlineZipformer2CtcModelConfig();
|
||||||
public tokens: string = '';
|
public tokens: string = '';
|
||||||
public numThreads: number = 1;
|
public numThreads: number = 1;
|
||||||
public provider: string = "cpu";
|
public provider: string = 'cpu';
|
||||||
public debug: boolean = false;
|
public debug: boolean = false;
|
||||||
public modelType: string = '';
|
public modelType: string = '';
|
||||||
public modelingUnit: string = "cjkchar";
|
public modelingUnit: string = "cjkchar";
|
||||||
@@ -67,7 +67,7 @@ export class OnlineCtcFstDecoderConfig {
|
|||||||
export class OnlineRecognizerConfig {
|
export class OnlineRecognizerConfig {
|
||||||
public featConfig: FeatureConfig = new FeatureConfig();
|
public featConfig: FeatureConfig = new FeatureConfig();
|
||||||
public modelConfig: OnlineModelConfig = new OnlineModelConfig();
|
public modelConfig: OnlineModelConfig = new OnlineModelConfig();
|
||||||
public decodingMethod: string = "greedy_search";
|
public decodingMethod: string = 'greedy_search';
|
||||||
public maxActivePaths: number = 4;
|
public maxActivePaths: number = 4;
|
||||||
public enableEndpoint: boolean = false;
|
public enableEndpoint: boolean = false;
|
||||||
public rule1MinTrailingSilence: number = 2.4;
|
public rule1MinTrailingSilence: number = 2.4;
|
||||||
|
|||||||
@@ -54,11 +54,11 @@
|
|||||||
"reason": "$string:mic_reason",
|
"reason": "$string:mic_reason",
|
||||||
"usedScene": {
|
"usedScene": {
|
||||||
"abilities": [
|
"abilities": [
|
||||||
"FormAbility",
|
"EntryAbility",
|
||||||
],
|
],
|
||||||
"when": "always",
|
"when": "inuse",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -103,6 +103,7 @@ function do_check() {
|
|||||||
2)
|
2)
|
||||||
echo "Check all files"
|
echo "Check all files"
|
||||||
files=$(find $sherpa_onnx_dir/cxx-api-examples $sherpa_onnx_dir/c-api-examples $sherpa_onnx_dir/sherpa-onnx/csrc $sherpa_onnx_dir/sherpa-onnx/python $sherpa_onnx_dir/scripts/node-addon-api/src $sherpa_onnx_dir/sherpa-onnx/jni $sherpa_onnx_dir/sherpa-onnx/c-api -name "*.h" -o -name "*.cc")
|
files=$(find $sherpa_onnx_dir/cxx-api-examples $sherpa_onnx_dir/c-api-examples $sherpa_onnx_dir/sherpa-onnx/csrc $sherpa_onnx_dir/sherpa-onnx/python $sherpa_onnx_dir/scripts/node-addon-api/src $sherpa_onnx_dir/sherpa-onnx/jni $sherpa_onnx_dir/sherpa-onnx/c-api -name "*.h" -o -name "*.cc")
|
||||||
|
files2=$(find $sherpa_onnx_dir/harmony-os/SherpaOnnxHar/sherpa_onnx/src/main/cpp/ -name "*.cc")
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo "Check last commit"
|
echo "Check last commit"
|
||||||
@@ -110,7 +111,7 @@ function do_check() {
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
for f in $files; do
|
for f in $files $files2; do
|
||||||
need_check=$(is_source_code_file $f)
|
need_check=$(is_source_code_file $f)
|
||||||
if $need_check; then
|
if $need_check; then
|
||||||
[[ -f $f ]] && check_style $f
|
[[ -f $f ]] && check_style $f
|
||||||
|
|||||||
@@ -485,9 +485,9 @@ static sherpa_onnx::OfflineRecognizerConfig GetOfflineRecognizerConfig(
|
|||||||
|
|
||||||
if (config->model_config.debug) {
|
if (config->model_config.debug) {
|
||||||
#if __OHOS__
|
#if __OHOS__
|
||||||
SHERPA_ONNX_LOGE("%{public}s", recognizer_config.ToString().c_str());
|
SHERPA_ONNX_LOGE("%{public}s\n", recognizer_config.ToString().c_str());
|
||||||
#else
|
#else
|
||||||
SHERPA_ONNX_LOGE("%s", recognizer_config.ToString().c_str());
|
SHERPA_ONNX_LOGE("%s\n", recognizer_config.ToString().c_str());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -967,9 +967,9 @@ sherpa_onnx::VadModelConfig GetVadModelConfig(
|
|||||||
|
|
||||||
if (vad_config.debug) {
|
if (vad_config.debug) {
|
||||||
#if __OHOS__
|
#if __OHOS__
|
||||||
SHERPA_ONNX_LOGE("%{public}s", vad_config.ToString().c_str());
|
SHERPA_ONNX_LOGE("%{public}s\n", vad_config.ToString().c_str());
|
||||||
#else
|
#else
|
||||||
SHERPA_ONNX_LOGE("%s", vad_config.ToString().c_str());
|
SHERPA_ONNX_LOGE("%s\n", vad_config.ToString().c_str());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1053,7 +1053,7 @@ struct SherpaOnnxOfflineTts {
|
|||||||
std::unique_ptr<sherpa_onnx::OfflineTts> impl;
|
std::unique_ptr<sherpa_onnx::OfflineTts> impl;
|
||||||
};
|
};
|
||||||
|
|
||||||
SherpaOnnxOfflineTts *SherpaOnnxCreateOfflineTts(
|
static sherpa_onnx::OfflineTtsConfig GetOfflineTtsConfig(
|
||||||
const SherpaOnnxOfflineTtsConfig *config) {
|
const SherpaOnnxOfflineTtsConfig *config) {
|
||||||
sherpa_onnx::OfflineTtsConfig tts_config;
|
sherpa_onnx::OfflineTtsConfig tts_config;
|
||||||
|
|
||||||
@@ -1084,9 +1084,20 @@ SherpaOnnxOfflineTts *SherpaOnnxCreateOfflineTts(
|
|||||||
tts_config.max_num_sentences = SHERPA_ONNX_OR(config->max_num_sentences, 2);
|
tts_config.max_num_sentences = SHERPA_ONNX_OR(config->max_num_sentences, 2);
|
||||||
|
|
||||||
if (tts_config.model.debug) {
|
if (tts_config.model.debug) {
|
||||||
|
#if __OHOS__
|
||||||
|
SHERPA_ONNX_LOGE("%{public}s\n", tts_config.ToString().c_str());
|
||||||
|
#else
|
||||||
SHERPA_ONNX_LOGE("%s\n", tts_config.ToString().c_str());
|
SHERPA_ONNX_LOGE("%s\n", tts_config.ToString().c_str());
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return tts_config;
|
||||||
|
}
|
||||||
|
|
||||||
|
SherpaOnnxOfflineTts *SherpaOnnxCreateOfflineTts(
|
||||||
|
const SherpaOnnxOfflineTtsConfig *config) {
|
||||||
|
auto tts_config = GetOfflineTtsConfig(config);
|
||||||
|
|
||||||
if (!tts_config.Validate()) {
|
if (!tts_config.Validate()) {
|
||||||
SHERPA_ONNX_LOGE("Errors in config");
|
SHERPA_ONNX_LOGE("Errors in config");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@@ -1908,6 +1919,7 @@ SherpaOnnxOfflineSpeakerDiarizationProcessWithCallbackNoArg(
|
|||||||
|
|
||||||
return ans;
|
return ans;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __OHOS__
|
#ifdef __OHOS__
|
||||||
|
|
||||||
@@ -1959,6 +1971,23 @@ SherpaOnnxVoiceActivityDetector *SherpaOnnxCreateVoiceActivityDetectorOHOS(
|
|||||||
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#if SHERPA_ONNX_ENABLE_TTS == 1
|
||||||
|
SherpaOnnxOfflineTts *SherpaOnnxCreateOfflineTtsOHOS(
|
||||||
|
const SherpaOnnxOfflineTtsConfig *config, NativeResourceManager *mgr) {
|
||||||
|
if (!mgr) {
|
||||||
|
return SherpaOnnxCreateOfflineTts(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto tts_config = GetOfflineTtsConfig(config);
|
||||||
|
|
||||||
|
SherpaOnnxOfflineTts *tts = new SherpaOnnxOfflineTts;
|
||||||
|
|
||||||
|
tts->impl = std::make_unique<sherpa_onnx::OfflineTts>(mgr, tts_config);
|
||||||
|
|
||||||
|
return tts;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // #if SHERPA_ONNX_ENABLE_TTS == 1
|
||||||
|
|
||||||
|
#endif // #ifdef __OHOS__
|
||||||
|
|||||||
@@ -1558,6 +1558,9 @@ SHERPA_ONNX_API SherpaOnnxVoiceActivityDetector *
|
|||||||
SherpaOnnxCreateVoiceActivityDetectorOHOS(
|
SherpaOnnxCreateVoiceActivityDetectorOHOS(
|
||||||
const SherpaOnnxVadModelConfig *config, float buffer_size_in_seconds,
|
const SherpaOnnxVadModelConfig *config, float buffer_size_in_seconds,
|
||||||
NativeResourceManager *mgr);
|
NativeResourceManager *mgr);
|
||||||
|
|
||||||
|
SHERPA_ONNX_API SherpaOnnxOfflineTts *SherpaOnnxCreateOfflineTtsOHOS(
|
||||||
|
const SherpaOnnxOfflineTtsConfig *config, NativeResourceManager *mgr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__GNUC__)
|
#if defined(__GNUC__)
|
||||||
|
|||||||
@@ -7,17 +7,19 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <memory>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <strstream>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
#if __ANDROID_API__ >= 9
|
#if __ANDROID_API__ >= 9
|
||||||
#include <strstream>
|
|
||||||
|
|
||||||
#include "android/asset_manager.h"
|
#include "android/asset_manager.h"
|
||||||
#include "android/asset_manager_jni.h"
|
#include "android/asset_manager_jni.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <memory>
|
#if __OHOS__
|
||||||
|
#include "rawfile/raw_file_manager.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "sherpa-onnx/csrc/macros.h"
|
#include "sherpa-onnx/csrc/macros.h"
|
||||||
#include "sherpa-onnx/csrc/onnx-utils.h"
|
#include "sherpa-onnx/csrc/onnx-utils.h"
|
||||||
@@ -110,8 +112,8 @@ Lexicon::Lexicon(const std::string &lexicon, const std::string &tokens,
|
|||||||
InitPunctuations(punctuations);
|
InitPunctuations(punctuations);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __ANDROID_API__ >= 9
|
template <typename Manager>
|
||||||
Lexicon::Lexicon(AAssetManager *mgr, const std::string &lexicon,
|
Lexicon::Lexicon(Manager *mgr, const std::string &lexicon,
|
||||||
const std::string &tokens, const std::string &punctuations,
|
const std::string &tokens, const std::string &punctuations,
|
||||||
const std::string &language, bool debug /*= false*/
|
const std::string &language, bool debug /*= false*/
|
||||||
)
|
)
|
||||||
@@ -132,7 +134,6 @@ Lexicon::Lexicon(AAssetManager *mgr, const std::string &lexicon,
|
|||||||
|
|
||||||
InitPunctuations(punctuations);
|
InitPunctuations(punctuations);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
std::vector<TokenIDs> Lexicon::ConvertTextToTokenIds(
|
std::vector<TokenIDs> Lexicon::ConvertTextToTokenIds(
|
||||||
const std::string &text, const std::string & /*voice*/ /*= ""*/) const {
|
const std::string &text, const std::string & /*voice*/ /*= ""*/) const {
|
||||||
@@ -371,4 +372,18 @@ void Lexicon::InitPunctuations(const std::string &punctuations) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if __ANDROID_API__ >= 9
|
||||||
|
template Lexicon::Lexicon(AAssetManager *mgr, const std::string &lexicon,
|
||||||
|
const std::string &tokens,
|
||||||
|
const std::string &punctuations,
|
||||||
|
const std::string &language, bool debug = false);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __OHOS__
|
||||||
|
template Lexicon::Lexicon(NativeResourceManager *mgr,
|
||||||
|
const std::string &lexicon, const std::string &tokens,
|
||||||
|
const std::string &punctuations,
|
||||||
|
const std::string &language, bool debug = false);
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace sherpa_onnx
|
} // namespace sherpa_onnx
|
||||||
|
|||||||
@@ -13,11 +13,6 @@
|
|||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#if __ANDROID_API__ >= 9
|
|
||||||
#include "android/asset_manager.h"
|
|
||||||
#include "android/asset_manager_jni.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "sherpa-onnx/csrc/offline-tts-frontend.h"
|
#include "sherpa-onnx/csrc/offline-tts-frontend.h"
|
||||||
|
|
||||||
namespace sherpa_onnx {
|
namespace sherpa_onnx {
|
||||||
@@ -31,11 +26,10 @@ class Lexicon : public OfflineTtsFrontend {
|
|||||||
const std::string &punctuations, const std::string &language,
|
const std::string &punctuations, const std::string &language,
|
||||||
bool debug = false);
|
bool debug = false);
|
||||||
|
|
||||||
#if __ANDROID_API__ >= 9
|
template <typename Manager>
|
||||||
Lexicon(AAssetManager *mgr, const std::string &lexicon,
|
Lexicon(Manager *mgr, const std::string &lexicon, const std::string &tokens,
|
||||||
const std::string &tokens, const std::string &punctuations,
|
const std::string &punctuations, const std::string &language,
|
||||||
const std::string &language, bool debug = false);
|
bool debug = false);
|
||||||
#endif
|
|
||||||
|
|
||||||
std::vector<TokenIDs> ConvertTextToTokenIds(
|
std::vector<TokenIDs> ConvertTextToTokenIds(
|
||||||
const std::string &text, const std::string &voice = "") const override;
|
const std::string &text, const std::string &voice = "") const override;
|
||||||
|
|||||||
@@ -136,7 +136,6 @@ std::unique_ptr<OfflineCtcModel> OfflineCtcModel::Create(
|
|||||||
|
|
||||||
switch (model_type) {
|
switch (model_type) {
|
||||||
case ModelType::kEncDecCTCModelBPE:
|
case ModelType::kEncDecCTCModelBPE:
|
||||||
return std::make_unique<OfflineNemoEncDecCtcModel>(config);
|
|
||||||
case ModelType::kEncDecCTCModel:
|
case ModelType::kEncDecCTCModel:
|
||||||
return std::make_unique<OfflineNemoEncDecCtcModel>(config);
|
return std::make_unique<OfflineNemoEncDecCtcModel>(config);
|
||||||
case ModelType::kEncDecHybridRNNTCTCBPEModel:
|
case ModelType::kEncDecHybridRNNTCTCBPEModel:
|
||||||
@@ -187,7 +186,6 @@ std::unique_ptr<OfflineCtcModel> OfflineCtcModel::Create(
|
|||||||
|
|
||||||
switch (model_type) {
|
switch (model_type) {
|
||||||
case ModelType::kEncDecCTCModelBPE:
|
case ModelType::kEncDecCTCModelBPE:
|
||||||
return std::make_unique<OfflineNemoEncDecCtcModel>(mgr, config);
|
|
||||||
case ModelType::kEncDecCTCModel:
|
case ModelType::kEncDecCTCModel:
|
||||||
return std::make_unique<OfflineNemoEncDecCtcModel>(mgr, config);
|
return std::make_unique<OfflineNemoEncDecCtcModel>(mgr, config);
|
||||||
case ModelType::kEncDecHybridRNNTCTCBPEModel:
|
case ModelType::kEncDecHybridRNNTCTCBPEModel:
|
||||||
|
|||||||
@@ -2,20 +2,24 @@
|
|||||||
//
|
//
|
||||||
// Copyright (c) 2023 Xiaomi Corporation
|
// Copyright (c) 2023 Xiaomi Corporation
|
||||||
|
|
||||||
#if __ANDROID_API__ >= 9
|
|
||||||
#include <strstream>
|
|
||||||
|
|
||||||
#include "android/asset_manager.h"
|
|
||||||
#include "android/asset_manager_jni.h"
|
|
||||||
#endif
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
#include <codecvt>
|
#include <codecvt>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <locale>
|
#include <locale>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <strstream>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
#if __ANDROID_API__ >= 9
|
||||||
|
#include "android/asset_manager.h"
|
||||||
|
#include "android/asset_manager_jni.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __OHOS__
|
||||||
|
#include "rawfile/raw_file_manager.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "sherpa-onnx/csrc/macros.h"
|
#include "sherpa-onnx/csrc/macros.h"
|
||||||
#include "sherpa-onnx/csrc/offline-tts-character-frontend.h"
|
#include "sherpa-onnx/csrc/offline-tts-character-frontend.h"
|
||||||
#include "sherpa-onnx/csrc/onnx-utils.h"
|
#include "sherpa-onnx/csrc/onnx-utils.h"
|
||||||
@@ -82,9 +86,9 @@ OfflineTtsCharacterFrontend::OfflineTtsCharacterFrontend(
|
|||||||
token2id_ = ReadTokens(is);
|
token2id_ = ReadTokens(is);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __ANDROID_API__ >= 9
|
template <typename Manager>
|
||||||
OfflineTtsCharacterFrontend::OfflineTtsCharacterFrontend(
|
OfflineTtsCharacterFrontend::OfflineTtsCharacterFrontend(
|
||||||
AAssetManager *mgr, const std::string &tokens,
|
Manager *mgr, const std::string &tokens,
|
||||||
const OfflineTtsVitsModelMetaData &meta_data)
|
const OfflineTtsVitsModelMetaData &meta_data)
|
||||||
: meta_data_(meta_data) {
|
: meta_data_(meta_data) {
|
||||||
auto buf = ReadFile(mgr, tokens);
|
auto buf = ReadFile(mgr, tokens);
|
||||||
@@ -92,8 +96,6 @@ OfflineTtsCharacterFrontend::OfflineTtsCharacterFrontend(
|
|||||||
token2id_ = ReadTokens(is);
|
token2id_ = ReadTokens(is);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
std::vector<TokenIDs> OfflineTtsCharacterFrontend::ConvertTextToTokenIds(
|
std::vector<TokenIDs> OfflineTtsCharacterFrontend::ConvertTextToTokenIds(
|
||||||
const std::string &_text, const std::string & /*voice = ""*/) const {
|
const std::string &_text, const std::string & /*voice = ""*/) const {
|
||||||
// see
|
// see
|
||||||
@@ -189,4 +191,18 @@ std::vector<TokenIDs> OfflineTtsCharacterFrontend::ConvertTextToTokenIds(
|
|||||||
return ans;
|
return ans;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if __ANDROID_API__ >= 9
|
||||||
|
template OfflineTtsCharacterFrontend::OfflineTtsCharacterFrontend(
|
||||||
|
AAssetManager *mgr, const std::string &tokens,
|
||||||
|
const OfflineTtsVitsModelMetaData &meta_data);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __OHOS__
|
||||||
|
template OfflineTtsCharacterFrontend::OfflineTtsCharacterFrontend(
|
||||||
|
NativeResourceManager *mgr, const std::string &tokens,
|
||||||
|
const OfflineTtsVitsModelMetaData &meta_data);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace sherpa_onnx
|
} // namespace sherpa_onnx
|
||||||
|
|||||||
@@ -9,11 +9,6 @@
|
|||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#if __ANDROID_API__ >= 9
|
|
||||||
#include "android/asset_manager.h"
|
|
||||||
#include "android/asset_manager_jni.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "sherpa-onnx/csrc/offline-tts-frontend.h"
|
#include "sherpa-onnx/csrc/offline-tts-frontend.h"
|
||||||
#include "sherpa-onnx/csrc/offline-tts-vits-model-metadata.h"
|
#include "sherpa-onnx/csrc/offline-tts-vits-model-metadata.h"
|
||||||
|
|
||||||
@@ -24,11 +19,10 @@ class OfflineTtsCharacterFrontend : public OfflineTtsFrontend {
|
|||||||
OfflineTtsCharacterFrontend(const std::string &tokens,
|
OfflineTtsCharacterFrontend(const std::string &tokens,
|
||||||
const OfflineTtsVitsModelMetaData &meta_data);
|
const OfflineTtsVitsModelMetaData &meta_data);
|
||||||
|
|
||||||
#if __ANDROID_API__ >= 9
|
template <typename Manager>
|
||||||
OfflineTtsCharacterFrontend(AAssetManager *mgr, const std::string &tokens,
|
OfflineTtsCharacterFrontend(Manager *mgr, const std::string &tokens,
|
||||||
const OfflineTtsVitsModelMetaData &meta_data);
|
const OfflineTtsVitsModelMetaData &meta_data);
|
||||||
|
|
||||||
#endif
|
|
||||||
/** Convert a string to token IDs.
|
/** Convert a string to token IDs.
|
||||||
*
|
*
|
||||||
* @param text The input text.
|
* @param text The input text.
|
||||||
|
|||||||
@@ -6,6 +6,15 @@
|
|||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
#if __ANDROID_API__ >= 9
|
||||||
|
#include "android/asset_manager.h"
|
||||||
|
#include "android/asset_manager_jni.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __OHOS__
|
||||||
|
#include "rawfile/raw_file_manager.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "sherpa-onnx/csrc/offline-tts-vits-impl.h"
|
#include "sherpa-onnx/csrc/offline-tts-vits-impl.h"
|
||||||
|
|
||||||
namespace sherpa_onnx {
|
namespace sherpa_onnx {
|
||||||
@@ -16,12 +25,21 @@ std::unique_ptr<OfflineTtsImpl> OfflineTtsImpl::Create(
|
|||||||
return std::make_unique<OfflineTtsVitsImpl>(config);
|
return std::make_unique<OfflineTtsVitsImpl>(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __ANDROID_API__ >= 9
|
template <typename Manager>
|
||||||
std::unique_ptr<OfflineTtsImpl> OfflineTtsImpl::Create(
|
std::unique_ptr<OfflineTtsImpl> OfflineTtsImpl::Create(
|
||||||
AAssetManager *mgr, const OfflineTtsConfig &config) {
|
Manager *mgr, const OfflineTtsConfig &config) {
|
||||||
// TODO(fangjun): Support other types
|
// TODO(fangjun): Support other types
|
||||||
return std::make_unique<OfflineTtsVitsImpl>(mgr, config);
|
return std::make_unique<OfflineTtsVitsImpl>(mgr, config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if __ANDROID_API__ >= 9
|
||||||
|
template std::unique_ptr<OfflineTtsImpl> OfflineTtsImpl::Create(
|
||||||
|
AAssetManager *mgr, const OfflineTtsConfig &config);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __OHOS__
|
||||||
|
template std::unique_ptr<OfflineTtsImpl> OfflineTtsImpl::Create(
|
||||||
|
NativeResourceManager *mgr, const OfflineTtsConfig &config);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} // namespace sherpa_onnx
|
} // namespace sherpa_onnx
|
||||||
|
|||||||
@@ -8,11 +8,6 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#if __ANDROID_API__ >= 9
|
|
||||||
#include "android/asset_manager.h"
|
|
||||||
#include "android/asset_manager_jni.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "sherpa-onnx/csrc/offline-tts.h"
|
#include "sherpa-onnx/csrc/offline-tts.h"
|
||||||
|
|
||||||
namespace sherpa_onnx {
|
namespace sherpa_onnx {
|
||||||
@@ -23,10 +18,9 @@ class OfflineTtsImpl {
|
|||||||
|
|
||||||
static std::unique_ptr<OfflineTtsImpl> Create(const OfflineTtsConfig &config);
|
static std::unique_ptr<OfflineTtsImpl> Create(const OfflineTtsConfig &config);
|
||||||
|
|
||||||
#if __ANDROID_API__ >= 9
|
template <typename Manager>
|
||||||
static std::unique_ptr<OfflineTtsImpl> Create(AAssetManager *mgr,
|
static std::unique_ptr<OfflineTtsImpl> Create(Manager *mgr,
|
||||||
const OfflineTtsConfig &config);
|
const OfflineTtsConfig &config);
|
||||||
#endif
|
|
||||||
|
|
||||||
virtual GeneratedAudio Generate(
|
virtual GeneratedAudio Generate(
|
||||||
const std::string &text, int64_t sid = 0, float speed = 1.0,
|
const std::string &text, int64_t sid = 0, float speed = 1.0,
|
||||||
|
|||||||
@@ -6,16 +6,10 @@
|
|||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <strstream>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#if __ANDROID_API__ >= 9
|
|
||||||
#include <strstream>
|
|
||||||
|
|
||||||
#include "android/asset_manager.h"
|
|
||||||
#include "android/asset_manager_jni.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "fst/extensions/far/far.h"
|
#include "fst/extensions/far/far.h"
|
||||||
#include "kaldifst/csrc/kaldi-fst-io.h"
|
#include "kaldifst/csrc/kaldi-fst-io.h"
|
||||||
#include "kaldifst/csrc/text-normalizer.h"
|
#include "kaldifst/csrc/text-normalizer.h"
|
||||||
@@ -82,8 +76,8 @@ class OfflineTtsVitsImpl : public OfflineTtsImpl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __ANDROID_API__ >= 9
|
template <typename Manager>
|
||||||
OfflineTtsVitsImpl(AAssetManager *mgr, const OfflineTtsConfig &config)
|
OfflineTtsVitsImpl(Manager *mgr, const OfflineTtsConfig &config)
|
||||||
: config_(config),
|
: config_(config),
|
||||||
model_(std::make_unique<OfflineTtsVitsModel>(mgr, config.model)) {
|
model_(std::make_unique<OfflineTtsVitsModel>(mgr, config.model)) {
|
||||||
InitFrontend(mgr);
|
InitFrontend(mgr);
|
||||||
@@ -130,7 +124,6 @@ class OfflineTtsVitsImpl : public OfflineTtsImpl {
|
|||||||
} // for (const auto &f : files)
|
} // for (const auto &f : files)
|
||||||
} // if (!config.rule_fars.empty())
|
} // if (!config.rule_fars.empty())
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
int32_t SampleRate() const override {
|
int32_t SampleRate() const override {
|
||||||
return model_->GetMetaData().sample_rate;
|
return model_->GetMetaData().sample_rate;
|
||||||
@@ -297,8 +290,8 @@ class OfflineTtsVitsImpl : public OfflineTtsImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
#if __ANDROID_API__ >= 9
|
template <typename Manager>
|
||||||
void InitFrontend(AAssetManager *mgr) {
|
void InitFrontend(Manager *mgr) {
|
||||||
const auto &meta_data = model_->GetMetaData();
|
const auto &meta_data = model_->GetMetaData();
|
||||||
|
|
||||||
if (meta_data.frontend == "characters") {
|
if (meta_data.frontend == "characters") {
|
||||||
@@ -323,7 +316,6 @@ class OfflineTtsVitsImpl : public OfflineTtsImpl {
|
|||||||
meta_data.punctuations, meta_data.language, config_.model.debug);
|
meta_data.punctuations, meta_data.language, config_.model.debug);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
void InitFrontend() {
|
void InitFrontend() {
|
||||||
const auto &meta_data = model_->GetMetaData();
|
const auto &meta_data = model_->GetMetaData();
|
||||||
|
|||||||
@@ -9,6 +9,15 @@
|
|||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#if __ANDROID_API__ >= 9
|
||||||
|
#include "android/asset_manager.h"
|
||||||
|
#include "android/asset_manager_jni.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __OHOS__
|
||||||
|
#include "rawfile/raw_file_manager.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "sherpa-onnx/csrc/macros.h"
|
#include "sherpa-onnx/csrc/macros.h"
|
||||||
#include "sherpa-onnx/csrc/onnx-utils.h"
|
#include "sherpa-onnx/csrc/onnx-utils.h"
|
||||||
#include "sherpa-onnx/csrc/session.h"
|
#include "sherpa-onnx/csrc/session.h"
|
||||||
@@ -26,8 +35,8 @@ class OfflineTtsVitsModel::Impl {
|
|||||||
Init(buf.data(), buf.size());
|
Init(buf.data(), buf.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __ANDROID_API__ >= 9
|
template <typename Manager>
|
||||||
Impl(AAssetManager *mgr, const OfflineTtsModelConfig &config)
|
Impl(Manager *mgr, const OfflineTtsModelConfig &config)
|
||||||
: config_(config),
|
: config_(config),
|
||||||
env_(ORT_LOGGING_LEVEL_ERROR),
|
env_(ORT_LOGGING_LEVEL_ERROR),
|
||||||
sess_opts_(GetSessionOptions(config)),
|
sess_opts_(GetSessionOptions(config)),
|
||||||
@@ -35,7 +44,6 @@ class OfflineTtsVitsModel::Impl {
|
|||||||
auto buf = ReadFile(mgr, config.vits.model);
|
auto buf = ReadFile(mgr, config.vits.model);
|
||||||
Init(buf.data(), buf.size());
|
Init(buf.data(), buf.size());
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
Ort::Value Run(Ort::Value x, int64_t sid, float speed) {
|
Ort::Value Run(Ort::Value x, int64_t sid, float speed) {
|
||||||
if (meta_data_.is_piper || meta_data_.is_coqui) {
|
if (meta_data_.is_piper || meta_data_.is_coqui) {
|
||||||
@@ -336,11 +344,10 @@ class OfflineTtsVitsModel::Impl {
|
|||||||
OfflineTtsVitsModel::OfflineTtsVitsModel(const OfflineTtsModelConfig &config)
|
OfflineTtsVitsModel::OfflineTtsVitsModel(const OfflineTtsModelConfig &config)
|
||||||
: impl_(std::make_unique<Impl>(config)) {}
|
: impl_(std::make_unique<Impl>(config)) {}
|
||||||
|
|
||||||
#if __ANDROID_API__ >= 9
|
template <typename Manager>
|
||||||
OfflineTtsVitsModel::OfflineTtsVitsModel(AAssetManager *mgr,
|
OfflineTtsVitsModel::OfflineTtsVitsModel(Manager *mgr,
|
||||||
const OfflineTtsModelConfig &config)
|
const OfflineTtsModelConfig &config)
|
||||||
: impl_(std::make_unique<Impl>(mgr, config)) {}
|
: impl_(std::make_unique<Impl>(mgr, config)) {}
|
||||||
#endif
|
|
||||||
|
|
||||||
OfflineTtsVitsModel::~OfflineTtsVitsModel() = default;
|
OfflineTtsVitsModel::~OfflineTtsVitsModel() = default;
|
||||||
|
|
||||||
@@ -359,4 +366,14 @@ const OfflineTtsVitsModelMetaData &OfflineTtsVitsModel::GetMetaData() const {
|
|||||||
return impl_->GetMetaData();
|
return impl_->GetMetaData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if __ANDROID_API__ >= 9
|
||||||
|
template OfflineTtsVitsModel::OfflineTtsVitsModel(
|
||||||
|
AAssetManager *mgr, const OfflineTtsModelConfig &config);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __OHOS__
|
||||||
|
template OfflineTtsVitsModel::OfflineTtsVitsModel(
|
||||||
|
NativeResourceManager *mgr, const OfflineTtsModelConfig &config);
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace sherpa_onnx
|
} // namespace sherpa_onnx
|
||||||
|
|||||||
@@ -8,11 +8,6 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#if __ANDROID_API__ >= 9
|
|
||||||
#include "android/asset_manager.h"
|
|
||||||
#include "android/asset_manager_jni.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "onnxruntime_cxx_api.h" // NOLINT
|
#include "onnxruntime_cxx_api.h" // NOLINT
|
||||||
#include "sherpa-onnx/csrc/offline-tts-model-config.h"
|
#include "sherpa-onnx/csrc/offline-tts-model-config.h"
|
||||||
#include "sherpa-onnx/csrc/offline-tts-vits-model-metadata.h"
|
#include "sherpa-onnx/csrc/offline-tts-vits-model-metadata.h"
|
||||||
@@ -24,9 +19,9 @@ class OfflineTtsVitsModel {
|
|||||||
~OfflineTtsVitsModel();
|
~OfflineTtsVitsModel();
|
||||||
|
|
||||||
explicit OfflineTtsVitsModel(const OfflineTtsModelConfig &config);
|
explicit OfflineTtsVitsModel(const OfflineTtsModelConfig &config);
|
||||||
#if __ANDROID_API__ >= 9
|
|
||||||
OfflineTtsVitsModel(AAssetManager *mgr, const OfflineTtsModelConfig &config);
|
template <typename Manager>
|
||||||
#endif
|
OfflineTtsVitsModel(Manager *mgr, const OfflineTtsModelConfig &config);
|
||||||
|
|
||||||
/** Run the model.
|
/** Run the model.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -7,6 +7,15 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
#if __ANDROID_API__ >= 9
|
||||||
|
#include "android/asset_manager.h"
|
||||||
|
#include "android/asset_manager_jni.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __OHOS__
|
||||||
|
#include "rawfile/raw_file_manager.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "sherpa-onnx/csrc/file-utils.h"
|
#include "sherpa-onnx/csrc/file-utils.h"
|
||||||
#include "sherpa-onnx/csrc/macros.h"
|
#include "sherpa-onnx/csrc/macros.h"
|
||||||
#include "sherpa-onnx/csrc/offline-tts-impl.h"
|
#include "sherpa-onnx/csrc/offline-tts-impl.h"
|
||||||
@@ -78,10 +87,9 @@ std::string OfflineTtsConfig::ToString() const {
|
|||||||
OfflineTts::OfflineTts(const OfflineTtsConfig &config)
|
OfflineTts::OfflineTts(const OfflineTtsConfig &config)
|
||||||
: impl_(OfflineTtsImpl::Create(config)) {}
|
: impl_(OfflineTtsImpl::Create(config)) {}
|
||||||
|
|
||||||
#if __ANDROID_API__ >= 9
|
template <typename Manager>
|
||||||
OfflineTts::OfflineTts(AAssetManager *mgr, const OfflineTtsConfig &config)
|
OfflineTts::OfflineTts(Manager *mgr, const OfflineTtsConfig &config)
|
||||||
: impl_(OfflineTtsImpl::Create(mgr, config)) {}
|
: impl_(OfflineTtsImpl::Create(mgr, config)) {}
|
||||||
#endif
|
|
||||||
|
|
||||||
OfflineTts::~OfflineTts() = default;
|
OfflineTts::~OfflineTts() = default;
|
||||||
|
|
||||||
@@ -95,4 +103,14 @@ int32_t OfflineTts::SampleRate() const { return impl_->SampleRate(); }
|
|||||||
|
|
||||||
int32_t OfflineTts::NumSpeakers() const { return impl_->NumSpeakers(); }
|
int32_t OfflineTts::NumSpeakers() const { return impl_->NumSpeakers(); }
|
||||||
|
|
||||||
|
#if __ANDROID_API__ >= 9
|
||||||
|
template OfflineTts::OfflineTts(AAssetManager *mgr,
|
||||||
|
const OfflineTtsConfig &config);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __OHOS__
|
||||||
|
template OfflineTts::OfflineTts(NativeResourceManager *mgr,
|
||||||
|
const OfflineTtsConfig &config);
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace sherpa_onnx
|
} // namespace sherpa_onnx
|
||||||
|
|||||||
@@ -10,11 +10,6 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#if __ANDROID_API__ >= 9
|
|
||||||
#include "android/asset_manager.h"
|
|
||||||
#include "android/asset_manager_jni.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "sherpa-onnx/csrc/offline-tts-model-config.h"
|
#include "sherpa-onnx/csrc/offline-tts-model-config.h"
|
||||||
#include "sherpa-onnx/csrc/parse-options.h"
|
#include "sherpa-onnx/csrc/parse-options.h"
|
||||||
|
|
||||||
@@ -69,9 +64,8 @@ class OfflineTts {
|
|||||||
~OfflineTts();
|
~OfflineTts();
|
||||||
explicit OfflineTts(const OfflineTtsConfig &config);
|
explicit OfflineTts(const OfflineTtsConfig &config);
|
||||||
|
|
||||||
#if __ANDROID_API__ >= 9
|
template <typename Manager>
|
||||||
OfflineTts(AAssetManager *mgr, const OfflineTtsConfig &config);
|
OfflineTts(Manager *mgr, const OfflineTtsConfig &config);
|
||||||
#endif
|
|
||||||
|
|
||||||
// @param text A string containing words separated by spaces
|
// @param text A string containing words separated by spaces
|
||||||
// @param sid Speaker ID. Used only for multi-speaker models, e.g., models
|
// @param sid Speaker ID. Used only for multi-speaker models, e.g., models
|
||||||
|
|||||||
@@ -11,16 +11,19 @@
|
|||||||
#include <mutex> // NOLINT
|
#include <mutex> // NOLINT
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <strstream>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#if __ANDROID_API__ >= 9
|
#if __ANDROID_API__ >= 9
|
||||||
#include <strstream>
|
|
||||||
|
|
||||||
#include "android/asset_manager.h"
|
#include "android/asset_manager.h"
|
||||||
#include "android/asset_manager_jni.h"
|
#include "android/asset_manager_jni.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if __OHOS__
|
||||||
|
#include "rawfile/raw_file_manager.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "espeak-ng/speak_lib.h"
|
#include "espeak-ng/speak_lib.h"
|
||||||
#include "phoneme_ids.hpp"
|
#include "phoneme_ids.hpp"
|
||||||
#include "phonemize.hpp"
|
#include "phonemize.hpp"
|
||||||
@@ -196,9 +199,9 @@ PiperPhonemizeLexicon::PiperPhonemizeLexicon(
|
|||||||
InitEspeak(data_dir);
|
InitEspeak(data_dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __ANDROID_API__ >= 9
|
template <typename Manager>
|
||||||
PiperPhonemizeLexicon::PiperPhonemizeLexicon(
|
PiperPhonemizeLexicon::PiperPhonemizeLexicon(
|
||||||
AAssetManager *mgr, const std::string &tokens, const std::string &data_dir,
|
Manager *mgr, const std::string &tokens, const std::string &data_dir,
|
||||||
const OfflineTtsVitsModelMetaData &meta_data)
|
const OfflineTtsVitsModelMetaData &meta_data)
|
||||||
: meta_data_(meta_data) {
|
: meta_data_(meta_data) {
|
||||||
{
|
{
|
||||||
@@ -212,7 +215,6 @@ PiperPhonemizeLexicon::PiperPhonemizeLexicon(
|
|||||||
// data_dir.
|
// data_dir.
|
||||||
InitEspeak(data_dir);
|
InitEspeak(data_dir);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
std::vector<TokenIDs> PiperPhonemizeLexicon::ConvertTextToTokenIds(
|
std::vector<TokenIDs> PiperPhonemizeLexicon::ConvertTextToTokenIds(
|
||||||
const std::string &text, const std::string &voice /*= ""*/) const {
|
const std::string &text, const std::string &voice /*= ""*/) const {
|
||||||
@@ -255,4 +257,16 @@ std::vector<TokenIDs> PiperPhonemizeLexicon::ConvertTextToTokenIds(
|
|||||||
return ans;
|
return ans;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if __ANDROID_API__ >= 9
|
||||||
|
template PiperPhonemizeLexicon::PiperPhonemizeLexicon(
|
||||||
|
AAssetManager *mgr, const std::string &tokens, const std::string &data_dir,
|
||||||
|
const OfflineTtsVitsModelMetaData &meta_data);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __OHOS__
|
||||||
|
template PiperPhonemizeLexicon::PiperPhonemizeLexicon(
|
||||||
|
NativeResourceManager *mgr, const std::string &tokens,
|
||||||
|
const std::string &data_dir, const OfflineTtsVitsModelMetaData &meta_data);
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace sherpa_onnx
|
} // namespace sherpa_onnx
|
||||||
|
|||||||
@@ -9,11 +9,6 @@
|
|||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#if __ANDROID_API__ >= 9
|
|
||||||
#include "android/asset_manager.h"
|
|
||||||
#include "android/asset_manager_jni.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "sherpa-onnx/csrc/offline-tts-frontend.h"
|
#include "sherpa-onnx/csrc/offline-tts-frontend.h"
|
||||||
#include "sherpa-onnx/csrc/offline-tts-vits-model-metadata.h"
|
#include "sherpa-onnx/csrc/offline-tts-vits-model-metadata.h"
|
||||||
|
|
||||||
@@ -24,11 +19,10 @@ class PiperPhonemizeLexicon : public OfflineTtsFrontend {
|
|||||||
PiperPhonemizeLexicon(const std::string &tokens, const std::string &data_dir,
|
PiperPhonemizeLexicon(const std::string &tokens, const std::string &data_dir,
|
||||||
const OfflineTtsVitsModelMetaData &meta_data);
|
const OfflineTtsVitsModelMetaData &meta_data);
|
||||||
|
|
||||||
#if __ANDROID_API__ >= 9
|
template <typename Manager>
|
||||||
PiperPhonemizeLexicon(AAssetManager *mgr, const std::string &tokens,
|
PiperPhonemizeLexicon(Manager *mgr, const std::string &tokens,
|
||||||
const std::string &data_dir,
|
const std::string &data_dir,
|
||||||
const OfflineTtsVitsModelMetaData &meta_data);
|
const OfflineTtsVitsModelMetaData &meta_data);
|
||||||
#endif
|
|
||||||
|
|
||||||
std::vector<TokenIDs> ConvertTextToTokenIds(
|
std::vector<TokenIDs> ConvertTextToTokenIds(
|
||||||
const std::string &text, const std::string &voice = "") const override;
|
const std::string &text, const std::string &voice = "") const override;
|
||||||
|
|||||||
@@ -51,11 +51,11 @@ class SileroVadModel::Impl {
|
|||||||
: config_(config),
|
: config_(config),
|
||||||
env_(ORT_LOGGING_LEVEL_ERROR),
|
env_(ORT_LOGGING_LEVEL_ERROR),
|
||||||
sess_opts_(GetSessionOptions(config)),
|
sess_opts_(GetSessionOptions(config)),
|
||||||
allocator_{} {
|
allocator_{},
|
||||||
|
sample_rate_(config.sample_rate) {
|
||||||
auto buf = ReadFile(mgr, config.silero_vad.model);
|
auto buf = ReadFile(mgr, config.silero_vad.model);
|
||||||
Init(buf.data(), buf.size());
|
Init(buf.data(), buf.size());
|
||||||
|
|
||||||
sample_rate_ = config.sample_rate;
|
|
||||||
if (sample_rate_ != 16000) {
|
if (sample_rate_ != 16000) {
|
||||||
SHERPA_ONNX_LOGE("Expected sample rate 16000. Given: %d",
|
SHERPA_ONNX_LOGE("Expected sample rate 16000. Given: %d",
|
||||||
config.sample_rate);
|
config.sample_rate);
|
||||||
|
|||||||
Reference in New Issue
Block a user