13static int token_frames(
const float *logits,
size_t bins,
float speed,
14 size_t max_duration_per_token, int32_t *frames) {
16 for (
size_t bin = 0; bin < bins; ++bin) {
17 const float value = logits[bin];
21 const float scaled = sum / speed;
22 if (!isfinite(scaled) || scaled >= 2147483648.0f)
27 const float lower = floorf(scaled);
28 const float fraction = scaled - lower;
29 float rounded = lower;
30 if (fraction > 0.5f ||
31 (fraction == 0.5f && fmodf(lower, 2.0f) != 0.0f))
33 if (rounded < 1.0f) rounded = 1.0f;
36 const int32_t candidate = (int32_t)rounded;
37 if ((
size_t)candidate > max_duration_per_token)
44 const float *logits,
size_t input_elements,
size_t tokens,
size_t bins,
45 size_t input_stride,
float speed, int32_t *durations,
46 size_t duration_capacity,
size_t max_duration_per_token,
47 size_t max_expanded_frames, int32_t *expanded_frames) {
48 if (!logits || !durations || !expanded_frames || !tokens || !bins ||
49 input_stride < bins || !isfinite(speed) || speed <= 0.0f ||
50 !max_duration_per_token || max_duration_per_token > INT32_MAX ||
51 !max_expanded_frames || max_expanded_frames > INT32_MAX)
53 if (tokens - 1 > (SIZE_MAX - bins) / input_stride ||
54 tokens > SIZE_MAX /
sizeof(int32_t))
56 const size_t required_input = (tokens - 1) * input_stride + bins;
57 if (required_input > SIZE_MAX /
sizeof(
float))
59 if (input_elements < required_input || duration_capacity < tokens)
66 max_duration_per_token, &frames);
68 if ((
size_t)frames > max_expanded_frames - total)
70 total += (size_t)frames;
77 max_duration_per_token, &frames);
78 durations[
token] = frames;
80 *expanded_frames = (int32_t)total;
int audio_duration_logits_to_frames_f32(const float *logits, size_t input_elements, size_t tokens, size_t bins, size_t input_stride, float speed, int32_t *durations, size_t duration_capacity, size_t max_duration_per_token, size_t max_expanded_frames, int32_t *expanded_frames)