![]() |
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 |
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? :?: |
Re: Sprachausgabe
Problem gelöst...
|
Re: Sprachausgabe
Zitat:
|
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: |
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 |
Re: Sprachausgabe
Zitat:
|
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: |
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.
|
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 |
Re: Sprachausgabe
Zitat:
|
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; |
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