Сложности с библиотекой 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. Мораль: легче самому написать, хотя бы своё легче отлаживать, когда знаете что придумали и зачем.
если ты за месяц+ дальше ботокода не продвинулось, может это не твое?