Skip to content

Commit 1b4b11f

Browse files
deploy: 9a7243f
1 parent 055882c commit 1b4b11f

File tree

5 files changed

+56
-31
lines changed

5 files changed

+56
-31
lines changed

.doctrees/environment.pickle

0 Bytes
Binary file not shown.

.doctrees/index.doctree

-88 Bytes
Binary file not shown.

_sources/index.rst.txt

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -205,27 +205,40 @@ Due to the overhead of the router (API call) - realtime only supports a single a
205205

206206
Realtime uses MongoDB for memory so Zep is not needed.
207207

208+
This example will work using expo-audio on Android and iOS.
209+
208210
.. code-block:: python
209211
210212
from solana_agent import SolanaAgent
211213
212214
solana_agent = SolanaAgent(config=config)
213215
214-
# Example: mobile sends MP4/AAC; server encodes output to AAC
215-
audio_content = await audio_file.read() # bytes
216-
async for audio_chunk in solana_agent.process(
217-
"user123", # required
218-
audio_content, # required
219-
realtime=True, # optional (default False)
220-
output_format="audio", # required
221-
vad=True, # enable VAD (optional)
222-
rt_encode_input=True, # accept compressed input (optional)
223-
rt_encode_output=True, # encode output for client (optional)
224-
rt_voice="marin" # the voice to use for interactions (optional)
225-
audio_input_format="mp4", # client transport (optional)
226-
audio_output_format="aac" # client transport (optional)
227-
):
228-
handle_audio(audio_chunk)
216+
audio_content = await audio_file.read()
217+
218+
async def generate():
219+
async for chunk in solana_agent.process(
220+
user_id=user_id,
221+
message=audio_content,
222+
realtime=True,
223+
rt_encode_input=True,
224+
rt_encode_output=True,
225+
rt_voice="marin",
226+
output_format="audio",
227+
audio_output_format="m4a",
228+
audio_input_format="mp4",
229+
):
230+
yield chunk
231+
232+
return StreamingResponse(
233+
content=generate(),
234+
media_type="audio/mp4",
235+
headers={
236+
"Cache-Control": "no-store",
237+
"Pragma": "no-cache",
238+
"Content-Disposition": "inline; filename=stream.m4a",
239+
"X-Accel-Buffering": "no",
240+
},
241+
)
229242
230243
Image/Text Streaming
231244
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

index.html

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -258,25 +258,37 @@ <h3>Realtime Audio<a class="headerlink" href="#realtime-audio" title="Link to th
258258
<p>If input and/or output is encoded (compressed) like mp4/aac then you must have ffmpeg installed.</p>
259259
<p>Due to the overhead of the router (API call) - realtime only supports a single agent setup.</p>
260260
<p>Realtime uses MongoDB for memory so Zep is not needed.</p>
261+
<p>This example will work using expo-audio on Android and iOS.</p>
261262
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span><span class="w"> </span><span class="nn">solana_agent</span><span class="w"> </span><span class="kn">import</span> <span class="n">SolanaAgent</span>
262263

263264
<span class="n">solana_agent</span> <span class="o">=</span> <span class="n">SolanaAgent</span><span class="p">(</span><span class="n">config</span><span class="o">=</span><span class="n">config</span><span class="p">)</span>
264265

265-
<span class="c1"># Example: mobile sends MP4/AAC; server encodes output to AAC</span>
266-
<span class="n">audio_content</span> <span class="o">=</span> <span class="k">await</span> <span class="n">audio_file</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> <span class="c1"># bytes</span>
267-
<span class="k">async</span> <span class="k">for</span> <span class="n">audio_chunk</span> <span class="ow">in</span> <span class="n">solana_agent</span><span class="o">.</span><span class="n">process</span><span class="p">(</span>
268-
<span class="s2">&quot;user123&quot;</span><span class="p">,</span> <span class="c1"># required</span>
269-
<span class="n">audio_content</span><span class="p">,</span> <span class="c1"># required</span>
270-
<span class="n">realtime</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="c1"># optional (default False)</span>
271-
<span class="n">output_format</span><span class="o">=</span><span class="s2">&quot;audio&quot;</span><span class="p">,</span> <span class="c1"># required</span>
272-
<span class="n">vad</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="c1"># enable VAD (optional)</span>
273-
<span class="n">rt_encode_input</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="c1"># accept compressed input (optional)</span>
274-
<span class="n">rt_encode_output</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="c1"># encode output for client (optional)</span>
275-
<span class="n">rt_voice</span><span class="o">=</span><span class="s2">&quot;marin&quot;</span> <span class="c1"># the voice to use for interactions (optional)</span>
276-
<span class="n">audio_input_format</span><span class="o">=</span><span class="s2">&quot;mp4&quot;</span><span class="p">,</span> <span class="c1"># client transport (optional)</span>
277-
<span class="n">audio_output_format</span><span class="o">=</span><span class="s2">&quot;aac&quot;</span> <span class="c1"># client transport (optional)</span>
278-
<span class="p">):</span>
279-
<span class="n">handle_audio</span><span class="p">(</span><span class="n">audio_chunk</span><span class="p">)</span>
266+
<span class="n">audio_content</span> <span class="o">=</span> <span class="k">await</span> <span class="n">audio_file</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
267+
268+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">generate</span><span class="p">():</span>
269+
<span class="k">async</span> <span class="k">for</span> <span class="n">chunk</span> <span class="ow">in</span> <span class="n">solana_agent</span><span class="o">.</span><span class="n">process</span><span class="p">(</span>
270+
<span class="n">user_id</span><span class="o">=</span><span class="n">user_id</span><span class="p">,</span>
271+
<span class="n">message</span><span class="o">=</span><span class="n">audio_content</span><span class="p">,</span>
272+
<span class="n">realtime</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
273+
<span class="n">rt_encode_input</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
274+
<span class="n">rt_encode_output</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
275+
<span class="n">rt_voice</span><span class="o">=</span><span class="s2">&quot;marin&quot;</span><span class="p">,</span>
276+
<span class="n">output_format</span><span class="o">=</span><span class="s2">&quot;audio&quot;</span><span class="p">,</span>
277+
<span class="n">audio_output_format</span><span class="o">=</span><span class="s2">&quot;m4a&quot;</span><span class="p">,</span>
278+
<span class="n">audio_input_format</span><span class="o">=</span><span class="s2">&quot;mp4&quot;</span><span class="p">,</span>
279+
<span class="p">):</span>
280+
<span class="k">yield</span> <span class="n">chunk</span>
281+
282+
<span class="k">return</span> <span class="n">StreamingResponse</span><span class="p">(</span>
283+
<span class="n">content</span><span class="o">=</span><span class="n">generate</span><span class="p">(),</span>
284+
<span class="n">media_type</span><span class="o">=</span><span class="s2">&quot;audio/mp4&quot;</span><span class="p">,</span>
285+
<span class="n">headers</span><span class="o">=</span><span class="p">{</span>
286+
<span class="s2">&quot;Cache-Control&quot;</span><span class="p">:</span> <span class="s2">&quot;no-store&quot;</span><span class="p">,</span>
287+
<span class="s2">&quot;Pragma&quot;</span><span class="p">:</span> <span class="s2">&quot;no-cache&quot;</span><span class="p">,</span>
288+
<span class="s2">&quot;Content-Disposition&quot;</span><span class="p">:</span> <span class="s2">&quot;inline; filename=stream.m4a&quot;</span><span class="p">,</span>
289+
<span class="s2">&quot;X-Accel-Buffering&quot;</span><span class="p">:</span> <span class="s2">&quot;no&quot;</span><span class="p">,</span>
290+
<span class="p">},</span>
291+
<span class="p">)</span>
280292
</pre></div>
281293
</div>
282294
</section>

0 commit comments

Comments
 (0)