| 1594 | if (static_cast<int64_t>(true_latents.size()) != latent_length * config.out_channels) { |
| 1595 | throw std::runtime_error("HeartCodec true-latent payload shape mismatch"); |
| 1596 | } |
| 1597 | for (int64_t t = 0; t < incontext_length; ++t) { |
| 1598 | std::copy( |
| 1599 | true_latents.begin() + static_cast<std::ptrdiff_t>(t * config.out_channels), |
| 1600 | true_latents.begin() + static_cast<std::ptrdiff_t>((t + 1) * config.out_channels), |
| 1601 | incontext.begin() + static_cast<std::ptrdiff_t>(t * config.out_channels)); |
| 1602 | } |
| 1603 | auto solved = solve_euler( |
| 1604 | runtime, |
| 1605 | std::move(latents), |
| 1606 | incontext, |
| 1607 | incontext_length, |
| 1608 | conditioning.values, |
| 1609 | num_steps, |
| 1610 | guidance_scale); |
| 1611 | for (int64_t t = 0; t < incontext_length; ++t) { |
| 1612 | std::copy( |
| 1613 | incontext.begin() + static_cast<std::ptrdiff_t>(t * config.out_channels), |
| 1614 | incontext.begin() + static_cast<std::ptrdiff_t>((t + 1) * config.out_channels), |
| 1615 | solved.begin() + static_cast<std::ptrdiff_t>(t * config.out_channels)); |
| 1616 | } |
| 1617 | return solved; |
| 1618 | } |
| 1619 | |
| 1620 | std::vector<float> latent_btc_to_scalar_bct(const std::vector<float> & latent_btc, int64_t frames) { |
| 1621 | const int64_t channels = 2; |
| 1622 | const int64_t latent_hidden = 128; |
| 1623 | if (static_cast<int64_t>(latent_btc.size()) != frames * channels * latent_hidden) { |
| 1624 | throw std::runtime_error("HeartCodec latent reshape payload mismatch"); |
| 1625 | } |
| 1626 | std::vector<float> out(static_cast<size_t>(channels * latent_hidden * frames), 0.0F); |
| 1627 | for (int64_t t = 0; t < frames; ++t) { |
| 1628 | for (int64_t stream = 0; stream < channels; ++stream) { |
| 1629 | for (int64_t dim = 0; dim < latent_hidden; ++dim) { |
| 1630 | const size_t src = static_cast<size_t>(t * channels * latent_hidden + stream * latent_hidden + dim); |
| 1631 | const size_t dst = static_cast<size_t>((stream * latent_hidden + dim) * frames + t); |
| 1632 | out[dst] = latent_btc[src]; |
| 1633 | } |
| 1634 | } |
| 1635 | } |
| 1636 | return out; |
| 1637 | } |
| 1638 | |
| 1639 | std::vector<float> decoded_batch_to_stereo( |
| 1640 | const HeartCodecDecodedAudio & decoded, |
| 1641 | int64_t samples) { |
| 1642 | if (decoded.batch_size != 2 || decoded.channels != 1 || decoded.samples < samples) { |
| 1643 | throw std::runtime_error("HeartCodec scalar decoder output shape mismatch"); |
| 1644 | } |
| 1645 | std::vector<float> out(static_cast<size_t>(2 * samples), 0.0F); |
| 1646 | for (int64_t ch = 0; ch < 2; ++ch) { |
| 1647 | std::copy( |
| 1648 | decoded.values.begin() + static_cast<std::ptrdiff_t>(ch * decoded.samples), |
| 1649 | decoded.values.begin() + static_cast<std::ptrdiff_t>(ch * decoded.samples + samples), |
| 1650 | out.begin() + static_cast<std::ptrdiff_t>(ch * samples)); |
| 1651 | } |
| 1652 | return out; |
| 1653 | } |
no test coverage detected