I plan to develop Android application which will encrypt/decrypt voice data such that parties can communicate using secure channel. So the question is: how to intercept voice/audio data during GSM call? Is it possible or not? Should I use Android NDK or something else?
In GSM it is not possible to encrypt the voice and send it through the voice channel due to channel characteristics. The signal sent through the voice channel has to be (similar to) human voice as vocoder (CELP) is used for channel coding.
So even if you had access to low level libraries and used it to encrypt voice to send it directly through the voice channel it would be not possible for the called party to receive and decrypt the signal.
Encrypted voice however could be sent through the data channel as data.
This is something that happens in the low level of the operating system. You wouldn't be able to access this information in the application level.
I suggest that you look into VOIP like SipDroid. I bet you'll be able to set it up to use encryption easily. (srtp instead of rtp)
Even if you SipDroid doesn't support this, it's is open source so you could add this feature.
Call recording is not yet possible on Android. See this feature request.
You can record your voice from microphone, but you can not record the sound of the other party. If you only want to record your voice use android.media.MediaRecorder.AudioSource.MIC
Simple Answer, NO!
if you are able to access low level libraries and used it to encrypt voice to send it directly through the voice channel off course it would not be possible for the called party to receive and decrypt the signal but if you modulate encrypted voice data and transform this voice data into speech like waveform and send through the voice channel of GSM then surely other party will receive and decrypt the voice.
I know there are apps that act like voice changer where they change your voice and transmit that thru gsm voice. Maybe you can make an app that takes the voice then modulate it to something like phase shift keying or digital radio monodiale like what hams used in vhf and hf radio communication and transmit the audio to gsm then demodulate it back to voice but instead of straight forward modulation demodulation you can add pgp, aes, or whatever encryption you like. I'm also intrested to see a project like this.
I think it would also be great if you could use this to transmit data thru voice gsm channel like the 56k modems in the past instead of the gprs channel.
See reference
http://freedv.org/tiki-index.php
http://www.aprs.org
Related
I am working on an android app in which I want to implement voice changing functionality during a call. I have googled a lot and I found that it is only possible using VOIP.
I have a few questions about that task:
Although I found that it is only possible using VOIP, but still let me ask my doubt, can we change the pitch of voice during a call in Rooted or Non-rooted mobile, programmatically.
If this implemented using VOIP, then what I come to know is that we have to maintain a asterisk server for this. Then does the voice changing process happen on asterisk server or at mobile side and how?
You can do this on the server side with Asterisk. I do not know how you want your app to be structured, but if you go the Asterisk way, the app will become like a conference call. Like so:
You call a number (Asterisk server).
Asterisk server dials desired number.
Your voice packets are transformed on the server and sent on to the receiver.
If your telecom laws do not support it, the number that flashes on the receiver's phone will have to be the Asterisk server/exchanges.
When I worked low level with GSM modem it was possible to transmit data during the voice call through data channel (some info here https://en.wikipedia.org/wiki/GSM). So, for example, with the help of the AT commands to the gsm modem I could send the "1" and on the other side to get the "1".
The flow was: 1. Dial number. 2 Transmit data. I remember that I've even written my own ppp->icmp/ip->udp stack on the assembler. so my device was able to communicate through this gsm-modem with internet service providers.
(Also it was possible to talk if to connect the mic and headphones to the gsm modem and transmit data at the same time.)
The question is how to do similar in android. Is it possible to transmit data over this data channel with the help of the android API?
As far I know you can't do that in the Android. Simply you can't modify programmatically a call in any way. The API won't allow it.
That's why we don't have any working answering machine apps on the market.
I want to know in Android it is possible to transmit modulated voice like Ultra voice changer app does during a call. I have searched a lot but I only got results for how to change voice after recording. So, please reply me that is it possible to transmit changed voice at a time of call in Android.
It seems not possible. According to this XDA-Post "The calling screen is built within the phone". You can replace a dialer, but are not able to intercept the voice spoken during a call.
I cannot find any official API from android, which would make it possible to write your own "calling" App (which means record voice and send it).
The GSM full rate speech codec operates at 13 kbits/s and uses a Regular Pulse Excited (RPE) codec - This means that the microphone and speech detection in GSM is optimised for transmission across a Time Division Multiplexed 'digital' channel that is then modulated across the air interface using GMSK, a continuous-phase frequency-shift keying modulation scheme.
Noises other than the 'average' speech pattern are heavily distorted (or suppressed) - For instance DTMF (tones) are not well received on a device, and must be transmitted by the network core, but tones designed for the hearing impaired work well. Voice is shaped (filtered) on entry to the codec (microphone design) for best codec detection and reproduction at the other end.
In summary - It is not possible to 're-modulate' across the GSM system, because the entry point is not a radio (air interface), or even access the GSM digital frame. Your only access for a voice call is the GSM codec which is expecting a voice in a confined audio spectrum.
I know there are apps that act like voice changer where they change your voice and transmit that thru gsm voice. Maybe you can make an app that takes the voice then modulate it to something like phase shift keying or digital radio monodiale like what hams used for digital vhf, hf, dpmr, mototrbo radio communication and transmit the audio thru gsm voice channel then demodulate it back to normal voice but instead of straight forward modulation demodulation you can add pgp, aes, pre shared keys, blowfish or whatever encryption you like. I'm also intrested to see a project like this.
I think it would also be great if we could use this to transmit data thru voice gsm channel like the 56k dial up modems in the past instead of the gprs data channel allowing you to make data connection to other cellphone to transfer files without incurring additional data charges which is really good for subscribers with unlimited call plans.
See reference:
http://freedv.org/tiki-index.php
http://www.aprs.org
is it possible in android to make a phone call or SIP call and play a soundfile after the call is established? Other option that would be ok for me is that after the established call the TTS engine reads some text so that the person on the other side could hear that.
Is this possible?
Thanks!
If you mean played locally (i.e. only you can hear it), then sure. That should be working without using any special tricks.
If you mean inject audio into the uplink so that the other party can hear it, then no - at least not during a normal voice call. Perhaps it would be possible during a SIP call if you implement the whole SIP stack yourself and generate the audio packets in your app. I'm not really familiar with how SIP calls works, so I can't say whether that would work or not.
I would like to do an application in android which translates speech from incoming call to text. Since i cant connect to mobile data while on call, i have to do the conversion offline.. Is it possible? Can I use any API or libraries to do it? Also is there any restrictions in tapping incoming voice? Please do reply..
Regular apps can record the phone owner side of the conversation, but to also record the remote user's voice, you need to have root access as well as a kernel patch.
As far as voice transcription, I don't know of any api you could use for free straight from the phone (assuming you get the recorded audio).