OSCR

Encoding of speech modes and loudness in ventral precentral gyrus.

Code ↔ Paper

13 matches between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 13 matches
  1. [1] § Results › Loudness representation in neural ensemble activity ↔ plotting_scripts/dpca.py, lines 240–288 · score 0.73 · pairwise cosine, dPCs, upper triangle, orthogonality, dPCA, word
  2. [2] § Results › Loudness encoding in ventral precentral gyrus ↔ analyses_scripts/ch_encoding_word.py, lines 150–174 · score 0.72 · post hoc, way ANOVA, word tuning, word pairs, Firing rate, Tukey
  3. [3] § Methods › Data recording and processing › Breath analysis ↔ analyses_scripts/ol_classification.py, lines 140–206 · score 0.69 · trained logistic regression, cross validation, neural features, shuffled, fold, classifiers
  4. [4] § Methods › Data recording and processing › Offline loudness decoder training and analyses ↔ analyses_scripts/ol_striding_classification.py, lines 234–304 · score 0.68 · cross validation, logistic regression, decoding accuracy, stride, permutation, trained
  5. [5] § Methods › Data recording and processing › Firing rate analyses ↔ analyses_scripts/ch_encoding_word.py, lines 150–174 · score 0.66 · post hoc, way ANOVA, firing rate, Tukey, encodes, electrode
  6. [6] § Methods › Data recording and processing › Firing rate analyses ↔ analyses_scripts/ch_encoding_loudness.py, lines 150–175 · score 0.65 · post hoc, way ANOVA, firing rate, Tukey, encodes, electrode
  7. [7] § Results › Loudness representation in neural ensemble activity ↔ plotting_scripts/dpca.py, lines 240–288 · score 0.63 · dot product, Explained variance, orthogonal, triangle, PCs, axis
  8. [8] § Methods › Data recording and processing › Breath analysis ↔ analyses_scripts/ol_striding_classification.py, lines 549–626 · score 0.62 · trained logistic regression, cross validation, neural features, fold, classifiers, accuracy
  9. [9] § Methods › Data recording and processing › Breath analysis ↔ plotting_scripts/speech_breath_analyses.py, lines 120–228 · score 0.60 · minimum breath belt, breath cycle
  10. [10] § Methods › Data recording and processing › Spike sorting and single-unit analyses ↔ analyses_scripts/ch_encoding_loudness.py, lines 150–175 · score 0.59 · post hoc, way ANOVA, firing rate, Tukey, tuned, loudness
  11. [11] § Results › Offline decoding of loudness ↔ plotting_scripts/ol_striding_classification.py, lines 42–159 · score 0.58 · cluster permutation, cue onset, Loudness decoders, vertical, stride, window
  12. [12] § Methods › Behavioral tasks › Instructed breathing task ↔ plotting_scripts/speech_breath_analyses.py, lines 120–228 · score 0.57 · instructed breathing, breath belt, attempted loudness
  13. [13] § Methods › Data recording and processing › Behavioral data ↔ analyses_scripts/psth.py, lines 136–198 · score 0.54 · Gaussian smoothing, go period, binned

Paper

Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

Python · 288 lines · 13 KB · CC-BY-NC-SA-4.0 · 2 matches

  1. # This script plots dPCA results: projections, explained variance, correlation matrix.
  2. import argparse
  3. import numpy as np
  4. import scipy
  5. import math
  6. import os
  7. from datetime import datetime
  8. import matplotlib.pyplot as plt
  9. from matplotlib.colors import LinearSegmentedColormap
  10. '''
  11. Example cmd (when run from this directory; provide python script path appropriately if run from different directory):
  12. For t15,
  13. python dpca.py --participant t15 --session word-loudness --nbins_before_onset 75 --nbins_after_onset 75 --savepath_data ../plotting_data/t15/word-loudness/dPCA/ --savepath_fig ../plotting_figures/t15/word-loudness/dPCA/
  14. For t16,
  15. python dpca.py --participant t16 --session word-loudness --nbins_before_onset 75 --nbins_after_onset 75 --savepath_data ../plotting_data/t16/word-loudness/dPCA/ --savepath_fig ../plotting_figures/t16/word-loudness/dPCA/
  16. Data will be loaded from the specified savepath_data directory.
  17. Figures will be saved in the specified savepath_fig directory.
  18. '''
  19. #-----------------------
  20. # global variables
  21. #-----------------------
  22. amplitudes = ['MIME', 'WHISPER', 'NORMAL', 'LOUD']
  23. words = ['be', 'my', 'know', 'do', 'have', 'going']
  24. marg_names = ['Word', 'Loudness', 'Condition\nindependent', 'Interaction']
  25. num_pcs_plot = 3
  26. # plotting
  27. marg_plotting_order = ['Condition\nindependent', 'Word', 'Loudness', 'Interaction']
  28. marg_plotting_order_ind = [2, 0, 1, 3]
  29. target_color = [ # word colors
  30. (0.9254902, 0.12156863, 0.14117647),
  31. (0.98431373, 0.72941176, 0.07058824),
  32. (0.384, 0.682, 0.2),
  33. (0.43137255, 0.79607843, 0.85490196),
  34. [0.45568627, 0.31764706, 0.63529412],
  35. (0.84705882, 0.2627451, 0.59215686)
  36. ]
  37. hue = [0.25, 0.5, 0.75, 1]
  38. linewidth = [0.5, 1, 1.5, 2]
  39. scatter_size = 30
  40. fontsize = 15
  41. my_explode = [0.1] * len(marg_names)
  42. my_color = [ # ordered similar to marg names
  43. (150/255, 54/255, 34/255), # word, red
  44. (34/255, 54/255, 150/255), # loudness, blue
  45. (128/255, 128/255, 128/255), # condition independent, gray
  46. (150/255, 34/255, 150/255), # interaction, purple
  47. ]
  48. #-----------------------
  49. # functions
  50. #-----------------------
  51. def plot_projections(projections, which_marg, explained_var):
  52. fig, ax = plt.subplots(len(marg_names), num_pcs_plot, figsize = (12,6))
  53. for marg in range(len(marg_names)):
  54. marg_ind_to_plot = marg_plotting_order_ind[marg]
  55. components = [i for i, val in enumerate(which_marg.squeeze()) if val == marg_ind_to_plot]
  56. comp_min = 1000; comp_max = -1
  57. for comp in range(min(num_pcs_plot, len(components))):
  58. for d1 in range(len(words)):
  59. for d2 in range(len(amplitudes)):
  60. # Plot the data
  61. ax[marg, comp].plot(
  62. time[args.participant],
  63. np.squeeze(projections[components[comp], d1, d2, :]),
  64. linestyle = '-',
  65. color=target_color[d1],
  66. alpha = hue[d2],
  67. linewidth = linewidth[d2],
  68. label=f"{amplitudes[d2]} {words[d1]}"
  69. )
  70. comp_min = min(comp_min, np.min(np.squeeze(projections[components[comp], d1, d2, :])))
  71. comp_max = max(comp_max, np.max(np.squeeze(projections[components[comp], d1, d2, :])))
  72. ax[marg, comp].set_ylim([math.floor(comp_min), math.ceil(comp_max)])
  73. ax[marg, comp].scatter(0, math.floor(comp_min) + (math.ceil(comp_max) * 2/20), color='black', s=scatter_size) # speech onset marker
  74. ax[marg, comp].text((args.nbins_after_onset/100)- 0.05, math.ceil(comp_max), f"{explained_var[marg_ind_to_plot,components[comp]]:.1f}%", fontsize = fontsize, ha = 'center') # explained variance % at top right
  75. ax[marg, comp].text(-((args.nbins_before_onset/100) - 0.1), math.floor(comp_min) + 0.07 * (math.ceil(comp_max) - math.floor(comp_min)), f"{components[comp] + 1}", fontsize = fontsize, ha = 'center')
  76. ax[marg, comp].scatter(-((args.nbins_before_onset/100) - 0.1), math.floor(comp_min) + 0.16 * (math.ceil(comp_max) - math.floor(comp_min)), s = 400, color = 'black', facecolor = 'none')
  77. if comp != 0:
  78. for pos in ['right', 'top', 'bottom']:
  79. ax[marg, comp].spines[pos].set_visible(False)
  80. ax[marg, comp].set_xticks([])
  81. ax[marg, comp].set_yticks([])
  82. if comp == 0:
  83. for pos in ['right', 'top', 'bottom',]:
  84. ax[marg, comp].spines[pos].set_visible(False)
  85. ax[marg, comp].set_yticks([math.floor(comp_min), 0, math.ceil(comp_max)],
  86. [math.floor(comp_min), 0, math.ceil(comp_max)], fontsize = fontsize)
  87. ax[marg, comp].set_xticks([])
  88. ax[marg, comp].set_ylabel(marg_names[marg_ind_to_plot], fontsize = fontsize)
  89. if marg == 3 and comp == 2:
  90. ax[marg, comp].hlines(-math.ceil(comp_max), xmin = args.nbins_after_onset/100 - 0.5, xmax = args.nbins_after_onset/100, linewidth = 3, color = 'black')
  91. ax[marg, comp].text(args.nbins_after_onset/100 - 0.25, -1.5, '500 ms', color = 'black', ha = 'center', fontsize = fontsize)
  92. if marg == 3 and comp == 0:
  93. ax[marg, comp].text(0, -1.5, 'Speech onset', color = 'black', ha = 'center', fontsize = fontsize)
  94. if marg == 0 and comp == 0:
  95. ax[marg, comp].text((args.nbins_after_onset/100) - 0.05, math.ceil(comp_max) + 3, 'Explained variance', color = 'black', ha = 'center', fontsize = fontsize)
  96. fig.tight_layout()
  97. plt.subplots_adjust(wspace=0.05)
  98. # plt.show()
  99. # save figure
  100. plt.savefig(f'{args.savepath_fig}{args.participant}_dpca_projections_{formatted_datetime}_{args.nbins_before_onset}_{args.nbins_after_onset}.png', format='png')
  101. return
  102. def plot_explained_variance(explained_var):
  103. fontsize = 13
  104. fig = plt.figure(figsize=(5,5))
  105. plt.subplot(2,1,1)
  106. # pie chart
  107. expl_var_comp = np.sum(explained_var, axis = -1)
  108. marg_names_with_percent = []
  109. for i in range(len(marg_names)):
  110. marg_names_with_percent.append(f'{marg_names[i]}\n({(expl_var_comp[i]/sum(expl_var_comp))*100:.1f}%)')
  111. plt.pie(expl_var_comp, labels = marg_names_with_percent, #autopct='%1.1f%%',
  112. colors = my_color, explode = my_explode, startangle = 140, shadow = False, textprops={'fontsize': fontsize}, labeldistance=1.3)
  113. # stacked bar plot
  114. plt.subplot(2, 1, 2)
  115. num_comps_to_plot = 15
  116. bottom = np.zeros(num_comps_to_plot) # Initialize bottom for stacking
  117. for i in range(len(marg_names)):
  118. plt.bar(np.arange(num_comps_to_plot), explained_var[i, :num_comps_to_plot], label=marg_names[i], color=my_color[i], bottom=bottom)
  119. bottom += explained_var[i, :num_comps_to_plot]
  120. for pos in ['right', 'top']:
  121. plt.gca().spines[pos].set_visible(False)
  122. plt.ylim([0, math.ceil(bottom[0])])
  123. plt.yticks(np.arange(0, math.ceil(bottom[0]), 10), np.arange(0, math.ceil(bottom[0]), 10), fontsize = fontsize)
  124. plt.xticks([0, 4, 9, 14], [1, 5, 10, 15], fontsize = fontsize)
  125. plt.xlabel('dPCA component', fontsize = fontsize)
  126. plt.ylabel('Variance (%)', fontsize = fontsize)
  127. fig.tight_layout()
  128. # plt.show()
  129. # save figure
  130. plt.savefig(f'{args.savepath_fig}{args.participant}_dpca_variance_plot_{formatted_datetime}_{args.nbins_before_onset}_{args.nbins_after_onset}.png', format='png')
  131. return
  132. def plot_correlation(corr_matrix, sig_ind):
  133. fontsize = 19
  134. fig = plt.figure(figsize = (5,5))
  135. num_comps_to_plot = 15
  136. custom_cmap = LinearSegmentedColormap.from_list("dark_bwr", ["#002147", "white", "#800000"]) # Dark navy blue → White → Maroon
  137. img = plt.imshow(corr_matrix[:num_comps_to_plot, :num_comps_to_plot], cmap = custom_cmap, vmin = -1, vmax = 1)
  138. ind_to_plot = []
  139. for k in range(len(sig_ind[0])):
  140. if sig_ind[0][k] < num_comps_to_plot and sig_ind[1][k] < num_comps_to_plot:
  141. ind_to_plot.append(k)
  142. plt.scatter(sig_ind[1][ind_to_plot], sig_ind[0][ind_to_plot], color='k', marker='*')
  143. plt.xticks([0, 4, 9, 14], [1, 5, 10, 15], fontsize = fontsize)
  144. plt.yticks([0, 4, 9, 14], [1, 5, 10, 15], fontsize = fontsize)
  145. plt.xlabel('dPCA component', fontsize = fontsize)
  146. plt.ylabel('dPCA component', fontsize = fontsize)
  147. cbar = fig.colorbar(img, fraction=0.046, pad=0.04)
  148. cbar.outline.set_visible(False)
  149. cbar.ax.tick_params(labelsize=fontsize)
  150. cbar.set_ticks([-1, 0, 1])
  151. cbar.ax.set_title('Similarity', fontsize=fontsize)
  152. for pos in ['right', 'top', 'left', 'bottom']:
  153. plt.gca().spines[pos].set_visible(False)
  154. fig.tight_layout()
  155. # plt.show()
  156. # save figure
  157. plt.savefig(f'{args.savepath_fig}{args.participant}_dpca_correlation_matrix_{formatted_datetime}_{args.nbins_before_onset}_{args.nbins_after_onset}.png', format='png')
  158. return
  159. if __name__ == "__main__":
  160. current_datetime = datetime.now()
  161. formatted_datetime = current_datetime.strftime("%Y%m%d_%H%M%S")
  162. parser = argparse.ArgumentParser()
  163. parser.add_argument('--participant', type=str, default=None, help='participant id')
  164. parser.add_argument('--session', type=str, default=None, help = 'session id')
  165. parser.add_argument('--nbins_before_onset', type=int, default = None, help = 'number of bins before speech onset')
  166. parser.add_argument('--nbins_after_onset', type=int, default = None, help = 'number of bins after speech onset')
  167. parser.add_argument('--savepath_data', type=str, default='../figures_data/', help = 'path to save processed data from this script')
  168. parser.add_argument('--savepath_fig', type=str, default='../figures/', help = 'path to save figures from this script')
  169. args = parser.parse_args()
  170. if not os.path.exists(args.savepath_fig):
  171. os.makedirs(args.savepath_fig, exist_ok=True)
  172. if args.participant in 't15':
  173. n_channels = 256
  174. elif args.participant == 't16':
  175. n_channels = 128
  176. time = {
  177. 't15': np.arange(-args.nbins_before_onset/100, args.nbins_after_onset/100, 0.01),
  178. 't16': np.arange(-args.nbins_before_onset/100, args.nbins_after_onset/100, 0.01),
  179. }
  180. print('Running plot_dPCA_results.py')
  181. print(args)
  182. # # load projections
  183. print('Loading projections, which marginals, explained variance...')
  184. projections = scipy.io.loadmat(f'{args.savepath_data}{args.participant}_{args.nbins_before_onset}_{args.nbins_after_onset}_avg_firingrates_projections.mat')
  185. projections = projections['ProjectionAverage']
  186. # load which margins the projections belong to
  187. which_marg = scipy.io.loadmat(f'{args.savepath_data}{args.participant}_{args.nbins_before_onset}_{args.nbins_after_onset}_which_marg.mat')
  188. which_marg = which_marg['whichMarg'] - 1 # subtract 1 as matlab indices are 1-indexed
  189. # # load explained variance by components
  190. explained_var = scipy.io.loadmat(f'{args.savepath_data}{args.participant}_{args.nbins_before_onset}_{args.nbins_after_onset}_explained_var.mat')
  191. explained_var = explained_var['margVar']
  192. # # plot projections
  193. print('Plotting projections...')
  194. plot_projections(projections, which_marg, explained_var)
  195. # # plot explained variance piechart and bar plot
  196. print('Plotting explained variance...')
  197. plot_explained_variance(explained_var)
  198. # load correlation, decoder dot product, kendall p-value
  199. print('Loading correlation, decoder dot product, kendall p-value matrices...')
  200. correlation = scipy.io.loadmat(f'{args.savepath_data}{args.participant}_{args.nbins_before_onset}_{args.nbins_after_onset}_correlations.mat')
  201. correlation = correlation['a']
  202. decoder_dot_product = scipy.io.loadmat(f'{args.savepath_data}{args.participant}_{args.nbins_before_onset}_{args.nbins_after_onset}_decoder_matrix_dot_product.mat')
  203. decoder_dot_product = decoder_dot_product['b']
  204. pval = scipy.io.loadmat(f'{args.savepath_data}{args.participant}_{args.nbins_before_onset}_{args.nbins_after_onset}_kendall_pvalue.mat')
  205. pval = pval['psp']
  206. map_matrix = np.tril(correlation, -1) + np.triu(decoder_dot_product) #lower triangle is correlation, upper triangle is decoder dot product
  207. # components with significant difference in dot product
  208. indices = np.where((abs(np.triu(decoder_dot_product, 1)) > 3.3 / np.sqrt(n_channels)) & (pval < 0.001))
  209. # plot correlation matrix
  210. print('Plotting correlation matrix...')
  211. plot_correlation(map_matrix, indices)
  212. # check how many pairs of of components in the dot product belong to word-loudness and how many are significantly orthogonal
  213. which_marg_word = np.where(which_marg.squeeze() == marg_names.index('Word'))[0]
  214. which_marg_loudness = np.where(which_marg.squeeze() == marg_names.index('Loudness'))[0]
  215. print('Word component indices:', which_marg_word)
  216. print('Loudness component indices:', which_marg_loudness)
  217. n_word_loudness_axis_pairs = len(which_marg_word) * len(which_marg_loudness)
  218. print(f'Number of word-loudness axis pairs: {n_word_loudness_axis_pairs}')
  219. # pairwise cosine similarity between top-X loudness dPCs and word dPCS
  220. n_top_dpcs = 5
  221. abs_dpc_cosine_sim = []
  222. for i in range(n_top_dpcs):
  223. word_dpc_ind = which_marg_word[i]
  224. loud_dpc_ind = which_marg_loudness[i]
  225. abs_dpc_cosine_sim.append(abs(decoder_dot_product[word_dpc_ind, loud_dpc_ind]))
  226. print(f'Mean cosine similarity top {n_top_dpcs}:', np.mean(abs_dpc_cosine_sim))
  227. print(f'Std dev cosine similarity top {n_top_dpcs}:', np.std(abs_dpc_cosine_sim))
  228. print('DONE!')

dpca.py at commit 4f73ec4, under CC-BY-NC-SA-4.0 · at the source

Overview

Authors: Aparna Srinivasan1,2, Maitreyee Wairagkar1, Carrina Iacobacci1, Xianda Hou1,3, Nicholas S Card1, Brandon G Jacques4, Anna L Pritchard4, Payton H Bechefsky4, Leigh R Hochberg5,6,7, Nicholas AuYong4,8,9, Chethan Pandarinath4,8, David M Brandman1, Sergey D Stavisky1
  1. Department of Neurological Surgery, University of California Davis, Davis, CA USA
  2. Biomedical Engineering Graduate Group, University of California Davis, Davis, CA USA
  3. Computer Science Graduate Group, University of California Davis, Davis, CA USA
  4. Wallace H. Coulter Department of Biomedical Engineering, Emory University and Georgia Institute of Technology, Atlanta, GA USA
  5. Center for Neurotechnology and Neurorecovery, Department of Neurology, Massachusetts General Hospital, Harvard Medical School, Boston, MA USA
  6. Veterans Affairs Rehabilitation Research & Development Center for Neurorestoration and Neurotechnology, Providence VA Medical Center, Providence, RI USA
  7. Robert J. & Nancy D. Carney Institute for Brain Science and School of Engineering, Brown University, Providence, RI USA
  8. Department of Neurosurgery, Emory University, Atlanta, GA USA
  9. Department of Cell Biology, Emory University, Atlanta, GA USA
Institutions: University of California, Davis (United States); Georgia Institute of Technology (United States); Emory University (United States); The Wallace H. Coulter Department of Biomedical Engineering (United States); Harvard University (United States); Brown University (United States); Providence VA Medical Center (United States); Massachusetts General Hospital (United States)
Journal: Nature communications, volume 17, issue 1, article 5301
Dates: received 27 May 2025; accepted 16 March 2026; published online 15 April 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1038/s41467-026-71284-4 · PMID 41986329 · PMCID PMC13270037 · OpenAlex W4410926537
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: human (organism), cognitive (subfield)
Methods: Spectral & time-frequency, Connectivity, Statistics, Smoothing, state filtering, decompositions, Machine learning, Single-unit activity, calcium imaging
Keywords: Brain-machine interface, Premotor cortex, Motor cortex, Neural decoding
MeSH: Frontal Lobe*, Loudness Perception*, Speech*, Speech Perception*, Adult, Electrodes, Implanted, Female, Humans, Male, Microelectrodes, Neurons (* major topic)
Topic: Neural dynamics and brain function (Cognitive Neuroscience, Neuroscience), according to OpenAlex
Funding: NIDCD NIH HHS (DP2 DC021055)
Citations: cited by 4 papers (Europe PMC); 44 references in the paper

Abstract

The ability to vary the mode and loudness of speech is an important part of the expressive range of human vocal communication. However, the encoding of these behaviors in the ventral precentral gyrus (vPCG) has not been studied at the resolution of neuronal firing rates. We investigated this in two participants who had intracortical microelectrode arrays implanted in their vPCG as part of a speech neuroprosthesis clinical trial. Neuronal firing rates modulated strongly in vPCG as a function of attempted mimed, whispered, normal or loud speech. At the neural ensemble level, mode/loudness and phonemic content were encoded in distinct neural subspaces. Attempted mode/loudness could be decoded from vPCG with 94% and 89% accuracy for the two participants, and corresponding neural preparatory activity at 640 ms and 270 ms before speech onset enabled 80% decoding accuracy, respectively. We then developed a closed-loop loudness decoder that achieved 94% online accuracy in modulating a brain-to-text speech neuroprosthesis output based on attempted loudness. These findings demonstrate the feasibility of decoding mode and loudness from vPCG, paving the way for speech neuroprostheses capable of synthesizing more expressive speech.

Reproduced under the paper's license (CC BY), from the paper cited above.

Repository

Its files are read in the Code ↔ Paper reader above, with 13 matches between paragraphs and lines of code.

Neuroprosthetics-Lab/srinivasan-speech-modes

License: CC-BY-NC-SA-4.0
State: the link answers, verified on 29 September 2026
Evidence: files inventoried
Commit: 4f73ec463ffe5a52366aab3257729976a8594fa3, 3 April 2026
Languages: Python (19)
Size: 131 files, 19 scripts
Software Heritage: not archived
Found in: “Code availability”
Holds: README, license file
Not found: CITATION.cff, environment file, tests, continuous integration, documentation
Tools: Matplotlib (19 files), NumPy (19 files), SciPy (11 files), scikit-learn (4 files), seaborn (4 files), pandas (2 files), MNE-Python (1 file)
Availability: 1 check, the latest on 29 September 2026: the link answers
  • 29 September 2026: the link answers
21 files

Code availability

Code to implement the analyses described in this study is publicly available on GitHub (https://github.com/Neuroprosthetics-Lab/srinivasan-speech-modes).

Reproduced under the paper's license (CC BY), from the paper cited above.

Tracing map

Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.

What the map holds:

  • 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 19 scripts, each with its path and the digest of its content;
  • 13 matches between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.

Data

Datasets cited

Data availability

De-identified neural data reported in this study are publicly available on Dryad (10.5061/dryad.2547d7x5w)44. Source data are provided with this paper.

Reproduced under the paper's license (CC BY), from the paper cited above.

Versions

The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.

Version 1, 29 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 13 authors, 4 keywords, 11 MeSH terms, 1 funder, 39 references.

Cite

This paper

Srinivasan, A., Wairagkar, M., Iacobacci, C., Hou, X., Card, N. S., Jacques, B. G., Pritchard, A. L., Bechefsky, P. H., Hochberg, L. R., AuYong, N., Pandarinath, C., Brandman, D. M., & Stavisky, S. D. (2026). Encoding of speech modes and loudness in ventral precentral gyrus. Nature communications, 17(1), 5301. https://doi.org/10.1038/s41467-026-71284-4

BibTeX

@article{srinivasan2026encoding,
author = {Srinivasan, Aparna and Wairagkar, Maitreyee and Iacobacci, Carrina and Hou, Xianda and Card, Nicholas S and Jacques, Brandon G and Pritchard, Anna L and Bechefsky, Payton H and Hochberg, Leigh R and AuYong, Nicholas and Pandarinath, Chethan and Brandman, David M and Stavisky, Sergey D},
title = {{Encoding of speech modes and loudness in ventral precentral gyrus}},
journal = {Nature communications},
year = {2026},
month = apr,
volume = {17},
number = {1},
pages = {5301},
publisher = {Nature Publishing Group},
issn = {2041-1723},
doi = {10.1038/s41467-026-71284-4},
url = {https://doi.org/10.1038/s41467-026-71284-4},
pmid = {41986329},
pmcid = {PMC13270037}
}

RIS

TY - JOUR
AU - Srinivasan, Aparna
AU - Wairagkar, Maitreyee
AU - Iacobacci, Carrina
AU - Hou, Xianda
AU - Card, Nicholas S
AU - Jacques, Brandon G
AU - Pritchard, Anna L
AU - Bechefsky, Payton H
AU - Hochberg, Leigh R
AU - AuYong, Nicholas
AU - Pandarinath, Chethan
AU - Brandman, David M
AU - Stavisky, Sergey D
TI - Encoding of speech modes and loudness in ventral precentral gyrus
T2 - Nature communications
J2 - Nat Commun
PY - 2026
DA - 2026/04/15
VL - 17
IS - 1
SP - 5301
SN - 2041-1723
PB - Nature Publishing Group
DO - 10.1038/s41467-026-71284-4
UR - https://doi.org/10.1038/s41467-026-71284-4
LA - en
ER -

CSL-JSON

{
"id": "10.1038/s41467-026-71284-4",
"type": "article-journal",
"title": "Encoding of speech modes and loudness in ventral precentral gyrus",
"container-title": "Nature communications",
"author": [
{
"family": "Srinivasan",
"given": "Aparna"
},
{
"family": "Wairagkar",
"given": "Maitreyee"
},
{
"family": "Iacobacci",
"given": "Carrina"
},
{
"family": "Hou",
"given": "Xianda"
},
{
"family": "Card",
"given": "Nicholas S"
},
{
"family": "Jacques",
"given": "Brandon G"
},
{
"family": "Pritchard",
"given": "Anna L"
},
{
"family": "Bechefsky",
"given": "Payton H"
},
{
"family": "Hochberg",
"given": "Leigh R"
},
{
"family": "AuYong",
"given": "Nicholas"
},
{
"family": "Pandarinath",
"given": "Chethan"
},
{
"family": "Brandman",
"given": "David M"
},
{
"family": "Stavisky",
"given": "Sergey D"
}
],
"container-title-short": "Nat Commun",
"volume": "17",
"issue": "1",
"page": "5301",
"DOI": "10.1038/s41467-026-71284-4",
"PMID": "41986329",
"PMCID": "PMC13270037",
"ISSN": "2041-1723",
"publisher": "Nature Publishing Group",
"URL": "https://doi.org/10.1038/s41467-026-71284-4",
"language": "en",
"issued": {
"date-parts": [
[
2026,
4,
15
]
]
}
}

The tracing map gets a citation of its own once an author has validated it and it has a DOI.

Similar papers

The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.

[1] doi:10.1038/s41591-026-04414-6 [code]
Long-term independent use of an intracortical brain-computer interface for speech and cursor control.
Journal: Nature medicine
In common: pandas, SciPy, Matplotlib, 1 other tool, cognitive, 8 references, 6 authors
[2] doi:10.1038/s41586-026-10653-x [code]
A mosaic of whole-body representations on the human precentral gyrus.
Journal: Nature
In common: scikit-learn, SciPy, Matplotlib, 1 other tool, 5 references, 7 authors
[3] doi:10.1038/s41467-026-75455-1 [code]
Shared latent representations of speech production for cross-patient speech decoding.
Journal: Nature communications
In common: seaborn, scikit-learn, pandas, 3 other tools, cognitive, 7 references
[4] doi:10.1007/s12021-026-09807-z [code]
Optimal Size of Electrocorticography Grids for Classification of Hand Movements.
Journal: Neuroinformatics
In common: seaborn, scikit-learn, pandas, 3 other tools, 5 references
[5] doi:10.1073/pnas.2536563123 [code]
Temporally structured motor and auditory representations in covert syllable production.
Journal: Proceedings of the National Academy of Sciences of the United States of America
In common: MNE-Python, scikit-learn, pandas, 3 other tools, cognitive, 4 references
[6] doi:10.1038/s41586-026-10691-5 [code]
Mapping the neuronal building blocks of human language with language models.
Journal: Nature
In common: scikit-learn, pandas, SciPy, 2 other tools, cognitive, 5 references
[7] doi:10.7554/elife.109400 [code]
High-fidelity neural speech reconstruction through an efficient acoustic-linguistic dual-pathway framework.
Journal: eLife
In common: SciPy, Matplotlib, NumPy, cognitive, 5 references
[8] doi:10.1038/s41467-026-75745-8 [code]
A language network in the individualized functional connectomes of 1199 human brains doing arbitrary tasks.
Journal: Nature communications
In common: seaborn, scikit-learn, pandas, 3 other tools, cognitive, 3 references
[9] doi:10.1186/s12911-026-03552-8
Artificial intelligence for brain-to-speech decoding in paralysis: a systematic review.
Journal: BMC medical informatics and decision making
In common: cognitive, 5 references
[10] doi:10.1038/s41467-026-75240-0 [code]
Dynamic acoustic-to-categorical representations of phonemes and prosody along ventral and dorsal speech streams.
Journal: Nature communications
In common: MNE-Python, seaborn, scikit-learn, 4 other tools, cognitive, 1 reference

Contribute

The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.

Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.

Request its removal

To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).

Discussion, reproductions, activity

Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.

Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.

Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.