Adapt Java bindings to const structs

This commit is contained in:
Reuben Morais 2020-03-18 19:49:14 +01:00
parent 1547498e82
commit ee30a1c9de
7 changed files with 122 additions and 106 deletions

View File

@ -6,6 +6,8 @@
%}
%include "typemaps.i"
%include "enums.swg"
%javaconst(1);
%include "arrays_java.i"
// apply to DS_FeedAudioContent and DS_SpeechToText
@ -15,12 +17,6 @@
%pointer_functions(ModelState*, modelstatep);
%pointer_functions(StreamingState*, streamingstatep);
%typemap(newfree) char* "DS_FreeString($1);";
%include "carrays.i"
%array_functions(struct TokenMetadata, TokenMetadata_array);
%array_functions(struct CandidateTranscript, CandidateTranscript_array);
%extend struct CandidateTranscript {
/**
* Retrieve one TokenMetadata element
@ -29,8 +25,8 @@
*
* @return The TokenMetadata requested or null
*/
TokenMetadata getToken(int i) {
return TokenMetadata_array_getitem(self->tokens, i);
const TokenMetadata& getToken(int i) {
return self->tokens[i];
}
}
@ -42,8 +38,8 @@
*
* @return The CandidateTranscript requested or null
*/
CandidateTranscript getTranscript(int i) {
return CandidateTranscript_array_getitem(self->transcripts, i);
const CandidateTranscript& getTranscript(int i) {
return self->transcripts[i];
}
~Metadata() {
@ -58,9 +54,11 @@
%nodefaultctor TokenMetadata;
%nodefaultdtor TokenMetadata;
%typemap(newfree) char* "DS_FreeString($1);";
%newobject DS_SpeechToText;
%newobject DS_IntermediateDecode;
%newobject DS_FinishStream;
%newobject DS_ErrorCodeToErrorMessage;
%rename ("%(strip:[DS_])s") "";

View File

@ -11,8 +11,15 @@ public class DeepSpeechModel {
}
// FIXME: We should have something better than those SWIGTYPE_*
SWIGTYPE_p_p_ModelState _mspp;
SWIGTYPE_p_ModelState _msp;
private SWIGTYPE_p_p_ModelState _mspp;
private SWIGTYPE_p_ModelState _msp;
private void evaluateErrorCode(int errorCode) {
DeepSpeech_Error_Codes code = DeepSpeech_Error_Codes.swigToEnum(errorCode);
if (code != DeepSpeech_Error_Codes.ERR_OK) {
throw new RuntimeException("Error: " + impl.ErrorCodeToErrorMessage(errorCode) + " (0x" + Integer.toHexString(errorCode) + ").");
}
}
/**
* @brief An object providing an interface to a trained DeepSpeech model.
@ -20,10 +27,12 @@ public class DeepSpeechModel {
* @constructor
*
* @param modelPath The path to the frozen model graph.
*
* @throws RuntimeException on failure.
*/
public DeepSpeechModel(String modelPath) {
this._mspp = impl.new_modelstatep();
impl.CreateModel(modelPath, this._mspp);
evaluateErrorCode(impl.CreateModel(modelPath, this._mspp));
this._msp = impl.modelstatep_value(this._mspp);
}
@ -43,10 +52,10 @@ public class DeepSpeechModel {
* @param aBeamWidth The beam width used by the model. A larger beam width value
* generates better results at the cost of decoding time.
*
* @return Zero on success, non-zero on failure.
* @throws RuntimeException on failure.
*/
public int setBeamWidth(long beamWidth) {
return impl.SetModelBeamWidth(this._msp, beamWidth);
public void setBeamWidth(long beamWidth) {
evaluateErrorCode(impl.SetModelBeamWidth(this._msp, beamWidth));
}
/**
@ -70,19 +79,19 @@ public class DeepSpeechModel {
*
* @param scorer The path to the external scorer file.
*
* @return Zero on success, non-zero on failure (invalid arguments).
* @throws RuntimeException on failure.
*/
public void enableExternalScorer(String scorer) {
impl.EnableExternalScorer(this._msp, scorer);
evaluateErrorCode(impl.EnableExternalScorer(this._msp, scorer));
}
/**
* @brief Disable decoding using an external scorer.
*
* @return Zero on success, non-zero on failure (invalid arguments).
* @throws RuntimeException on failure.
*/
public void disableExternalScorer() {
impl.DisableExternalScorer(this._msp);
evaluateErrorCode(impl.DisableExternalScorer(this._msp));
}
/**
@ -91,10 +100,10 @@ public class DeepSpeechModel {
* @param alpha The alpha hyperparameter of the decoder. Language model weight.
* @param beta The beta hyperparameter of the decoder. Word insertion weight.
*
* @return Zero on success, non-zero on failure (invalid arguments).
* @throws RuntimeException on failure.
*/
public void setScorerAlphaBeta(float alpha, float beta) {
impl.SetScorerAlphaBeta(this._msp, alpha, beta);
evaluateErrorCode(impl.SetScorerAlphaBeta(this._msp, alpha, beta));
}
/*
@ -132,10 +141,12 @@ public class DeepSpeechModel {
* and finishStream().
*
* @return An opaque object that represents the streaming state.
*
* @throws RuntimeException on failure.
*/
public DeepSpeechStreamingState createStream() {
SWIGTYPE_p_p_StreamingState ssp = impl.new_streamingstatep();
impl.CreateStream(this._msp, ssp);
evaluateErrorCode(impl.CreateStream(this._msp, ssp));
return new DeepSpeechStreamingState(impl.streamingstatep_value(ssp));
}

View File

@ -9,8 +9,8 @@
package org.mozilla.deepspeech.libdeepspeech;
/**
* A single transcript computed by the model, including a confidence value and
* the metadata for its constituent tokens.
* A single transcript computed by the model, including a confidence<br>
* value and the metadata for its constituent tokens.
*/
public class CandidateTranscript {
private transient long swigCPtr;
@ -36,14 +36,7 @@ public class CandidateTranscript {
}
/**
* Array of TokenMetadata objects
*/
public void setTokens(TokenMetadata value) {
implJNI.CandidateTranscript_tokens_set(swigCPtr, this, TokenMetadata.getCPtr(value), value);
}
/**
* Array of TokenMetadata objects
* Array of TokenMetadata objects
*/
public TokenMetadata getTokens() {
long cPtr = implJNI.CandidateTranscript_tokens_get(swigCPtr, this);
@ -51,31 +44,15 @@ public class CandidateTranscript {
}
/**
* Size of the tokens array
* Size of the tokens array
*/
public void setNum_tokens(int value) {
implJNI.CandidateTranscript_num_tokens_set(swigCPtr, this, value);
}
/**
* Size of the tokens array
*/
public int getNum_tokens() {
public long getNum_tokens() {
return implJNI.CandidateTranscript_num_tokens_get(swigCPtr, this);
}
/**
* Approximated confidence value for this transcript. This is roughly the
* sum of the acoustic model logit values for each timestep/character that
* contributed to the creation of this transcript.
*/
public void setConfidence(double value) {
implJNI.CandidateTranscript_confidence_set(swigCPtr, this, value);
}
/**
* Approximated confidence value for this transcript. This is roughly the
* sum of the acoustic model logit values for each timestep/character that
* Approximated confidence value for this transcript. This is roughly the<br>
* sum of the acoustic model logit values for each timestep/character that<br>
* contributed to the creation of this transcript.
*/
public double getConfidence() {
@ -83,14 +60,14 @@ public class CandidateTranscript {
}
/**
* Retrieve one TokenMetadata element
*
* @param i Array index of the TokenMetadata to get
*
* Retrieve one TokenMetadata element<br>
* <br>
* @param i Array index of the TokenMetadata to get<br>
* <br>
* @return The TokenMetadata requested or null
*/
public TokenMetadata getToken(int i) {
return new TokenMetadata(implJNI.CandidateTranscript_getToken(swigCPtr, this, i), true);
return new TokenMetadata(implJNI.CandidateTranscript_getToken(swigCPtr, this, i), false);
}
}

View File

@ -0,0 +1,65 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
* Version 4.0.1
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
* ----------------------------------------------------------------------------- */
package org.mozilla.deepspeech.libdeepspeech;
public enum DeepSpeech_Error_Codes {
ERR_OK(0x0000),
ERR_NO_MODEL(0x1000),
ERR_INVALID_ALPHABET(0x2000),
ERR_INVALID_SHAPE(0x2001),
ERR_INVALID_SCORER(0x2002),
ERR_MODEL_INCOMPATIBLE(0x2003),
ERR_SCORER_NOT_ENABLED(0x2004),
ERR_FAIL_INIT_MMAP(0x3000),
ERR_FAIL_INIT_SESS(0x3001),
ERR_FAIL_INTERPRETER(0x3002),
ERR_FAIL_RUN_SESS(0x3003),
ERR_FAIL_CREATE_STREAM(0x3004),
ERR_FAIL_READ_PROTOBUF(0x3005),
ERR_FAIL_CREATE_SESS(0x3006),
ERR_FAIL_CREATE_MODEL(0x3007);
public final int swigValue() {
return swigValue;
}
public static DeepSpeech_Error_Codes swigToEnum(int swigValue) {
DeepSpeech_Error_Codes[] swigValues = DeepSpeech_Error_Codes.class.getEnumConstants();
if (swigValue < swigValues.length && swigValue >= 0 && swigValues[swigValue].swigValue == swigValue)
return swigValues[swigValue];
for (DeepSpeech_Error_Codes swigEnum : swigValues)
if (swigEnum.swigValue == swigValue)
return swigEnum;
throw new IllegalArgumentException("No enum " + DeepSpeech_Error_Codes.class + " with value " + swigValue);
}
@SuppressWarnings("unused")
private DeepSpeech_Error_Codes() {
this.swigValue = SwigNext.next++;
}
@SuppressWarnings("unused")
private DeepSpeech_Error_Codes(int swigValue) {
this.swigValue = swigValue;
SwigNext.next = swigValue+1;
}
@SuppressWarnings("unused")
private DeepSpeech_Error_Codes(DeepSpeech_Error_Codes swigEnum) {
this.swigValue = swigEnum.swigValue;
SwigNext.next = this.swigValue+1;
}
private final int swigValue;
private static class SwigNext {
private static int next = 0;
}
}

View File

@ -40,14 +40,7 @@ public class Metadata {
}
/**
* Array of CandidateTranscript objects
*/
public void setTranscripts(CandidateTranscript value) {
implJNI.Metadata_transcripts_set(swigCPtr, this, CandidateTranscript.getCPtr(value), value);
}
/**
* Array of CandidateTranscript objects
* Array of CandidateTranscript objects
*/
public CandidateTranscript getTranscripts() {
long cPtr = implJNI.Metadata_transcripts_get(swigCPtr, this);
@ -55,28 +48,21 @@ public class Metadata {
}
/**
* Size of the transcripts array
* Size of the transcripts array
*/
public void setNum_transcripts(int value) {
implJNI.Metadata_num_transcripts_set(swigCPtr, this, value);
}
/**
* Size of the transcripts array
*/
public int getNum_transcripts() {
public long getNum_transcripts() {
return implJNI.Metadata_num_transcripts_get(swigCPtr, this);
}
/**
* Retrieve one CandidateTranscript element
*
* @param i Array index of the CandidateTranscript to get
*
* Retrieve one CandidateTranscript element<br>
* <br>
* @param i Array index of the CandidateTranscript to get<br>
* <br>
* @return The CandidateTranscript requested or null
*/
public CandidateTranscript getTranscript(int i) {
return new CandidateTranscript(implJNI.Metadata_getTranscript(swigCPtr, this, i), true);
return new CandidateTranscript(implJNI.Metadata_getTranscript(swigCPtr, this, i), false);
}
}

View File

@ -4,7 +4,7 @@ Javadoc for Sphinx
This code is only here for reference for documentation generation.
To update, please build SWIG (4.0 at least) and then run from native_client/java:
To update, please install SWIG (4.0 at least) and then run from native_client/java:
.. code-block::

View File

@ -35,42 +35,21 @@ public class TokenMetadata {
}
/**
* The text corresponding to this token
*/
public void setText(String value) {
implJNI.TokenMetadata_text_set(swigCPtr, this, value);
}
/**
* The text corresponding to this token
* The text corresponding to this token
*/
public String getText() {
return implJNI.TokenMetadata_text_get(swigCPtr, this);
}
/**
* Position of the token in units of 20ms
* Position of the token in units of 20ms
*/
public void setTimestep(int value) {
implJNI.TokenMetadata_timestep_set(swigCPtr, this, value);
}
/**
* Position of the token in units of 20ms
*/
public int getTimestep() {
public long getTimestep() {
return implJNI.TokenMetadata_timestep_get(swigCPtr, this);
}
/**
* Position of the token in seconds
*/
public void setStart_time(float value) {
implJNI.TokenMetadata_start_time_set(swigCPtr, this, value);
}
/**
* Position of the token in seconds
* Position of the token in seconds
*/
public float getStart_time() {
return implJNI.TokenMetadata_start_time_get(swigCPtr, this);