Начало » Программирование » 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; один бог знает... моя система его не видет и в интернете о нём ни слова... 
		
		
		
 |  
	| 
		
	 | 
 
 
 |   
Переход к форуму:
 
 Текущее время: Tue Nov 04 15:45:50 GMT+3 2025 
 Общее время, затраченное на создание страницы: 0.00658 секунд 
 |