Top.Mail.Ru
Ответы

Сложности с библиотекой portaudio с++

есть код который должен понижать тембр голоса но что-то пошло не так и я чуть без ушей не осталась). Крч этот код по большей части написан с помощью чат гпт тк я не особо понимаю как работать со звуком(если есть хорошие книги по этому и на русском то буду благодарна за ссылку). вообщем нужно исправить код и указать на ошибки.
P.S. я в первые со звуком работаю так что чем проще разъясняете тем лучше) и код в прикрепленном файле

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
 #include <cmath> 
#include <cstdlib> 
#include <fstream> 
#include <iostream> 
#include <lame/lame.h> 
#include <portaudio.h> 
#include <string> 
#include <vector> 
#include <algorithm> 
 
#define SAMPLE_RATE (44100) 
#define FRAMES_PER_BUFFER 512 
 
float semitoneRatio = pow(2.0, 1.0 / 12.0); 
float pitchShiftFactor = pow(semitoneRatio, -5.0); 
 
struct AudioData { 
    std::vector<int16_t> audioBuffer; // Используем int16_t для хранения аудио данных 
    std::ofstream outputFile; 
    lame_t lame; 
}; 
 
static int audioCallback(const void* inputBuffer, void* outputBuffer, 
    unsigned long framesPerBuffer, 
    const PaStreamCallbackTimeInfo* timeInfo, 
    PaStreamCallbackFlags statusFlags, 
    void* userData) 
{ 
    float* in = (float*)inputBuffer; 
    int16_t* out = (int16_t*)outputBuffer; 
 
    for (int i = 0; i < framesPerBuffer; i++) { 
        out[i] = static_cast<int16_t>(in[i] * pitchShiftFactor * 32767); // Преобразуем в формат int16_t 
    } 
 
    AudioData* audioData = static_cast<AudioData*>(userData); 
    audioData->audioBuffer.insert(audioData->audioBuffer.end(), out, out + framesPerBuffer); 
 
    return paContinue; 
} 
 
int main() 
{ 
    AudioData audioData; 
 
    audioData.lame = lame_init(); 
    if (!audioData.lame) { 
        std::cerr << "Failed to initialize LAME" << std::endl; 
        return 1; 
    } 
 
    lame_set_in_samplerate(audioData.lame, SAMPLE_RATE); 
    lame_set_out_samplerate(audioData.lame, SAMPLE_RATE); 
    lame_set_num_channels(audioData.lame, 1); // Моно звук 
    lame_set_brate(audioData.lame, 128); // Битрейт 128 kbps 
    lame_set_quality(audioData.lame, 2); // Качество кодирования 
    lame_init_params(audioData.lame); 
 
    audioData.outputFile.open("output.mp3", std::ios::binary); 
    if (!audioData.outputFile.is_open()) { 
        std::cerr << "Failed to open output file" << std::endl; 
        return 1; 
    } 
    PaError err = Pa_Initialize(); 
    if (err != paNoError) { 
        std::cout << "PortAudio error: " << Pa_GetErrorText(err) << std::endl; 
        return 1; 
    } 
    PaStream* stream; 
    err = Pa_OpenDefaultStream(&stream, 1, 1, paFloat32, SAMPLE_RATE, FRAMES_PER_BUFFER, audioCallback, &audioData); 
    if (err != paNoError) { 
        std::cout << "PortAudio error: " << Pa_GetErrorText(err) << std::endl; 
        return 1; 
    } 
    err = Pa_StartStream(stream); 
    if (err != paNoError) { 
        std::cout << "PortAudio error: " << Pa_GetErrorText(err) << std::endl; 
        return 1; 
    } 
    std::cin.get(); 
    err = Pa_StopStream(stream); 
    if (err != paNoError) { 
        std::cout << "PortAudio error: " << Pa_GetErrorText(err) << std::endl; 
        return 1; 
    } 
 
    err = Pa_CloseStream(stream); 
    if (err != paNoError) { 
        std::cout << "PortAudio error: " << Pa_GetErrorText(err) << std::endl; 
        return 1; 
    } 
    err = Pa_Terminate(); 
    return 0; 
} 
По дате
По рейтингу
Аватар пользователя
Мудрец

Я тут посмотрел, как ИИ пишет на Паскале, и мне стало плохо от set of string. Мораль: легче самому написать, хотя бы своё легче отлаживать, когда знаете что придумали и зачем.

Аватар пользователя
Искусственный Интеллект

если ты за месяц+ дальше ботокода не продвинулось, может это не твое?