Skip to content

Commit 5a5ef46

Browse files
committed
-Change string to char* in the API
1 parent 8ea719d commit 5a5ef46

9 files changed

+52
-37
lines changed

native_client/client.cc

+5-2
Original file line numberDiff line numberDiff line change
@@ -417,14 +417,16 @@ main(int argc, char **argv)
417417

418418
// Initialise DeepSpeech
419419
ModelState* ctx;
420+
std::string buffer_model_str;
420421
// sphinx-doc: c_ref_model_start
421422
int status;
422423
if (init_from_array_of_bytes){
423424
// Reading model file to a char * buffer
424425
std::ifstream is_model( model, std::ios::binary );
425426
std::stringstream buffer_model;
426427
buffer_model << is_model.rdbuf();
427-
status = DS_CreateModelFromBuffer(buffer_model.str(), &ctx);
428+
buffer_model_str = buffer_model.str();
429+
status = DS_CreateModelFromBuffer(buffer_model_str.c_str(), buffer_model_str.size(), &ctx);
428430
}else {
429431
// Keep old method due to backwards compatibility
430432
status = DS_CreateModel(model, &ctx);
@@ -451,7 +453,8 @@ main(int argc, char **argv)
451453
std::ifstream is_scorer(scorer, std::ios::binary );
452454
std::stringstream buffer_scorer;
453455
buffer_scorer << is_scorer.rdbuf();
454-
status = DS_EnableExternalScorerFromBuffer(ctx, buffer_scorer.str());
456+
std::string tmp_str_scorer = buffer_scorer.str();
457+
status = DS_EnableExternalScorerFromBuffer(ctx, tmp_str_scorer.c_str(), tmp_str_scorer.size());
455458
} else {
456459
// Keep old method due to backwards compatibility
457460
status = DS_EnableExternalScorer(ctx, scorer);

native_client/deepspeech.cc

+20-11
Original file line numberDiff line numberDiff line change
@@ -263,9 +263,10 @@ StreamingState::processBatch(const vector<float>& buf, unsigned int n_steps)
263263
}
264264

265265
int
266-
DS_CreateModel_(const std::string &aModelString,
266+
DS_CreateModel_(const char* aModelString,
267267
bool init_from_bytes,
268-
ModelState** retval)
268+
ModelState** retval,
269+
size_t bufferSize=0)
269270
{
270271
*retval = nullptr;
271272

@@ -278,7 +279,7 @@ DS_CreateModel_(const std::string &aModelString,
278279
LOGD("DeepSpeech: %s", ds_git_version());
279280
#endif
280281

281-
if (aModelString.length() < 1) {
282+
if ( (!init_from_bytes && (strlen(aModelString) < 1)) || (init_from_bytes && (bufferSize<1))) {
282283
std::cerr << "No model specified, cannot continue." << std::endl;
283284
return DS_ERR_NO_MODEL;
284285
}
@@ -296,7 +297,7 @@ DS_CreateModel_(const std::string &aModelString,
296297
return DS_ERR_FAIL_CREATE_MODEL;
297298
}
298299

299-
int err = model->init(aModelString, init_from_bytes);
300+
int err = model->init(aModelString, init_from_bytes, bufferSize);
300301
if (err != DS_ERR_OK) {
301302
return err;
302303
}
@@ -313,10 +314,11 @@ DS_CreateModel(const char* aModelPath,
313314
}
314315

315316
int
316-
DS_CreateModelFromBuffer(const std::string &aModelBuffer,
317+
DS_CreateModelFromBuffer(const char* aModelBuffer,
318+
size_t bufferSize,
317319
ModelState** retval)
318320
{
319-
return DS_CreateModel_(aModelBuffer, true, retval);
321+
return DS_CreateModel_(aModelBuffer, true, retval, bufferSize);
320322
}
321323

322324

@@ -347,12 +349,18 @@ DS_FreeModel(ModelState* ctx)
347349

348350
int
349351
DS_EnableExternalScorer_(ModelState* aCtx,
350-
const std::string &aScorerString,
351-
bool init_from_bytes)
352+
const char* aScorerString,
353+
bool init_from_bytes,
354+
size_t bufferSize=0)
352355
{
353356
std::unique_ptr<Scorer> scorer(new Scorer());
354357

355-
int err = scorer->init(aScorerString, init_from_bytes, aCtx->alphabet_);
358+
int err;
359+
if (init_from_bytes)
360+
err = scorer->init(std::string(aScorerString, bufferSize), init_from_bytes, aCtx->alphabet_);
361+
else
362+
err = scorer->init(aScorerString, init_from_bytes, aCtx->alphabet_);
363+
356364

357365
if (err != 0) {
358366
return DS_ERR_INVALID_SCORER;
@@ -370,9 +378,10 @@ DS_EnableExternalScorer(ModelState* aCtx,
370378

371379
int
372380
DS_EnableExternalScorerFromBuffer(ModelState* aCtx,
373-
const std::string &aScorerBuffer)
381+
const char* aScorerBuffer,
382+
size_t bufferSize)
374383
{
375-
return DS_EnableExternalScorer_(aCtx, aScorerBuffer, true);
384+
return DS_EnableExternalScorer_(aCtx, aScorerBuffer, true, bufferSize);
376385
}
377386

378387
int

native_client/deepspeech.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ typedef struct Metadata {
7676
APPLY(DS_ERR_SCORER_NO_TRIE, 0x2007, "Reached end of scorer file before loading vocabulary trie.") \
7777
APPLY(DS_ERR_SCORER_INVALID_TRIE, 0x2008, "Invalid magic in trie header.") \
7878
APPLY(DS_ERR_SCORER_VERSION_MISMATCH, 0x2009, "Scorer file version does not match expected version.") \
79+
APPLY(DS_ERR_MODEL_NOT_SUP_BUFFER, 0x2010, "Load from buffer does not support memorymaped models.") \
7980
APPLY(DS_ERR_FAIL_INIT_MMAP, 0x3000, "Failed to initialize memory mapped model.") \
8081
APPLY(DS_ERR_FAIL_INIT_SESS, 0x3001, "Failed to initialize the session.") \
8182
APPLY(DS_ERR_FAIL_INTERPRETER, 0x3002, "Interpreter failed.") \
@@ -118,7 +119,8 @@ int DS_CreateModel(const char* aModelPath,
118119
* @return Zero on success, non-zero on failure.
119120
*/
120121
DEEPSPEECH_EXPORT
121-
int DS_CreateModelFromBuffer(const std::string &aModelBuffer,
122+
int DS_CreateModelFromBuffer(const char* aModelBuffer,
123+
size_t bufferSize,
122124
ModelState** retval);
123125

124126

@@ -185,7 +187,8 @@ int DS_EnableExternalScorer(ModelState* aCtx,
185187
*/
186188
DEEPSPEECH_EXPORT
187189
int DS_EnableExternalScorerFromBuffer(ModelState* aCtx,
188-
const std::string &aScorerBuffer);
190+
const char* aScorerBuffer,
191+
size_t bufferSize);
189192

190193

191194
/**

native_client/modelstate.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ ModelState::~ModelState()
2424
}
2525

2626
int
27-
ModelState::init(const std::string &model_string, bool init_from_bytes)
27+
ModelState::init(const char* model_string, bool init_from_bytes, size_t bufferSize)
2828
{
2929
return DS_ERR_OK;
3030
}

native_client/modelstate.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ struct ModelState {
3131
ModelState();
3232
virtual ~ModelState();
3333

34-
virtual int init(const std::string &model_string, bool init_from_bytes);
34+
virtual int init(const char* model_string, bool init_from_bytes, size_t bufferSize);
3535

3636
virtual void compute_mfcc(const std::vector<float>& audio_buffer, std::vector<float>& mfcc_output) = 0;
3737

native_client/tflitemodelstate.cc

+5-9
Original file line numberDiff line numberDiff line change
@@ -156,24 +156,21 @@ getTfliteDelegates()
156156
}
157157

158158
int
159-
TFLiteModelState::init(const std::string &model_string, bool init_from_bytes)
159+
TFLiteModelState::init(const char *model_string, bool init_from_bytes, size_t bufferSize)
160160
{
161-
int err = ModelState::init(model_string, init_from_bytes);
161+
int err = ModelState::init(model_string, init_from_bytes, bufferSize);
162162
if (err != DS_ERR_OK) {
163163
return err;
164164
}
165-
165+
166166
if (init_from_bytes){
167-
char *tmp_buffer = new char[model_string.size()];
168-
std::copy(model_string.begin(), model_string.end(), tmp_buffer);
169-
// Using c_str does not work
170-
fbmodel_ = tflite::FlatBufferModel::VerifyAndBuildFromBuffer(tmp_buffer,model_string.size());
167+
fbmodel_ = tflite::FlatBufferModel::VerifyAndBuildFromBuffer(model_string, bufferSize);
171168
if (!fbmodel_) {
172169
std::cerr << "Error at reading model buffer " << std::endl;
173170
return DS_ERR_FAIL_INIT_MMAP;
174171
}
175172
} else {
176-
fbmodel_ = tflite::FlatBufferModel::BuildFromFile(model_string.c_str());
173+
fbmodel_ = tflite::FlatBufferModel::BuildFromFile(model_string);
177174
if (!fbmodel_) {
178175
std::cerr << "Error at reading model file " << model_string << std::endl;
179176
return DS_ERR_FAIL_INIT_MMAP;
@@ -334,7 +331,6 @@ TFLiteModelState::init(const std::string &model_string, bool init_from_bytes)
334331
assert(dims_c->data[1] == dims_h->data[1]);
335332
assert(state_size_ > 0);
336333
state_size_ = dims_c->data[1];
337-
338334
return DS_ERR_OK;
339335
}
340336

native_client/tflitemodelstate.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ struct TFLiteModelState : public ModelState
3131
TFLiteModelState();
3232
virtual ~TFLiteModelState();
3333

34-
virtual int init(const std::string &model_string, bool init_from_bytes) override;
34+
virtual int init(const char* model_string, bool init_from_bytes, size_t bufferSize) override;
3535

3636
virtual void compute_mfcc(const std::vector<float>& audio_buffer,
3737
std::vector<float>& mfcc_output) override;

native_client/tfmodelstate.cc

+13-9
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,21 @@ TFModelState::~TFModelState()
2222
}
2323
}
2424

25-
int loadGraphFromBinaryData(Env* env, const std::string& data,
25+
int loadGraphFromBinaryData(Env* env, const char* data, size_t bufferSize,
2626
::tensorflow::protobuf::MessageLite* proto) {
2727

28-
if (!proto->ParseFromString(data)) {
28+
std::string dataString(data, bufferSize);
29+
if (!proto->ParseFromString(dataString)) {
2930
std::cerr << "Can't parse data as binary proto" << std::endl;
3031
return -1;
3132
}
3233
return 0;
3334
}
3435

3536
int
36-
TFModelState::init(const std::string &model_string, bool init_from_bytes)
37+
TFModelState::init(const char* model_string, bool init_from_bytes, size_t bufferSize)
3738
{
38-
int err = ModelState::init(model_string, init_from_bytes);
39+
int err = ModelState::init(model_string, init_from_bytes, bufferSize);
3940
if (err != DS_ERR_OK) {
4041
return err;
4142
}
@@ -46,16 +47,16 @@ TFModelState::init(const std::string &model_string, bool init_from_bytes)
4647
mmap_env_.reset(new MemmappedEnv(Env::Default()));
4748
bool is_mmap = false;
4849
if (init_from_bytes) {
49-
int loadGraphStatus = loadGraphFromBinaryData(Env::Default(), model_string, &graph_def_);
50+
int loadGraphStatus = loadGraphFromBinaryData(mmap_env_.get(), model_string, bufferSize, &graph_def_);
5051
if (loadGraphStatus != 0) {
5152
return DS_ERR_FAIL_CREATE_SESS;
5253
}
5354
} else {
54-
is_mmap = model_string.find(".pbmm") != std::string::npos;
55+
is_mmap = std::string(model_string).find(".pbmm") != std::string::npos;
5556
if (!is_mmap) {
5657
std::cerr << "Warning: reading entire model file into memory. Transform model file into an mmapped graph to reduce heap usage." << std::endl;
5758
} else {
58-
status = mmap_env_->InitializeFromFile(model_string.c_str());
59+
status = mmap_env_->InitializeFromFile(model_string);
5960
if (!status.ok()) {
6061
std::cerr << status << std::endl;
6162
return DS_ERR_FAIL_INIT_MMAP;
@@ -77,14 +78,17 @@ TFModelState::init(const std::string &model_string, bool init_from_bytes)
7778
session_.reset(session);
7879

7980
if (init_from_bytes){
80-
// Need some help
81+
if( is_mmap) {
82+
std::cerr << "Load from buffer does not support .pbmm models." << std::endl;
83+
return DS_ERR_MODEL_NOT_SUP_BUFFER;
84+
}
8185
} else {
8286
if (is_mmap) {
8387
status = ReadBinaryProto(mmap_env_.get(),
8488
MemmappedFileSystem::kMemmappedPackageDefaultGraphDef,
8589
&graph_def_);
8690
} else {
87-
status = ReadBinaryProto(Env::Default(), model_string.c_str(), &graph_def_);
91+
status = ReadBinaryProto(Env::Default(), model_string, &graph_def_);
8892
}
8993
}
9094

native_client/tfmodelstate.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ struct TFModelState : public ModelState
1818
TFModelState();
1919
virtual ~TFModelState();
2020

21-
virtual int init(const std::string &model_string, bool init_from_bytes) override;
21+
virtual int init(const char* model_string, bool init_from_bytes, size_t bufferSize) override;
2222

2323
virtual void infer(const std::vector<float>& mfcc,
2424
unsigned int n_frames,

0 commit comments

Comments
 (0)