@@ -200,7 +200,7 @@ Error TransducerRunner::load() {
200200 return Error::Ok;
201201}
202202
203- Result<::executorch::extension::TensorPtr > TransducerRunner::preprocess (
203+ Result<PreprocessResult > TransducerRunner::preprocess (
204204 ::executorch::extension::TensorPtr raw_audio) {
205205 if (!is_loaded ()) {
206206 ET_CHECK_OK_OR_RETURN_ERROR (load ());
@@ -229,20 +229,28 @@ Result<::executorch::extension::TensorPtr> TransducerRunner::preprocess(
229229 " Preprocessor returned unexpected output." );
230230
231231 auto mel = outputs[0 ].toTensor ();
232- return std::make_shared<::executorch::aten::Tensor>(std::move (mel));
232+ int64_t mel_len = mel.sizes ()[1 ]; // default to tensor dim
233+ if (outputs.size () >= 2 && outputs[1 ].isTensor ()) {
234+ mel_len = outputs[1 ].toTensor ().const_data_ptr <int64_t >()[0 ];
235+ }
236+ return PreprocessResult{
237+ std::make_shared<::executorch::aten::Tensor>(std::move (mel)), mel_len};
233238}
234239
235240Result<std::vector<Token>> TransducerRunner::transcribe (
236241 ::executorch::extension::TensorPtr preprocessed_features,
237- std::function<void (const std::string&)> token_callback) {
242+ std::function<void (const std::string&)> token_callback,
243+ int64_t features_length) {
238244 if (!is_loaded ()) {
239245 ET_CHECK_OK_OR_RETURN_ERROR (load ());
240246 }
241247
242248 stats_.inference_start_ms = ::executorch::extension::llm::time_in_ms ();
243249
244250 // --- Encode ---
245- int64_t mel_len_value = preprocessed_features->size (1 );
251+ // Use provided length, or fall back to tensor dimension
252+ int64_t mel_len_value =
253+ features_length > 0 ? features_length : preprocessed_features->size (1 );
246254 std::vector<int64_t > mel_len_data = {mel_len_value};
247255 auto mel_len = ::executorch::extension::from_blob (
248256 mel_len_data.data (), {1 }, ::executorch::aten::ScalarType::Long);
0 commit comments