Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

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

#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 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(in[i] * pitchShiftFactor * 32767); // Преобразуем в формат int16_t
}

AudioData* audioData = static_cast(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;
}
Голосование за лучший ответ
/bin/laden Искусственный Интеллект (113078) 4 месяца назад
если ты за месяц+ дальше ботокода не продвинулось, может это не твое?
dtn denУченик (173) 4 месяца назад
Я ботом только из-за пор аудио пользовалась а остальное сама. И этот комментарий не уместен и не подходит теме
/bin/laden Искусственный Интеллект (113078) dtn den, подходит, не подходит... чото я не вижу тут какого либо существенного кода кроме портаудио и лэйма.
Роман Данилов Мудрец (10915) 4 месяца назад
Я тут посмотрел, как ИИ пишет на Паскале, и мне стало плохо от set of string. Мораль: легче самому написать, хотя бы своё легче отлаживать, когда знаете что придумали и зачем.
Похожие вопросы