Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Sprachausgabe (https://www.delphipraxis.net/118808-sprachausgabe.html)

riko.delphipraxis 15. Aug 2008 09:38


Sprachausgabe
 
Hallo Leute,

ich bin neu hier und hab gleich mal eine Frage an euch...

Also, ich hab eine ip-Kamera (Sony SNC-RZ25) und möchte auf deren Lautsprecher den Input von einem PC-Mikrofon ausgeben. Hab aber noch nie was mit audio programmiert.
Als Format habe ich in der Kamera "G.711 64kbit" eingestellt...

Leider kommt da immer nur rauschen raus... :cry:

Also laut Wiki "Bei G.711 wird in Schritten von 125 µs jeweils ein 8-Bit-Sample des Audiosignals per PCM-Verfahren erzeugt"...

Das heisst ja eigentlich das ich zB. mit der BASS.dll die Samplerate auf 64000 (125µs -> 8000 mal/sek *8bit) einstellen muss oder muss man da noch was verschlüsseln?

Bin für jede Hilfe dankbar... :)

lg.
Richard

riko.delphipraxis 7. Sep 2008 21:45

Re: Sprachausgabe
 
So. Habe heute wieder ein wenig Zeit gehabt und mich mit meiner Kamera gespielt...

Die Ausgabe der Sprache durch die Kameralautsprecher funktioniert jetzt...zumindest fast.
(aufnahme mit 8000 Samples 16bit Mono -> umwandeln nach G.711 -> zur Kamera streamen).
Ich habe aber noch ein leises Echo in der Ausgabe...:(

Bei den Mixer-Einstellungen ist unter Ausgabe der Ton vom Mikro abgeschalten.
Hat jemand eine Idee an was das liegen kann und wie ich das wegbekomme?
:?:

riko.delphipraxis 10. Sep 2008 21:00

Re: Sprachausgabe
 
Problem gelöst...

Mackhack 10. Sep 2008 21:05

Re: Sprachausgabe
 
Zitat:

Zitat von riko.delphipraxis
Problem gelöst...

Wirst sicherlich auch noch berichten wie du es angestellt hast sodass andere auch was von deinen Erfahrungen haben!

riko.delphipraxis 10. Sep 2008 22:58

Re: Sprachausgabe
 
Das Problem war eigentlich keins... :wink:

Die Kamera und das Mikro waren zum Testen natürlich im selben Raum.
Daraus hat sich anscheinend während des sprechens eine Rückkopplung der Ausgabe zum Mikro ergeben obwohl ich es abgeschirmt hatte...

Nachdem ich die Kamera in einen anderen Raum angeschlossen habe funktionierte alles wie gewünscht... :thumb:

WS1976 11. Sep 2008 06:46

Re: Sprachausgabe
 
Hallo,

hast du dir schon Mal überlegt wo du dich hier befindest? In einem Delphi-Forum!
ich frag mich immer wieder was solche Beiträge mit Delphi oder programmieren im Allgemeinen zu tun haben.
Vom Titel her hätte mich der Beitrag schon interessiert.

Grüsse
Rainer

Mackhack 11. Sep 2008 07:28

Re: Sprachausgabe
 
Zitat:

Zitat von WS1976
Vom Titel her hätte mich der Beitrag schon interessiert.

Grüsse
Rainer

Dito, deshalb hab ich reingeschaut!

riko.delphipraxis 11. Sep 2008 08:23

Re: Sprachausgabe
 
Ich kann eure Argumentation nicht ganz nachvollziehen... :gruebel:

Ich habe mich an das Forum gewandt da ich ein Problem hatte mit Audioübertragung mit Delphi hatte!
Nachdem ich mich schon 2 Tage damit herumgeschlagen habe dachte ich mir das es möglicherweise in so einem Forum Leute gibt die da ganz gut drauf sind im vergleich zu mir. Ich hatte ja zuvor noch nie was mit Audio zu tun gehabt.

Der Titel ist vieleicht nicht ganz korrekt, aber es geht ja um Sprachausgabe...

Da sich niemand gemeldet hat oder mir irgend einen Ansatz gezeigt hat gibts hier auch keinen Code.

Was willst du?
Meiner Meinung nach ist ein Forum, und speziell dieses eigentlich dafür gedacht jemandem weiterzuhelfen...Delphi...programmieren...

Aber ich muss ja nicht jede Meinung teilen...
:hi:

mkinzler 11. Sep 2008 08:26

Re: Sprachausgabe
 
Das Forum lebt vom Geben, nicht vom Nehmen. Nur weil dir bei diesem Problem keiner helfen konnte, heisst es doch nicht das deine Lösung nicht vielleicht für andere hilfreich wäre.

WS1976 11. Sep 2008 12:37

Re: Sprachausgabe
 
Hallo,

also ich kann in dem ganzen Beitrag, auch nach intensivem Suchen, nirgendswo irgeneinen Bezug zu Delphi oder etwas anderem programmiertechnischen Aspekt erkennen.

Grüsse
Rainer

Meflin 11. Sep 2008 12:39

Re: Sprachausgabe
 
Zitat:

Zitat von riko.delphipraxis
Ich kann eure Argumentation nicht ganz nachvollziehen... :gruebel:

Keine Sorge, du bist hier schon richtig ;)

riko.delphipraxis 11. Sep 2008 20:22

Re: Sprachausgabe
 
OK, danke. Ich dachte schon ich habe Verständigungsprobleme... :lol:

Dann gibts hier also einen Ausschnitt aus meinem code...
Quick&Dirty aus meinen units kopiert... 8)

Alles relevante sollte dabei sein... :hi:

Delphi-Quellcode:
{* ENCODING STUFF ==========================================*}

Var
pcm2uLawMap : array[0..65535] of byte; // the encoding map

// create encoding map for faster processing
procedure TForm2.CreateMuLawMap;
Var i : Integer;
begin
   for i:=-32768 to 32767 do
     pcm2uLawMap[(i AND $ffff)] := pcm2ulaw(i);
end;

// create ulaw Byte from 16bit sample
function TForm2.pcm2ulaw(sample:smallint):byte;
var
  sign, exponent, mantissa, mask, seg:smallint;
  uval : Byte; // encoded return value

const
  BIAS = $84;  // define the add-in bias for 16 bit samples
  CLIP = 8159; // define max value to clip magnitude
  seg_uend:array[0..7] of smallint = ($3F, $7F, $FF, $1FF, $3FF, $7FF, $FFF, $1FFF);

// search sample segment
function search(val,size : smallint) : smallint;
var i : smallint;
begin
  for i:=0 to size-1 do
    if (val <= seg_uend[i]) then
    begin
      result:=i;
      break;
    end;
  end;

begin
  // Get the sign and the magnitude of the value.
  sample := sample shr 2;
  if (sample < 0) then
  begin
    sample := -sample;
    mask := $7F;
  end else mask := $FF;
  if ( sample > CLIP ) then sample := CLIP; // clip the magnitude
  sample := (sample + BIAS) shr 2;         // Convert the scaled magnitude to segment number.
  seg := search(sample,8);
  {* Combine the sign, segment, quantization bits;
   * and complement the code word. }
  if (seg >= 8) then                  // out of range, return maximum value.
    result:= byte($7F XOR mask)
  else
  begin
    {* The mu-law byte bit arrangement
     * is SEEEMMMM (Sign, Exponent, and Mantissa.) }
    uval := byte((seg shl 4) or ((sample shr (seg + 1)) AND $F));
    result:= byte(uval XOR mask);
  end;
end;

// do the encoding of the record buffer
procedure TForm2.G711_Encode(inbuf: PByte; inlen: Integer; outbuf: PByte; var outlen: Integer);
var
  i: Integer;
begin
  for i:=0 to (inlen div 2)-1 do // 16bit to 8bit
    // take the value out of the map
    PByte(integer(outbuf)+i)^ := pcm2uLawMap[PSmallint(integer(inbuf)+i*2)^ AND $FFFF];
  outlen:=inlen div 2;
end;

{* ENCODING STUFF ==========================================*}

// constants for BASS initialization
const
  cDefaultDevice = -1;   // Default Device Identifier
  cSampleRate = 8000;    // PCM-Audio
  cNumChannels = 1;      // Mono
  cRecordingTime = 100;  // ms (10 - 500 ms / Default 100 ms)
  c16BitAudio = 0;       // Flag für 16 Bit Audio  1=Nein
  cDefaultUser = nil;    // UserIdentifier (not used)
  cDirectXPointer = nil; // Pointer für DirectX Class Identifier

// initializations on startup
procedure TForm1.doInit;
begin
  CreateMuLawMap;
end;

// button to make announcement
procedure TForm1.bAnnounceClick(Sender: TObject);
begin
  if BASS_ChannelIsActive(rchan) <> 0 then
    StopAnnouncement(activeCAM)
  else StartAnnouncement(activeCAM);
end;

// start the announcement
procedure TForm1.StartAnnouncement(iCAM : PcamItem);
Var Flag : DWORD;
begin
   Flag := MakeLong(c16BitAudio,cRecordingTime);
   RChan := BASS_RecordStart (cSampleRate,
                              cNumChannels,
                              Flag,
                              @RecordingCallback,
                              cDefaultUser);
   if rchan = 0 then
   begin
     MessageDlg('Fehler: Durchsage kann nicht gestartet werden!', mtError, [mbOk], 0);
     WaveStream.Clear;
   end else OpenCamSpeaker(iCAM);
end;

// stop the announcement
procedure TForm1.StopAnnouncement(iCAM : PcamItem);
begin
  iCAM^.SpeakerOpen := false;
  BASS_ChannelStop(rchan);
  iCAM^.tcp.Disconnect;
end;

// callback from BASS
function RecordingCallback(Handle: HRECORD; buffer: Pointer; length, user: DWord): boolean; stdcall;
Var mybuffer : Pointer;
    outlen : Integer;
    LocalBuffer : Pointer;
begin
  if activeCAM^.SpeakerOpen then
  begin
    GetMem(LocalBuffer,length);
    GetMem(myBuffer,length);
    CopyMemory(LocalBuffer,buffer,length);
    G711_Encode(LocalBuffer,length,mybuffer,outlen);
    activeCAM^.tcp.WriteBuffer(mybuffer^,outlen,true);
    FreeMem(mybuffer,length);
    FreeMem(LocalBuffer,length);
  end;
  result := True;
end;

// open connection to cam speaker
procedure TForm1.OpenCamSpeaker(iCAM : PcamItem);
Var send_dat: sysUtils.PByteArray;
    helper : String;
begin
  // connect to cam
  iCAM^.tcp.Host:=iCAM^.IP;
  iCAM^.tcp.Port:=iCAM^.port;
  if not iCAM^.tcp.Connected then iCAM^.tcp.Connect;
  // wait for connection established
  while not iCAM^.tcp.Connected do
  begin
    Application.ProcessMessages;
  end;

  // send opening header to cam
  getmem(send_dat,1024);
  helper:=helper + 'GET http://'+iCAM^.IP+'/audio-out/g711_64.cgi HTTP/1.1' + #13 + #10;
  helper:=helper + 'HOST: '+selfIP+ #13 + #10;
  helper:=helper + 'Connection: close'+ #13 + #10;
  helper:=helper + 'Authorization: Basic '+iCAM^.password+'+ #13 + #10 + #13 + #10;
  move(helper[1],send_dat^[0],length(helper));
  iCAM^.tcp.WriteBuffer(send_dat^[0],length(helper));
  iCAM^.SpeakerOpen := true;
  freemem(send_dat);
end;

hathor 12. Sep 2008 11:21

Re: Sprachausgabe
 
Der Titel ist immer noch falsch - SPRACHAUSGABE ist was anderes!

Gib mal in der Suchfunktion TextToSpeech ein, dann findest Du was über Sprachausgabe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz