Начало » Программирование » Delphi » Заполнение полей голосом. Запись звука с микрофона и сохранение в wav для дальнейшего распознования.
Заполнение полей голосом. Запись звука с микрофона и сохранение в wav для дальнейшего распознования. [сообщение #3459] |
Sat, 21 October 2023 12:27 |
Cleo
Сообщений: 1 Зарегистрирован: October 2023
|
Junior Member |
|
|
Приветствую форумчани!
Возникла проблема =( Решил добавить в свой проект печаталку текста через микрофон.
Но никак не получается записать звук и отсейвить это в wav(ик).
Нужен примерчик именно для VCL =( для FMX много разных. Но весь огромный проект на VCL так что без вариантов.
Я пробовал использовать HWaveIn и TMemoryStream/TFileStream.
Поглядите может вы поймёте в чём дело:
var
WaveIn: HWaveIn;
WaveFormat: TWaveFormatEx;
WaveHeader: TWaveHdr;
Buffer: array[0..1023] of Byte;
FileStream: TFileStream;
// старт записи
procedure TForm1.Button1Click(Sender: TObject);
begin
WaveFormat.wFormatTag := WAVE_FORMAT_PCM;
WaveFormat.nChannels := 1;
WaveFormat.nSamplesPerSec := 44100;
WaveFormat.nAvgBytesPerSec := WaveFormat.nSamplesPerSec * WaveFormat.nChannels * 2;
WaveFormat.nBlockAlign := 2;
WaveFormat.wBitsPerSample := 16;
WaveFormat.cbSize := 0;
WaveInOpen(@WaveIn, WAVE_MAPPER, @WaveFormat, 0, 0, 0);
WaveInStart(WaveIn);
WaveInPrepareHeader(WaveIn, @WaveHeader, SizeOf(WaveHeader));
WaveInAddBuffer(WaveIn, @WaveHeader, SizeOf(WaveHeader));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FileStream := TFileStream.Create('c:\wav\sound.wav', fmCreate);
try
WaveInUnprepareHeader(WaveIn, @WaveHeader, SizeOf(WaveHeader));
WaveInStop(WaveIn);
WaveInClose(WaveIn);
FileStream.WriteBuffer(WaveFormat, SizeOf(WaveFormat));
FileStream.WriteBuffer(WaveHeader.lpData^, WaveHeader.dwBufferLength);
ShowMessage('Звук успешно сохранен!');
finally
FileStream.Free;
end;
end;
Кстати очень удивило что нет ни одного рабочего примера в интернете. Вроде ведь часто кому может потребоваться.
TMediaPlayer тоже не сейвит у меня звуки почему-то =(
так как везде примеры с MediaPlayer1.DeviceType := dtAudioIn; или MediaPlayer1.DeviceType := dMicrophone;
а в моей дельфи 2020года есть только dtWaveAudio который почему то не хочет писать и сейвить вавики =(
пОмОхИте чем сможите))
Спасибо
var
WaveIn: HWAVEIN;
WaveHeader: PWAVEHDR;
Stream: TMemoryStream;
//start button
var
WaveFormat: TWaveFormatEx;
begin
WaveIn := 0;
WaveHeader := nil;
Stream := TMemoryStream.Create;
// инициализация записи
WaveFormat.wFormatTag := WAVE_FORMAT_PCM;
WaveFormat.nChannels := 1;
WaveFormat.nSamplesPerSec := 44100;
WaveFormat.wBitsPerSample := 16;
WaveFormat.nBlockAlign := WaveFormat.nChannels * (WaveFormat.wBitsPerSample div 8);
WaveFormat.nAvgBytesPerSec := WaveFormat.nSamplesPerSec * WaveFormat.nBlockAlign;
WaveFormat.cbSize := 0;
waveInOpen(@WaveIn, WAVE_MAPPER, @WaveFormat, 0, 0, WAVE_FORMAT_DIRECT);
// выделение памяти под буфер
GetMem(WaveHeader, SizeOf(WAVEHDR));
WaveHeader^.lpData := AllocMem(8192);
WaveHeader^.dwBufferLength := 8192;
WaveHeader^.dwBytesRecorded := 0;
WaveHeader^.dwUser := 0;
WaveHeader^.dwFlags := 0;
WaveHeader^.dwLoops := 0;
WaveHeader^.lpNext := nil;
WaveHeader^.reserved := 0;
// запись звука
waveInPrepareHeader(WaveIn, WaveHeader, SizeOf(WAVEHDR));
waveInAddBuffer(WaveIn, WaveHeader, SizeOf(WAVEHDR));
waveInStart(WaveIn);
//stop button
waveInStop(WaveIn);
waveInUnprepareHeader(WaveIn, WaveHeader, SizeOf(WAVEHDR));
Stream.Write(WaveHeader^.lpData^, WaveHeader^.dwBytesRecorded);
Stream.SaveToFile('sound.wav');
FreeMem(WaveHeader^.lpData);
FreeMem(WaveHeader);
waveInClose(WaveIn);
Stream.Free;
Забыл сказать что касперски спрашивает можно ли делать запись с мика и я ему разрешаю... но ничего.. =(
есть ещё такой пример
uses
HWaveIn, WaveIO;
var
WaveIn: THWaveIn;
WaveFile: TWaveFile;
WaveFormat: TWaveFormatEx;
Buffer: Pointer;
BufferSize: Cardinal;
begin
// Создаем и настраиваем компонент HWaveIn
WaveIn := THWaveIn.Create(nil);
WaveIn.DeviceID := 0; // Используем первое устройство записи
WaveIn.WaveFormat.FormatTag := WAVE_FORMAT_PCM;
WaveIn.WaveFormat.Channels := 1;
WaveIn.WaveFormat.SamplesPerSec := 48000;
WaveIn.WaveFormat.BitsPerSample := 16;
WaveIn.WaveFormat.BlockAlign := WaveIn.WaveFormat.Channels * (WaveIn.WaveFormat.BitsPerSample div 8);
WaveIn.WaveFormat.BytesPerSec := WaveIn.WaveFormat.SamplesPerSec * WaveIn.WaveFormat.BlockAlign;
WaveIn.BufferSize := 1024;
WaveIn.Open;
// Создаем WAV-файл для записи
WaveFormat := WaveIn.WaveFormat;
WaveFile := TWaveFile.Create('C:\MyRecord.wav', WaveFormat);
// Запускаем запись
WaveIn.Start;
// Записываем данные в файл
while WaveIn.GetBuffer(Buffer, BufferSize) = 0 do
begin
WaveFile.WriteData(Buffer, BufferSize);
end;
// Останавливаем запись
WaveIn.Stop;
// Освобождаем ресурсы
WaveFile.Free;
WaveIn.Free;
end.
но что за компонент такой TWaveFile; один бог знает... моя система его не видет и в интернете о нём ни слова...
|
|
|
Переход к форуму:
Текущее время: Sat Dec 21 20:05:25 GMT+3 2024
Общее время, затраченное на создание страницы: 0.00765 секунд
|